はじめに
最近npmサプライチェーン攻撃で「Shai-Hulud」という名前を見かけるようになりましたが、どういうものかわかっていなかったのでまとめました。
Shai-Huludとは
Shai-Hulud は、npm サプライチェーン攻撃の仕組みを表現した架空のマルウェアです。その特徴は、侵害されたアカウント(npm認証情報)を悪用して複数のパッケージを次々と改竄し、攻撃を自動拡大させる点にあります。以下は、このマルウェアの想定される動作メカニズムです。
1. 感染経路:npmパッケージの改竄
攻撃者は、npmパッケージのメンテナーのアカウントを侵害するか、悪意のあるパッケージを作成します。この悪意のあるコードは、パッケージがnpm installされた際に自動実行されるスクリプト内に仕込まれています。具体的には以下のスクリプトフックが悪用されます:
-
postinstall:最も一般的で、パッケージインストール完了後に実行される -
preinstall:インストール前に実行される -
install:インストール中に実行される
これらのスクリプト実行は npm install --ignore-scripts で無視することが可能です。
2. 認証情報(シークレット)の窃取
感染したコードが実行されると、ローカル環境から認証情報やシークレット情報を積極的に探して窃取します。
-
~/.aws/credentialsにあるAWSアクセスキー - GitHubトークンやその他のAPIキー
- npm認証情報
3. 自動拡大フェーズ(連鎖感染)
盗取したnpm認証情報を使って、攻撃者は以下の動作で攻撃を自動拡大させます。
- 管理パッケージのリスト取得: 侵害したメンテナーが管理するすべてのnpmパッケージのリストを取得する。
- 人気パッケージの選定: リストされたパッケージの中から、ダウンロード数の多いものなど、影響力の大きいパッケージを標的に選定する。
-
悪意あるコードの挿入: 選定されたパッケージのコードに、自身の悪意のあるペイロード(例:
bundle.js)を挿入し、package.jsonのpostinstallスクリプトを改ざんしてこのコードが実行されるようにします。 - 改ざん版の公開: 改竄されたパッケージを新しいバージョンとしてnpmレジストリに公開する。
これにより、別の開発者がこの新しい悪意のあるパッケージバージョンをインストールすると、自動でスクリプトが実行され、その環境の認証情報が盗まれ、さらに別のパッケージが改竄される、という連鎖が発生します。
4. GitHubリポジトリへの影響
窃取した認証情報を使用して、侵害されたユーザーがアクセスできるプライベートGitHubリポジトリをリストアップし、その内容をコピーした新しいパブリックリポジトリ(例:original-repo-name-migrationというサフィックス付き)を作成して、データを公開流出させるという深刻な被害まで及びます。
開発者が取るべき具体的な対策
1. 認証情報に関する対策
-
長期認証情報の排除: AWSアクセスキーやシークレットキー、GitHub Personal Access Tokenなどの長期認証情報をローカル環境の平文で保管することを避ける。
- IAMロールや短期クレデンシャル、OpenID Connect (OIDC) などの仕組みを利用し、認証情報を必要最小限の期間・範囲に限定する。
- 認証情報の定期的なローテーション(変更) を実施する。
2. npm/Node.js環境のセキュリティ対策
-
package-lock.json/yarn.lockの活用:-
lockファイルをコミットし、新しいパッケージをインストールする際も常にlockファイルの内容でバージョンを固定する運用を強制する。これにより、マルウェア化された新しいバージョンが意図せずインストールされるリスクを減らすことができる。
-
-
スクリプト実行の制御:
- パッケージインストール時に
npm install --ignore-scriptsオプションを使用して、スクリプトの自動実行を防ぐ。 - CI/CDパイプラインなどの信頼できる環境でのみスクリプト実行を許可する。
- パッケージインストール時に
まとめ
Shai-Huludだけでなく、他にもいろんなセキュリティ問題があると思うのでどういうものかを理解した上で気をつけていきたいです。