AI Session Notes - 2026-03-31
サプライチェーン攻撃の概要と対策
学んだこと
- サプライチェーン攻撃とは、信頼している外部の依存関係(ライブラリ、ツール等)を侵害して間接的にターゲットを攻撃する手法
- 攻撃者はメンテナーのアカウント乗っ取りや悪意ある依存パッケージの注入など、信頼の連鎖を悪用する
- 人気パッケージほど影響範囲が巨大になるため、トップパッケージが狙われやすい
詳細
実際の攻撃パターン(axios 2026-03-31 の事例)
- メンテナーの npm アカウントを侵害し、悪意あるバージョンを公開
- axios 本体のコードは変更せず、隠し依存パッケージ(
postinstall フック付き)を追加
npm install 実行時に自動でマルウェアが実行され、OS 別の RAT(リモートアクセストロイ)を配布
- マルウェアは自己削除して痕跡を消去するなど、高度な検知回避を行う
- 正規リリースは GitHub OIDC Trusted Publisher を使用しており、手動公開との差異が検知の手がかりになった
有名な過去の事例
- event-stream (2018): メンテナー権限を譲り受けた攻撃者が暗号通貨ウォレットを狙うコードを注入
- SolarWinds (2020): ビルドシステムを侵害し、正規アップデートにバックドアを仕込んだ。18,000以上の組織に影響
- codecov (2021): CI ツールを改ざんし、環境変数(認証情報等)を外部に送信
npm の依存管理とサプライチェーン攻撃の防御
学んだこと
- ロックファイル(
package-lock.json)+ npm ci を使えば、意図しないバージョン更新を防げる
npm install はロックファイルがあっても semver 範囲内で新しいバージョンに更新される場合がある
npm ci は「Clean Install」の略で、ロックファイルを基準に依存をそのまま再現する
npm install は package.json を基準に依存を解決し、ロックファイルを更新することがある
詳細
攻撃が発動するタイミング
| 状況 |
リスク |
ロックファイルあり + npm ci |
ほぼ安全。依存の追加・更新時のみ注意 |
ロックファイルあり + npm install |
semver 範囲内で意図せず更新される可能性あり |
| ロックファイルなし |
npm install のたびに最新版が入るので危険 |
対策まとめ
- CI/CD では
npm ci --ignore-scripts を使い、postinstall スクリプトの自動実行を防ぐ
- 依存パッケージのバージョンをピン留め(
^ や ~ を外して完全固定)する
npm audit や Dependabot で脆弱性を定期的にチェックする
- ロックファイルは必ずリポジトリにコミットする
gh CLI で全リポジトリの依存を一括チェックする方法
学んだこと
gh api repos/{owner}/{repo}/contents/{path} で GitHub 上のファイル内容を Base64 エンコードで取得できる
gh repo list と組み合わせることで、全リポジトリの package.json や package-lock.json を一括チェックできる
- ローカルリポジトリは
node_modules 内の package.json から実際にインストールされたバージョンを確認できる
詳細
# リモートリポジトリの package.json を取得して特定パッケージを検索
for repo in $(gh repo list {owner} --limit 100 --json name --jq '.[].name'); do
content=$(gh api "repos/{owner}/$repo/contents/package.json" --jq '.content' 2>/dev/null)
if [ -n "$content" ] && [ "$content" != "null" ]; then
decoded=$(echo "$content" | base64 -d 2>/dev/null)
if echo "$decoded" | grep -q "target-package"; then
echo "Found in $repo"
fi
fi
done
参考リンク
メタ情報
- ツール: Claude Code
- 関連技術: npm, Node.js, セキュリティ, サプライチェーン攻撃, gh CLI