上限のないインバウンド本文は、LLM ゲートウェイにとって最も安い拒否財布攻撃です。数メガバイトの JSON ひとつが、JSON Schema 検証レイヤーが拒否する前にトークナイザ仕事を膨大に食い潰します。2026年は OpenClaw ゲートウェイの縁で明示的に最大 HTTP エンティティサイズ・JSON パース深度の天井・ツールごとの標準出力キャップを課し、検証器がすでに読むマニフェストと同じ数字へ結線しましょう。誤設定クライアントは単一のポリシー面だけを見れば済みます。サーキットブレーカーの閾値と組み合わせれば、繰り返し違反は CPU を密かに飽和させるのではなく保護的バックオフへ進みます。
数値の芯はこの記事どおりに説明できます。対話レーンでは既定でインバウンド JSON を4 MiBまで、ツリーはツールがより深い構造を宣言しない限り深度 32、ファイル読み取りのプレビューは明示昇格がない限り512 KiBで切り詰め、リハーサル経済性はレンタルの Apple Silicon Mac mini で1 日あたりおよそ 16.9 ドルです。
ゲートウェイが早期拒絶すべき理由
多層防御は TLS 終端・リバースプロキシ・アプリケーションのパーサを積み上げますが、巨大本文がトークナイザへ届いた瞬間には電力とレイテンシ予算はすでに支出済みです。ソケット層で保守的な MaxBytesReader パターン(または同等の機構)によりバイト天井を強制すれば、攻撃者はラウンドトリップのコストだけを払いモデルスロットを占有できません。拒否理由は上流の HTTP 502 ノイズとは別系列で計測し、Grafana のタイルが読める状態を保ちます。
インシデントレビューでは「どこで詰まったか」を説明できることが信用を左右します。ゲートウェイで機械可読なコードを固定すると、ブレーカーやレート制御へつなぐ説明が一本になります。ログ検索では短時間でも統計が安定するよう、スパイクとベースラインを分離します。
HTTP 本文と Content-Length の天井
Content-Length がポリシーを超えるリクエストは、残りをストリームする前に終端してください。長さのないチャンク転送ではリングバッファへ蓄積し、既定の対話レーンでは4,194,304 バイトに達した時点で中止します。別認証とキュー深度メトリクスで守られたバッチ取り込みエンドポイントだけ、より大きな許容値を文書化しましょう。
| レーン | 最大本文 | 根拠 |
|---|---|---|
| 対話チャット | 4 MiB | リッチなツール JSON は許容するがアーカイブ dump は拒む |
| 自動化 webhook | 16 MiB | 管理者承認のバッチイベント |
| 緊急オペレーター上書き | 64 MiB | 署名ヘッダと監査ログが必要 |
プロキシチェーンでは上流がすでに本文を破棄している場合でもゲートウェイ側で二重に検証するとブレークポイントが明確になります。Staging と Production で値が食い違うと「検証では通った」という不信が生じるので、環境変数名と Terraform の既定値を一枚にまとめます。
JSON 深度・配列長・キー数
パーサはバージョン付きマニフェストにツール固有の免除がない限り、深さ32を超えるツリーやノードあたり4096スロットを超える配列を拒否すべきです。深度チェックにはオブジェクトあたりの相異なるキー数の上限(256)を添え、設定ブロックを装ったプロトタイプ汚染系ガジェットを踏みにくくします。
{
"error": "parse_depth_exceeded",
"limit_depth": 32,
"observed_depth": 41,
"request_id": "b7f2…",
"hint": "設定配列をフラットにするか複数のツール呼び出しへ分割してください"
}
ツールオーナーへはマニフェストの変更リクエストを別ワークフローで受け付け、ゲートウェイの既定値より緩める場合だけ semver を上げます。そうしないと「今日だけ緩めた」設定がブランチに残り続けます。
ツール出力の切り詰めとストリーミング
ファイルシステムやシェルのツールは兆候なく標準出力をメガバイト単位で吐きます。サブプロセスのパイプを読み取りラッパで包み、契約が large_output:true を宣言しない限り524,288 バイトを超えたら破棄モードへ移行します。モデルトークンを上流へストリームするときは TCP ウィンドウの背圧を尊重し、8 GiB の Mac mini ゲートウェイではワーカーあたり内部キューの合計が2 MiB RAM を超えたらツール読み取りを一時停止します。
長時間バックグラウンドで動くツールでは進捗イベントを細かく返し、モデル側が無限に待たないようにハートビートを設計します。進捗 JSON は上限にカウンタを載せ、どこで詰まったかが一目で分かるようにします。
413 と 400 の構造化エラー本文
安定した機械可読の error コードを使い、ポリシーの上限値をエコーします。攻撃者が制御するスライスは200 UTF-8 文字を超えて返さないでください。過負荷が原因であって乱用でないときだけ retry_after_ms を付けます。
スキーママニフェストとの整合
ゲートウェイが JSON Schema で引数を検証しているなら、maxLength と maxItems は輸送層の上限より厳しく保ちます。そうすると検証は素早く失敗しつつ意味が伝わり、クライアントは不透明なソケットリセットではなくスキーマエラーを見られます。
macOS のバッファ既定と LaunchAgent
launchd が継承するパイプサイズは Linux コンテナとは異なります。ベアメタル macOS でリハーサルすると標準出力がゴルーチンの排出より速く溢れる場面が見え、本番前に高水位を正直に調整できます。
乱用パターンと隣接レート制御
本文攻撃は単一の巨大 POST より、上限ギリギリを数千回送り続けるほうが現実的です。rejection_rate_413 と rejection_rate_parse を一次メトリクスとして追い、5 分あたり 5% を警告、問題の API キーへ自動で軽いトークンスロットルを掛ける20% ルールを用意します。テナントごとのクレジット残高と組み合わせ、マーケティングテナントがプラットフォーム運用を餓死させないようにします。
フォレンジックにはサンプルを残しても、拒否本文全体は保存しません。アプリログとは隔離された鍵のもとで SHA-256 と先頭 1,024 バイトだけを保持し、法定ホールドがない限り72 時間で期限切れにします。
リミッタ判断の SLO 表
| シグナル | 目標 | アクション |
|---|---|---|
| パース時間中央値 | M4 で 16 KiB JSON が 3 ms 未満 | 15 分連続で 6 ms を超えたらアラート |
| 413 比率 | 定常で 0.3% 未満 | デプロイ後 2% を超えたらページ |
| 切り詰められたツール行 | ツール呼び出しの 1% 未満 | オーナーへページングを依頼 |
ロールアウト順序
- シャドウ:48 時間は拒否せず「拒否したはずの件数」だけ記録する。
- カナリア:内部ワークスペースから強制する。
- 漸進:対話本文の上限を週次リリースで 8 MiB から 4 MiB へ。
- 事後検証:Prometheus のスクレイプ差分と CPU ベースラインを比較する。
数値の既定は環境変数と並べてドキュメント化し、Terraform と LaunchAgent の plist が同期します。「ステージだけ許す」状態が続くと信頼が削れます。
WASM とネイティブパーサ経路
JSON を WASM へオフロードしたり SIMD ライブラリを使うチームでも、ゲートウェイ全体の上限は加速器が約束するピークより低く置きます。Apple Silicon は夏季にサーマルが85 °Cを超えると長時間 AVX 重いカーネルでスロットルします。
ユニバーサルバイナリを arm64 で配る場合、コールドとウォームでベンチマークしてください。デプロイ直後の初回リクエストは命令キャッシュミスで最大40%跳ね上がることがあり、ダッシュボードに揺らぎを出しておかないと上限締めと隠れ回帰が重なります。
バージョン付きクライアント契約
機械可読な /gateway/policy をセマンティックバージョンのゲートウェイと一緒にバンプし、Flutter・Electron・Swift クライアントが定数ハードコードなしに能力交渉できるようにします。max_tool_output_preview_bytes を載せれば、ツール出力テーブルをいつページングすべきか UX が把握できます。
Redis 支援のクォータカウンタ
複数ワーカーがクォータを強制する場合、rolling カウンタを Redis に集約し、バースト検出には5 秒 TTL、持続的乱用には毎時ハッシュを使います。Lua でインクリメントとチェックを原子的にし、ここで競合すると変な 429 嵐が起きます。
メモリ圧力でクォータキーが落ちても認証トークンよりマシなら、そのトレードオフを runbook に書きます。フェイルオーバー訓練で一時的に緩むことを見越します。
OpenAI や Anthropic が一晩でコンテキストを広げても、ゲートウェイの天井を盲信して上げないでください。トークナイザ予算を再評価し、観測パネルが緑に戻るまで観察します。
runbook にはこの政策表・Grafana のボード ID・現在のタグを直リンクし、新しいオンコールがチャットログを漁らなくて済むようにします。既定が動くたびに更新します。
この規律がマルチリージョンのゲートウェイを週ごとに揃えます。
継続運用レビューと障害学習
四半期ごとに「上限変更が売上やサポート票に与えた影響」をレビューし、閾値を下げた/上げた理由をエビデンス付きで残します。ダッシュボードはチームをまたいで同じグラフ定義を共有し、色の意味を固定します。
インシデント後には「413 が増えたが課金コストは下がった」などの因果を一枚にまとめ、経営・開発・サポートが同じ語彙で話せるようにします。クラウド Mac mini でのリハーサル記録も添え、macOS 固有の挙動を疑うべきケースを明示します。
MacHTML で Apple Silicon Mac mini を借りると、TLS スタック・デコーダ・パイプの意味論が、すでに macOS でゲートウェイを動かしている顧客と揃い、Linux だけを前提にした誤ったバッファ見積もりを避けられます。静音冷却と予測しやすいシングルスレッド性能は、413 嵐のなかでパーサのマイクロ秒を測る場面でも効きます。オンプレと比べ1 日あたりおよそ 16.9 ドルのオペックスとして伸縮できます。
伸縮性のあるレンタルでは本番の上限プロファイルを隔離テナントへ複製し、濫用本文をバーストさせても共有ステージングを危険にしないレッドチーム演習が可能です。
実際の macOS でゲートウェイ上限を負荷試験する
クラウド Mac mini を用意し、パーサの上限・LaunchAgent のログ・TLS の挙動を本番に近い形で確認してからポリシーを締めます。