オープンソースの依存関係は現代のソフトウェアの基盤ですが、同時に主要な攻撃対象領域でもあります。悪意のあるアクターは、依存関係がインストールされた瞬間に実行されるマルウェアを注入するため、パッケージレジストリや開発ワークフローを標的とすることが増えています。この記事では、これらのサプライチェーンマルウェアキャンペーンがどのように機能するか、従来のスキャナーがそれらを見逃す理由、そして今日から適用できる実践的な防御策について説明します。
脅威の状況:サプライチェーンが好ましい標的となる理由
国家支援型グループを含む脅威アクターは、オープンソースエコシステムを積極的に悪用しています。攻撃は、侵害されたメンテナーアカウントから、レジストリ全体に自己増殖する自動化されたワームまで多岐にわたります。その影響は、パッケージがどれほど広く再利用されているかによって増幅されます。単一の侵害されたモジュールが、プロジェクトや組織全体で数百万回、あるいは数十億回ダウンロードされる可能性があります。
攻撃者はどのようにマルウェアを注入しますか?
攻撃者がビルドに悪意のあるコードを侵入させるために使用するいくつかの一般的な手法があります。これらのパターンを理解することで、それらを検出し、ブロックしやすくなります。
- アカウント乗っ取り — 攻撃者は、メンテナーをフィッシングしたり、npmやPyPIのようなレジストリの開発者トークンを盗んだりして、マルウェアを信頼されたパッケージに公開します。そのパッケージがインストールされると、すべての利用者が悪意のあるコードを取り込みます。
- タイポスクワッティング — 攻撃者は、人気のあるモジュールと非常によく似た名前のパッケージを公開します(例:CCTVX対CCXT)。インストール時の単純なタイプミスが、正規のパッケージではなく悪意のあるパッケージを取得することにつながる可能性があります。
- 依存関係の混乱 — 内部パッケージ名がプライベートレジストリに厳密にスコープされていない場合、パッケージマネージャーは同じ名前の公開パッケージを優先する可能性があります。攻撃者は、内部依存関係を上書きする公開パッケージを公開します。
- ハルシネーション・スクワッティング — 大規模言語モデルは、存在しない依存関係を生成することがあります。攻撃者は、LLMがハルシネーションを起こしやすい内容を発見し、それらの架空のパッケージを公開し、生成されたコードをプロジェクトにコピーする犠牲者を待ちます。

その広範な影響を示す具体的な事例
広く使用されているパッケージが侵害され、エコシステム全体に大規模な露出をもたらした注目度の高いインシデントが発生しています。他のケースでは、自己増殖型ワームが開発者トークンを盗み、感染をより多くのパッケージに自動的にプッシュし、単一の侵害を拡大するキャンペーンに変えました。

マルウェアが一般的な脆弱性よりも深刻である理由
発見され、エクスプロイトされる必要がある脆弱性とは異なり、マルウェアは意図的に動作するように作成されています。多くの悪意のあるパッケージには、依存関係がインストールされるとすぐに実行されるプリインストールスクリプトまたはポストインストールスクリプトが含まれています。一般的な悪意のある動作には以下が含まれます:
- データを外部に持ち出したり、コマンドを受信したりするために、コマンド&コントロール(C2)サーバーに接続すること
- ビルドシステム上でのバックドアのインストール、あるいはリモートコード実行の取得
- パッケージメンテナーのトークンを盗み、レジストリ全体に伝播させる
規模:毎月数千の悪意のあるパッケージ
レジストリ内のマルウェアは珍しくありません。レジストリを監視する研究チームは、毎月数千もの悪意のあるパッケージを発見しています。そのほとんどは、削除されるまで数時間しか存在しないため、検出は迅速かつ継続的である必要があります。

マルウェアをリアルタイムで検出します。
悪意のあるリリースは非常に短い時間しか存在しない可能性があるため、検出ツールはほぼリアルタイムで動作し、開発者のワークフローと統合する必要があります。次の2つの主要な機能が不可欠です。
- リアルタイム脅威インテリジェンス — 継続的に更新される悪意のあるパッケージのデータベースにより、インストールを最新の指標と照合してチェックできます。
- インストーラーレベルのチェック — 開発者のワークフローを妨げることなく、パッケージがインストールされる前に検証を行う、パッケージマネージャーを囲む小型で摩擦の少ないラッパーです。

インストールパスに存在するツール(例えば、npm、yarn、またはpipのインストールをラップするもの)は、ビルドや開発者のマシンに到達する前にマルウェアをブロックできるため、特に効果的です。
脅威インテリジェンスシステムがどのように悪意のあるパッケージを検出するか
サプライチェーンマルウェアの検出は、各インジケーターが無害である可能性もあるため困難です。疑わしいインジケーターの例としては、大量のbase64難読化、不審なドメインへのアウトバウンドコール、コードに埋め込まれた不可視のUnicode文字などが挙げられます。これらのいずれかのフラグも正当である可能性があります。
ノイズを真の脅威から分離するために、最新のフィードは多層的なアプローチを使用します。
- 新しく公開されたパッケージ全体で、数百の指標に対する自動スキャン。
- 悪意の確率スコアを割り当てるために、インジケーターシグナルを組み合わせるAIまたはMLモデル。
- 中リスクのケースでは人間によるレビュー、高信頼性の検出に対しては自動的な削除またはブロックを行います。
今日デプロイできる実用的なコントロール
サプライチェーンマルウェアによるリスクを軽減するために、開発チームとセキュリティチームが講じるべき具体的なステップは以下の通りです。
- 内部パッケージに対するスコープ付き/プライベートレジストリの強制 — 内部パッケージ名が公開パッケージと混同されないようにし、内部の依存関係には常にプライベートレジストリを優先するようにパッケージマネージャーを設定してください。
- インストールコマンドのラップ — パッケージのインストールを許可する前に、CIおよび開発者のマシンに、ライブの脅威フィードを照会するインストール時チェックを追加します。
- 開発者アカウントの強化 — レジストリアカウントに多要素認証を義務付け、トークンを定期的に更新し、不審なログインを監視します。
- 新規公開パッケージへの依存を減らす — CIでの直接インストールに対して最小パッケージ経過期間を要求するポリシーを検討し、同日公開の悪意のあるリリースによる影響を制限します。
- 脅威インテリジェンスのパイプラインへの統合 — リアルタイムの悪意のあるパッケージリストをCI/CD、依存関係スキャナー、IDEツールに供給し、リスクのあるパッケージを早期にブロックします。
- AIのハルシネーションへの対策 — コード生成ツールによって提案された依存関係は、検証されるまで信頼できないものとして扱います。生成されたパッケージ名をマニフェストに盲目的にコピーすることは避けてください。
まとめ
サプライチェーンマルウェアは、活発で進化し続ける脅威です。これは、人的エラー(フィッシング、誤植)と自動化(レジストリの動作、LLMのハルシネーション)の両方をエクスプロイトします。これに対抗するには、リアルタイムの脅威インテリジェンス、通常開発者ワークフローに統合されるツール、そしてスコープ付きレジストリやメンテナー向けのMFAのような基本的な衛生管理が必要です。
悪意のあるパッケージが実行される前に検出してブロックすることは、コードベースだけでなく、より広範なオープンソースエコシステムも保護します。検出を高速化し、インストールに統合し、すべての新しい依存関係を検証されるまで信頼できないものとして扱います。
「サプライチェーン内のマルウェアは即座に作用します。防御策はより迅速に対応する必要があります。」

