サプライチェーン攻撃について
「サプライチェーン攻撃」とは、ソフトウェアの部品(ライブラリ)を乗っ取って、そこに悪意あるコードを混ぜ込む攻撃手法。 自分のコードに問題がなくても、使っているライブラリが汚染されていれば被害を受ける。 スーパーで買った弁当に、工場の段階で毒を入れられるようなイメージ。
今回の攻撃の概要
- https://zenn.dev/gunta/articles/0152eadf05d173
- https://zenn.dev/rescuenow/articles/880bf865235aaf
- axios ソフトウェアサプライチェーン攻撃の概要と対応指針
何が起きた?
npmで週間1億DL超のHTTPクライアント「axios」のメンテナーのnpmアカウントが乗っ取られ、マルウェア入りのバージョンが公開された。
| 項目 | 内容 |
|---|---|
| 危険なバージョン | axios@1.14.1, axios@0.30.4 |
| 安全なバージョン | axios@1.14.0, axios@0.30.3 |
| マルウェアの種類 | RAT(遠隔操作型トロイの木馬) |
| 露出時間 | 約2〜3時間(その後npmが削除) |
攻撃の手口
- 攻撃者がメンテナーの npm アカウントを乗っ取り
- 事前に
plain-crypto-js@4.2.1という偽パッケージを公開 - axios の
package.jsonにplain-crypto-jsを依存として追加した悪意あるバージョンを npm CLI から直接パブリッシュ(GitHub の CI/CD を完全にバイパス) npm installするとplain-crypto-jsのpostinstallスクリプトが自動実行され、OS ごとにRATをダウンロード・配置
ポイントは axios 自体のソースコードには悪意あるコードが一切ない こと。依存パッケージの postinstall だけで攻撃が成立する巧妙な手口。
今すぐやること
# 影響確認: axiosのバージョンチェック
npm list axios
# plain-crypto-jsが存在しないか確認
npm list plain-crypto-js
感染していたら → マシンを隔離し、全シークレット・APIキーをローテーション。安全なバージョンに固定してクリーンインストール。
{
"dependencies": { "axios": "1.14.0" },
"overrides": { "axios": "1.14.0" }
}
サプライチェーン攻撃から身を守るために最低限設定しておきたいこと
参考: https://zenn.dev/dely_jp/articles/supply-chain-kowai
2026年3月だけで Trivy → LiteLLM → axios と立て続けにサプライチェーン攻撃が発生。しかし、パッケージマネージャの設定ひとつで防げるケースが多い。調査によると直近の攻撃10件中8件は公開から1週間以内に検出・削除されている。
対策1: クールダウン(min-release-age)
公開から一定期間が経過するまでインストールを保留する仕組み。悪意あるバージョンが検出・削除されるまでの「時間差」を利用して自動的にブロックできる。
# .npmrc(npm 11.10+)
min-release-age=7
pnpm, Yarn, Bun, uv でも同等の設定がある。Dependabot や Renovate にも cooldown / minimumReleaseAge 設定がある。
対策2: ロックファイルの厳密な運用
CI/CDでは npm install ではなく npm ci を使う。
package.json に "axios": "^1.14.0" と書いてある場合、npm install は「^ の範囲で最新を取ってOK」と判断して、npm レジストリに問い合わせて 1.14.1(悪意あるバージョン)を取得してしまう可能性がある。一方 npm ci は lockfile に書いてあるバージョンだけをそのままインストール し、矛盾があればエラーで止まる。レジストリに「最新は何?」とは聞かない。
| コマンド | 動き | 今回の攻撃に対して |
|---|---|---|
npm install | lockfile を更新して最新を取ることがある | 1.14.1(悪意あり)を取得する可能性あり |
npm ci | lockfile の通りにしかインストールしない | 1.14.0(安全)のまま |
npm ci # npm
pnpm install --frozen-lockfile # pnpm
bun install --frozen-lockfile # Bun
対策3: postinstall スクリプトの無効化
今回の攻撃は postinstall の自動実行がトリガー。デフォルトで無効化しておくのが安全。
# .npmrc
ignore-scripts=true
pnpm v10 と Bun はデフォルトでブロック済み。必要なパッケージだけ許可リストに追加する方式。
対策4: GitHub ActionsのSHA pinning
タグ指定(@v4)だとタグの上書きで別のコードが実行される恐れがある。コミットハッシュで固定する。
# タグ指定(危険)
- uses: actions/checkout@v4
# SHA pinning(安全)
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
pinact を使えば自動変換できる。
対策5: Dependency Review Action
PRで追加・変更される依存関係をスキャンし、脆弱なパッケージが含まれていたらCIを失敗させる。マージ前にブロックできるのがポイント。