技術 約7分で読めます

CloudflareがClient-Side SecurityのGNN+LLM検出を全ユーザーに開放、誤検知を200分の1に削減

Cloudflareが3月30日、Client-Side Security(旧Page Shield)の検出エンジンをグラフニューラルネットワーク(GNN)とLLMの2段カスケード構成に刷新し、従来エンタープライズ営業経由でしか買えなかったAdvanced機能をセルフサーブ顧客にも開放した。あわせて、ドメインベースの脅威インテリジェンスは無料プランを含む全ユーザーに無償提供される。

Client-Side Securityが防ぐもの

Webサイトに埋め込まれたサードパーティJavaScriptは、ページの見た目を壊さずに裏で悪事を働ける。決済フォームからカード情報を抜くMagecartスキミング、npmパッケージ経由で混入するサプライチェーン攻撃、ブラウザ上で動作するキーロガーなど、サーバーサイドのWAFでは検知できない脅威がここにある。

Client-Side Securityは、ブラウザのContent Security Policy(CSP)レポーティング機構を利用してスクリプトの実行状況を収集する。アプリケーション側にスキャナーやエージェントを仕込む必要がなく、レイテンシへの影響もゼロだ。日次で35億スクリプト(秒間4万スクリプト)を評価しており、エンタープライズゾーンでは平均2,200本、中小規模のゾーンでも約1,000本のスクリプトを監視している。そして30日間で約3分の1のスクリプトがコード更新される。

GNN単体の限界

従来の検出はGNN単体で動いていた。GNNはJavaScriptのAST(抽象構文木)をtree-sitterでパースし、グラフ構造として学習する。変数名のリネーム、ミニファイ、難読化を施されてもコードの構造的パターンは残るため、シグネチャマッチングでは見逃す未知の脅威を検出できる仕組みだ。

具体的には、メッセージパッシング型のグラフ畳み込みネットワーク(MPGCN)がASTのノード間で情報を伝播させ、最終的にbenign(無害)、Magecart、クリプトマイニング、マルウェアの4クラスに分類する。マクロ精度と悪性検出の適合率はテストデータで99%近くに達していた。

問題は誤検知だった。全トラフィックに対する偽陽性率は0.3%未満と数字だけ見れば十分低い。しかしCloudflareの規模では、0.3%でも1日に数百万件のアラートが出る。しかもBot管理用のチャレンジスクリプト、トラッキングピクセル、アドテクのコードは正規だが重度に難読化されており、GNNが構造的に「怪しい」と判定してしまう。アラート疲れがセキュリティチームの注意力を奪い、本物の脅威が埋もれる悪循環だ。

2段カスケードの仕組み

新しい検出パイプラインはGNNとLLMを直列に接続する。

graph TD
    A["ブラウザCSPレポート<br/>秒間4万スクリプト"] --> B["Stage 1: GNN<br/>AST構造解析"]
    B -->|benign判定| C["パイプライン終了<br/>LLMスキップ"]
    B -->|malicious疑い| D["Stage 2: LLM<br/>セマンティック評価"]
    D -->|正規と判断| E["偽陽性として除外"]
    D -->|悪意あり確認| F["アラート発報<br/>ブロックルール適用"]
    E --> G["監査ログに記録<br/>GNN判定をLLMが覆した記録"]

Stage 1のGNNは全スクリプトを評価する。benignと判定されたスクリプトはここでパイプラインを抜け、コストの高いLLM推論を回避する。GNNがmalicious寄りの判定を出したスクリプトだけがStage 2に進む。

Stage 2のLLMは、Cloudflare Workers AI上でホストされたオープンソースLLMだ。セキュリティ特化のプロンプトコンテキストを与えられた上でスクリプトの意図をセマンティックに評価する。GNNが「構造的に怪しい」と判定した難読化コードでも、LLMはJavaScriptのフレームワークパターンや正規のイディオムを理解しているため、「怪しいけど無害」な正規コードを見分けられる。

LLMがGNNの判定を覆した場合は監査ログに記録される。これにより検出品質の継続的な改善サイクルが回る。

誤検知200分の1削減の内訳

JavaScript Integrityの脅威カテゴリにおける本番トラフィックでの結果は以下のとおり。

指標改善前改善後削減率
全トラフィックFP率約0.3%約0.1%約3倍
ユニークスクリプトFP率約1.39%約0.007%約200倍

「200倍削減」はユニークスクリプト単位の数字だ。同じスクリプトが複数ゾーンで読み込まれるケースを排除した上での改善なので、セキュリティチームが実際に目にするアラートの質が劇的に上がったことを意味する。

真陽性率(実際の悪性スクリプトの検出率)は維持されており、GNNの高い再現率とLLMの高い適合率の組み合わせが効いている。

ゼロデイXSSの検出事例

Cloudflareはブログ記事で実際の検出事例を公開している。Xiaomi製OpenWrtルーターを狙った悪意ある core.js が、array string obfuscatorで重度に難読化された状態で配布されていた。このスクリプトはルーターのWAN設定を照会し、DNS設定を上書きし、管理者パスワードを変更する。VirusTotal等の既存の脅威インテリジェンスプラットフォームがまだ報告していない段階で、GNNがAST構造から悪意あるパターンを検出し、LLMが意図を確認して検出に成功した。

シグネチャベースの検出では定義ファイルが更新されるまで無力だが、GNNはコードの構造を見るため「まだ誰も見たことがない」難読化パターンでも対応できる。以前取り上げたCloudflare Turnstileの解析でも触れたように、Cloudflareは難読化されたJavaScriptの解析に深い知見を持っており、それが検出エンジンにも活かされている。

GNNの訓練データ戦略

GNNの精度を支えているのが訓練データの作り方だ。悪性スクリプトはデータ全体の約6%しかなく、極端な不均衡データになる。Cloudflareはこの問題に対して、悪性サンプルは量を優先し、良性サンプルは多様性を優先するアプローチをとっている。

アノテーション作業を効率化するために、LLMベースのコード埋め込みで意味的に類似したスクリプトをフィルタリングし、コサイン類似度が0.10以上離れたサンプルだけを選別する。この手法でアノテーション対象を約3,000件から196件に圧縮しつつ、誤検知を50%削減した。

推論時の効率も特筆に値する。ツリーベースのハッシュでスクリプトの99.9%以上がキャッシュされるため、秒間4万スクリプトを処理しながらGNNモデルの実行は1分あたり10回未満で済む。SHA-256ではなくAST構造由来のハッシュを使うことで、ミニファイやフォーマット変更程度ではキャッシュが無効にならない。

npmサプライチェーン攻撃への対応

Cloudflareはブログ記事内で2025年9月の悪意あるnpmパッケージによるサプライチェーン攻撃と、2026年1月にSansecが報告した銀行従業員向けマーチャンダイズストアでのブラウザサイドキーロガーに言及している。どちらもClient-Side Securityの検出対象だ。

npmサプライチェーン攻撃はFamous ChollimaのStegaBinキャンペーンTeamPCPによるPyPI汚染のように手口が高度化し続けている。サーバーサイドのパッケージスキャンと並行して、実際にブラウザで実行されるスクリプトを監視するClient-Side Securityは、サプライチェーン防御の最終ラインとして機能する。

プランと提供範囲の変更

従来、Client-Side Security Advanced(旧Page Shieldアドオン)はエンタープライズ営業経由でのみ購入可能だった。Cloudflareは2025年のBirthday Weekで「セキュリティ機能は営業なしでアクセスできるべき」というテネットを掲げており、今回その方針が実行された。

機能FreePro/BusinessAdvanced(セルフサーブ)
ドメインベース脅威インテリジェンスありありあり
GNN+LLM悪性スクリプト検出なしなしあり
コード変更監視なしなしあり
プロアクティブブロックルールなしなしあり

Magento等の非エンタープライズECプラットフォームが特にスキミング攻撃の標的になりやすいと記事は指摘している。エンタープライズ契約なしで高度な検出が使えるようになったのは、こうした中小規模のECサイト運営者にとって実質的なセキュリティ向上になる。

以前の記事で取り上げたCloudflare AI Security for Appsがサーバーサイド(プロンプトインジェクション、PII漏洩)を守るのに対し、Client-Side Securityはブラウザサイドのスクリプト実行を守る。両方を組み合わせることでWebアプリケーションの入口と出口の両方をカバーする構成になった。