ブログ一覧

小さなアプリで Cloudflare の監査スキルを手順どおり回すと /security-review の 30倍の費用

更新: Web開発者向け

Cloudflare が公開した security-audit-skill は、コーディングエージェントにセキュリティ監査をさせるスキルです。偵察・観点ごとの探索・別のエージェントによる反証・JSON の記録・別のエージェントによる再確認・報告の 6段で動きます。約 170行のアプリで Claude Code の /security-review と同じモデルで比べると、仕込んだ主な 3つの脆弱性は両方が毎回挙げ、誤検知は両方 0件でした。費用は、6段を省かずに回すよう頼んだ「手順どおり」で約 30倍、監査だけを頼んだ「素のまま」で約 4倍でした。

試したのは、ノートを書いて共有する小さな Workers のアプリです。TypeScript で約 170行、D1 と R2 を使い、脆弱性を 5つと、脆弱性に見えて実は安全な書き方(以下、罠)を 4つ仕込みました。使い捨てのクラウドの環境で試し、デプロイはしていません。公式が想定する数万行の定期の掃除の外での測定です。

主な 3つの脆弱性は両方が毎回検出し、誤検知はどちらも 0件

/security-review はブランチの差分を見る作りなので、README だけの main に対して、アプリ全体を足したブランチで回しました。差分としてアプリの全ファイルが見えます。security-audit-skill には同じブランチで監査を頼んだので、どちらも同じ約 170行を見ています。

仕込んだのは次の 5つの脆弱性と 4つの罠です。

  • 脆弱性: SQL の注入(検索語を SQL に文字列で埋める) / 他人のノートを消せる削除(持ち主を確かめない) / 保存型 XSS(公開の共有ページでノートの本文をエスケープしない) / セッションの偽造(署名の無い Cookie なら検証を飛ばす) / オープンリダイレクト(ログイン後の next をそのまま使う)
  • 罠: ORDER BY の文字列埋め込み(対応表からしか値が来ない) / ${uid}/${name} の R2 のキー(R2 のキーは ../ を解釈しない) / 固定の文字列だけを入れる innerHTML / 同じ長さのハッシュだけを比べる自前の定数時間比較

/security-review は 3回とも SQL の注入・セッションの偽造・保存型 XSS を挙げ、他人のノートを消せる削除は 3回中 2回で挙げました。オープンリダイレクトは 3回とも出していません。公開されている版のコマンドの文面がオープンリダイレクトを「確信が極めて高くない限り報告しない」低い物として除いているので、方針どおりの結果です。

security-audit-skill は 5回とも、オープンリダイレクトを除く 4つを全部挙げました。他人のノートを消せる削除も毎回です。オープンリダイレクトは 5回のうち 4回で挙げ、残りの 1回は「脆弱性ではなく強化の提案」に回しています。

罠の 4つを脆弱性だと言った回は、どちらの道具にもありませんでした。security-audit-skill は R2 のキーと ORDER BY を、反証して退けた物として記録に残しています。仕込んでいない指摘は、security-audit-skill だけが 3つ挙げ、/security-review は 1つも挙げませんでした。未登録のメールで応答が速くなり登録の有無が分かること、ログインに試行回数の制限が無いこと、ログインの POST に CSRF の対策が無いことで、どれも実在する低い物か強化の提案でした。

比べる相手の /security-review に誤検知が無かったので、別のエージェントに反証させて誤検知を減らす Cloudflare の仕組みは、この対象では差として出ませんでした。差は次の 3つです。

  • 削除の漏れ: security-audit-skill は 5回とも / /security-review は 3回中 2回
  • オープンリダイレクト: security-audit-skill は 5回中 4回 / /security-review は 0回
  • 仕込んでいない低い指摘 3つ: security-audit-skill だけ

手順どおりの費用は 27〜38倍、時間は 26〜40倍

試した版は Claude Code 2.1.296 と、コミット c1c8a8c(2026-09-14)の security-audit-skill で、モデルはどの回も Sonnet 5.5 です。security-audit-skill の回し方は 3通りで、呼び名を次のように決めます。

  • 手順どおり: 6段を省かずに回すよう頼んだ 2回
  • 素のまま: 監査だけを頼み、依頼を受けて手順を進めるエージェント(以下、親)が手順を縮めた 2回
  • 2回目: 素のままの回の記録を前の回として渡してかけ直した 1回。手順どおりの規模で動いた

以下の費用は、Sonnet 5.5 の料金のページの定価(2026-10-10 取得)に実際のトークン数を当てた見積もりで、請求額ではありません。

  • `/security-review`(3回): 3回ともサブエージェントを使わず 1 リクエストで終了 / 25〜26秒 / 0.19 ドル
  • 手順どおり(2回): 26 と 34 のエージェント / 670秒と 995秒 / 5.16 ドルと 7.30 ドル
  • 素のまま(2回): 146秒と 167秒 / 0.74 ドルと 0.82 ドル
  • 2回目(1回): 28 のエージェント / 1,136秒 / 6.45 ドル

/security-review の公開されている文面は、見つける作業と誤検知の除去をサブタスクに分けるよう書いています。実際には 3回とも 1 リクエストで終わりました。手順どおりは、この /security-review の 27〜38倍の費用、26〜40倍の時間です。

素のままでは、親が「対象が 5 ファイルと小さい」と判断して自分で全部を読み、確かめる役のエージェントを 1つだけ立てました。手順のうち、観点ごとに複数のエージェントで探す段と、探し漏れを別のエージェントに点検させる段は飛ばしています。費用は /security-review の約 4倍で、仕込んだ 5つは全部挙げました。

2回目は、報告の詳細を書く途中、SQL の注入の再現の例を書いたところで、Claude Code に Sonnet 5.5 の安全機構が応答を止めたという表示が出ました。人が読む詳細の報告は SQL の注入の途中で切れ、6.45 ドル分を使って報告が書きかけで終わりました。指摘の一覧と深刻度は、その前に書いた JSON の記録に残っています。

トークン数は、/security-review が 1回約 4万、手順どおりが 1回 1,570万〜2,300万、素のままが 110万〜130万で、ほとんどはキャッシュの読みでした。

OS の隔離が無い環境で当てにならない確認済み

security-audit-skill は、指摘を確認済み・要確認・反証で退けた物の 3つに分けます。確認済みにはソースの跡に加えて手元で観測した結果が要り、要確認には深刻度を付けません。

対象のコードを動かすには、外のネットワークに出られない・書ける場所を絞る・資源を制限する、という OS の隔離を求め、無ければコードを動かさずに要確認で止まります(README と SKILL.md)。

手順どおりの 2回は、隔離の道具も、Workers を手元で動かす wrangler も無い環境で、見つけた物を全部要確認にしました。要確認はそれぞれ 5つと 4つで、確認済みは 0件です。要確認には深刻度が付かないので、報告は「確かめる順番」だけで、どれが本当に危ないかの格付けがありません。

同じ環境で、素のままの 2回と 2回目は、手元で動かさずソースを読んだだけで確認済みと深刻度を付けました。手順どおりの 2回は観測が無いので要確認に止めています。同じスキル・同じ環境で、観測が無いのに確認済みにした回と、観測が無いから要確認に止めた回に分かれました。隔離が無いことだけでは 0件を説明できず、手順どおりに頼んだことと重なっています。

深刻度も回で変わりました。素のままの回はセッションの偽造を Critical、SQL の注入を High にし、2回目はこの 2つを入れ替えました。ログインの CSRF も、手順どおりの 1回は要確認、2回目は反証して退けています。

公式の想定する使い方と試していない範囲

公式は README で、security-audit-skill をリポジトリ全体の掃除を定期に回す物で PR ごとの確認ではないと書いています。1回の実行で見つかるのは、繰り返した時に見つかる物の約半分だとも書いています。Cloudflare の社内の仕組みは、最も長い実行で 14時間余りかかったとブログにあります。今回の約 170行を 1回確かめる比べ方は、この用途の外にあります。

この 170行では、2回目に、前の回(素のまま)に無かった本物の指摘が新しく足されたことは 0件でした。

試していないのは次の 4つです。

  • 数万行のリポジトリを定期に回す使い方
  • 隔離を用意して対象のコードを動かし、確認済みを付ける所
  • /security-review が誤検知を出す対象での反証の効き目
  • Sonnet 5.5 以外のモデル(Cloudflare の社内の仕組みは見つける役と確かめる役で別のモデルを使う)

約 170行の小さなアプリでは、/security-review を何回か回すか、security-audit-skill を素のまま 1回かけるのが費用に見合うと判断しています。/security-review は 1回 0.19 ドルで、削除の漏れは 3回のうち 2回で挙げ、3回回した中ではどれかの回が拾っていました。素のままの security-audit-skill は 1回 0.74〜0.82 ドルで、他人のノートの削除とオープンリダイレクトまで挙げ、退けた物も記録に残ります。ただし付いた確認済みと深刻度は観測の無い物で、回によって入れ替わります。数万行を定期に回す公式の用途について、この比べ方は答えを持ちません。

この記事をシェア