Workers AIのGLM-5.3で他人のデータを含む応答が155件 — SGLang分散推論のKVキャッシュ漏洩を解説
はじめに
Cloudflare が 10/26、Workers AI で提供している GLM-5.3(@cf/zai-org/glm-5.3)の事故報告を公開しました。8/27〜9/9 の間、他の顧客のリクエストに由来するデータを含む応答が 155 件返っていたという内容です。
対象は 681,280 トークンを超える長いプロンプトだけでした。原因は 1 つではありません。「KV キャッシュの置き場所がコンテキスト長より小さかった」という設定の問題と、「入りきらないリクエストをエラーにせず処理を続けてしまう」SGLang のバグが重なっていました。
この記事では、何が起きたかを整理したうえで、プリフィルとデコードを別の GPU に分ける**分散推論(disaggregated prefill/decode)**で、なぜ他人のデータが読めてしまったのかを解説します。最後に、自前で LLM を配信する側が確認すべき点をまとめます。
何が起きたのか
報告によると、経緯は次のとおりです。
- 8/27: GLM-5.3 を公開。コンテキスト長は 1,048,576 トークンだが、プリフィル側の KV キャッシュプールは 681,280 トークン分(約 65%)しかなかった
- 9/8 23:11(UTC): Knostic の Gadi Evron 氏が HackerOne 経由で報告
- 9/9 13:22: 2 つの別アカウントで漏洩を再現し、セキュリティインシデントとして扱い始める
- 9/9 14:00: モデルを非公開にし、リクエストは HTTP 400 を返すように変更
- 9/9 14:52: 全プリフィルノードを修正後の設定に切り替え(KV プールを約 204 万トークンに拡大)
- 9/9 19:04: エラーを正しく返すエンジンのパッチを当てた構成に作り直し、報告者の再現スクリプトで検証
- 9/9 19:40: 公開を再開
影響を受けた顧客は「少数」とだけ書かれ、正確な数は出ていません。Cloudflare 自身と報告者のテストを除くと、該当リクエストは普通の長文利用と同じ時間帯・量だったため、意図的な悪用の証拠はないとしています。他の公開モデルは影響を受けていないと確認したそうです。
厄介なのは、外から見て異常に見えなかった点です。閾値を超えたリクエストは本来 HTTP 400 になるはずが HTTP 200 で返り、prompt_tokens も長いプロンプトどおりの値でした。応答の文章も自然に読めました。違いは「長い文章をプリフィルしたにしては返りが速すぎる」ことくらいでした。
なお、SGLang には 7/6 の時点で同じ挙動を報告する issue(#30233)が別の利用者から出ていたことも、後から分かっています。
なぜ他人のデータが読めたのか
KV キャッシュは「使い回すページ」でできている
LLM は、入力トークンごとに計算したキー(K)とバリュー(V)を保存しておき、出力を 1 トークンずつ作るたびにそれを参照します。これが KV キャッシュです。vLLM の PagedAttention 以降、多くの推論エンジンは KV キャッシュを固定サイズのページの共有プールとして管理しています。リクエストが来たらページを割り当て、終わったら返す、という OS のメモリ管理に近い仕組みです。
ここで重要なのが、報告にある次の 2 点です。
- ページは返却時にゼロ埋めされない。次のリクエストが上書きするのを前提にしている
- プールの大きさは、起動時にモデルの重みを載せた後の空き GPU メモリで決まる。設定したコンテキスト長とは連動しない
つまり「コンテキスト長は 100 万トークンと宣言しているが、実際に置けるのは 68 万トークン分」という状態が、エンジン起動時にエラーにならずに成立してしまいます。
分散推論で、拒否が途中で消えた
Workers AI の GLM-5.3 は、SGLang の分散推論モードで動いていました。入力全体を処理して KV キャッシュを作るプリフィル用の GPU と、それを受け取って出力を作るデコード用の GPU を分け、KV キャッシュを RDMA(Mooncake)で転送する構成です。プリフィルは計算が重く、デコードはメモリ帯域が律速なので、分けると GPU を効率よく使えます。
問題はノードをまたいだ「拒否」の扱いでした。SGLang は、プールに入りきらないリクエストを「拒否済み」とし、1 トークンの仮プロンプトに置き換えていました。ところが分散モードの受付キューは finished() で完了判定をしており、拒否済みリクエストに対してこれが False を返しました。その結果、拒否されたはずのリクエストがプリフィル・転送・デコードと最後まで進みました。
デコード側は、元の長いプロンプトに合わせて確保した全ページに対して attention を計算します。報告の例では、8 ページ分を確保したリクエストのうち、今回のリクエストが書き込んだのは先頭の 1 ページだけでした。残り 7 ページには、前に同じページを使った別のユーザーのプロンプトや生成途中の文章が残っていました。モデルはそれを自分の文脈として読み、自然な文章として出力したわけです。
2023 年の ChatGPT の事故との違い
LLM サービスで他人のデータが見えた事故としては、2023 年 3 月の ChatGPT の件(Redis クライアントのバグで他人の会話タイトルが表示された)が知られています。あちらはアプリ層のキャッシュの取り違えでした。今回は推論エンジンの GPU メモリの中で起きており、ログやレスポンスの形式を見ても気づけない、という点で性質が違います。
エンジニアへの影響
Workers AI の利用者
Cloudflare 側で修正は済んでおり、利用者がすることは基本的にありません。ただし、立場によって見るべき点が違います。
- 受け取った側: 8/27〜9/9 に 68 万トークンを超えるプロンプトを GLM-5.3 に送っていた場合、その応答に自分の入力と関係ない内容が混ざっていた可能性があります
- 漏れた側: 混入したのは「直前に同じモデルへ送られた別のリクエスト」の内容で、こちらには長さの条件がありません。期間中に GLM-5.3 へ送った入力は、短いものでも他人の応答に混ざった可能性があると考えておく必要があります
自前で SGLang などを動かしている場合
影響が大きいのはこちらです。Cloudflare は運用者向けに次の確認を勧めています。
- 各ノードの起動ログから KV プールの大きさを測り、コンテキスト長と比べる。重み・量子化・並列数・メモリ設定を変えるたびに行い、プールが小さければコンテキスト長を下げる
- SGLang を v0.5.22 以降に上げる。#36988(中断したプリフィルをデコードに渡る前に破棄、v0.5.20)と #38935(長すぎるリクエストを受付時点で拒否、v0.5.21)の両方が入っている
- プリフィル・デコードの両方で KV の遅延解放を有効にし、Mooncake の転送バッチを解放タイムアウト内に収める
- 対応モデルでは
--disaggregation-enable-kv-checksumと--kv-canaryで破損検知を有効にし、ログで検証されていることを確かめる(全アーキテクチャには未対応) - ロードバランサーが最初のトークンが出る前にリクエストを中断しないようにする
1 番目は分散推論を使っていなくても有効です。「宣言したコンテキスト長」と「実際に置けるトークン数」がずれていないかは、設定ファイルではなく動いているエンジンのログで確かめる、というのが報告の教訓の 1 つでもあります。
テストの観点
もう 1 つの教訓は、公開前のテストが HTTP ステータスと速度しか見ていなかったことです。Cloudflare はプール不足を公開前に把握していましたが、長文での出力の中身までは検証していませんでした。今回の不具合は、正常に見える 200 応答の中にだけ現れました。
長いコンテキストを売りにするモデルを配信するなら、既知のマーカー文字列を埋め込んだ長文を送り、応答に別のリクエストのマーカーが出ないかを確認するテストが必要です。Cloudflare が今回の検証に使ったカナリアマーカーのテストも、この考え方です。
まとめ
- Workers AI の GLM-5.3 で、68 万トークン超のプロンプトに他の顧客のデータを含む応答が 155 件返った(8/27〜9/9)
- 原因は「KV プールがコンテキスト長より小さい設定」と「拒否済みリクエストが分散推論の処理を進んでしまう SGLang のバグ」の重なり
- KV ページはゼロ埋めされずに使い回されるため、デコードが前のユーザーの残りを読んだ
- 自前運用ではプールの大きさの実測、SGLang v0.5.22 以降への更新、チェックサムやカナリアの有効化が対策になる
Cloudflare は今後、RDMA による KV 転送プロトコルを形式検証する計画も示しています。分散推論が当たり前になるにつれ、「ノード間で状態の認識がずれる」種類の不具合への備えが、推論基盤の品質の一部になっていきそうです。
今日のその他のニュース
Anthropic が S-1 を公開、Nasdaq に「ANT」で上場へ
Anthropic が 10/26 に上場目論見書(S-1)を公開しました。報道によると、2026 年上半期の売上は約 163 億ドル(2025 年通期は 46 億ドル)、純損失は 807 億ドルです。損失の大半は転換社債の公正価値の変動によるもので、現金の流出ではないとする分析も出ています。数字は報道ベースで、本記事では S-1 本文を確認していません。
OpenAI が中位モデル GPT-6.1 Terra を公開
GPT-5.6 Terra の後継で、API 価格は入力 $1/出力 $5(100 万トークンあたり)と旧 Terra の約半額です。OpenAI の自社計測では Terminal-Bench 4.0 で 50.3%(旧 Terra は 21.5%)。画面操作を含む日常業務向けの位置づけで、複雑なコーディングには引き続き上位の Sol/Astra を勧めています。
Python 3.15.2 など 5 バージョンで eMudhra 問題に再対応
10/21 に続く 2 回目の対策で、ssl モジュールが漏洩した eMudhra 中間 CA の鍵による接続をブロックします(CVE-2026-115557)。pip が古くても Python 本体の更新で守られます。3.13.18/3.12.16/3.11.18 はソースのみの提供で、バイナリはありません。