AI 工具 15 min read

Cloudflare security-audit-skill 實測:AI 互相找碴審資安,貴 26 倍、漏洞沒多抓

Cloudflare 在 2026-06 開源的 security-audit-skill(MIT、近 5 萬星)是一組給 coding agent 讀的資安稽核提示詞,讓一批 AI 找漏洞、另一批全新的 AI 專門推翻。我用埋了 11 個漏洞的小站實測,quick 模式花 $2.92、8 分鐘指出 10 個,單一 agent 花 $0.11、29 秒抓到 11 個——日常審單一 agent 就夠,這個 skill 留給上線前在 Linux 跑多輪。

Cloudflare security-audit-skill 實測:AI 互相找碴審資安,貴 26 倍、漏洞沒多抓
本文目錄 · 10
懶人包
  • Cloudflare 開源的 security-audit-skill(MIT,2026-10-27 查約 4.96 萬星)讓一批 AI 找漏洞、另一批全新的 AI 專門推翻,沒在沙箱重現就不准標「已確認」。
  • 我用一個埋了 11 個漏洞、2 個陷阱的 Express 小站實測:skill 的 quick 模式指出 10 個、花 $2.92、約 8 分鐘;單一 agent 抓到 11 個、花 $0.11、29 秒。兩邊陷阱都沒誤報。
  • skill 那 10 條全部是「待驗證」,0 條「已確認」:這次我沒給它沙箱,它照規矩不下定論。
  • 官方兩支驗證器在 Windows 直接 exit 1,原因是 Node 在 win32 沒有 O_NOFOLLOW,整次 run 只能標成 incomplete。
  • 第三方盲測(issue #20,15 個漏洞、各跑 3 輪)結論一致:recall 跟單一 agent 同為 0.467,成本 14.5 倍。
  • 我的用法:日常 vibe coding 用單一 agent 審;這個 skill 留給上線前、在 Linux 或 WSL 有沙箱的環境做正式稽核,而且要跑好幾輪。

Roboa.ai 有支 FB Reel 在介紹這個 skill,片尾自己註明「我們尚未實測」。我看完想知道的只有一件事:這套「AI 互相找碴」的流程,在一般 vibe coding 專案上,比直接叫一個 agent 審程式碼多抓到什麼? 所以我做了一個靶站,兩種審法各跑一次,答案卷事先寫好,放在審查範圍外。

兩種審法的結果卡:Cloudflare skill quick 模式指出 10/11、0 條已確認、花 $2.92 約 8 分;單一 agent 抓到 11/11、花 $0.11、29 秒

Cloudflare security-audit-skill 是什麼?

cloudflare/security-audit-skill 是一份給 coding agent 讀的資安稽核 skill,2026-06-18 建立,MIT 授權。我在 2026-10-27 用 gh api 查到 49,579 顆星、3,109 個 fork。README 說它是 Cloudflare 內部漏洞挖掘系統的起點,後續演變寫在官方部落格 Build your own vulnerability harness。

它沒有執行檔。整個 repo 是一組 Markdown 提示詞,加上兩支零依賴的 Node 驗證器(validate-findings.cjs、validate-coverage-ledger.cjs)和一份 report-schema.json。agent 讀了 SKILL.md 之後,照裡面的六個階段指揮子代理:

1 偵察
畫信任邊界

2 獵人找漏洞
依覆蓋率分配

3 全新 agent
試著推翻

4 寫 findings.json
schema 驗證

5 再找新 agent
獨立複核

6 產報告

判定只有三種:confirmed(已確認)、needs_validation(待驗證)、rejected(駁回)。只有 confirmed 會有嚴重度,而 confirmed 要求「有完整的資料流追蹤,加上一個有界的實際觀察結果」,也就是要在沙箱裡真的跑過。

模式有三種:quick 只跑一波獵人、一次覆蓋率檢查;standard 是預設;deep 給大型或高風險目標,critic 要跑到乾淨為止。

怎麼安裝?

README 的官方指令用 Skills CLI:

npx skills add https://github.com/cloudflare/security-audit-skill \
  --skill security-audit

加 --global 會裝到使用者層級。這次我沒有裝,因為它會改全域設定;我把 repo clone 下來,在提示詞裡直接指定 SKILL.md 的路徑讓 agent 讀,效果相同。裝好之後,README 給的觸發方式就是一句話:

security audit this codebase

我怎麼比?

靶站是一個 Express + SQLite + JWT 的電商小站,我故意埋了 11 個教科書型漏洞,再放 2 個「看起來像漏洞、其實安全」的陷阱,用來測誤報:

類型內容
11 個漏洞登入 SQLi、JWT 只 decode 不驗簽、JWT 密鑰寫死、訂單 IDOR、個人資料 mass assignment、結帳金額由前端決定、發票路徑穿越、ping 指令注入、留言 stored XSS、登出 open redirect、MD5 無鹽存密碼
2 個陷阱有白名單的 ORDER BY、參數寫死的 execFile
兩組都用 claude -p --model sonnet,並加上 --strict-mcp-config --setting-sources project,local,排除我自己全域的 hook 和 MCP 干擾。兩組都被告知不准讀答案卷所在的目錄。

skill 組的提示詞要點:

Read and follow the skill at .../security-audit/SKILL.md
Request: full security audit of the codebase at .../shopdemo .
Full audit mode, profile "quick".
No OS-enforced sandbox is available on this host, so do NOT execute target code;
source-only analysis, keep sandbox-blocked items as needs_validation as the skill says.

單一 agent 組只有一段話:讀完所有原始碼、列出每個漏洞、輸出成 {"title","file","line","severity","description","fix"} 的 JSON 陣列。

注意 skill 組那句「不准執行目標程式」。這台是 Windows,沒有作業系統層級的沙箱,所以是我主動限制它,不是它自己做不到。

實測結果:誰抓到比較多?

逐條對照表:11 個埋的漏洞中,skill 有 9 條標待驗證、JWT 密鑰寫死只列加固備註、MD5 被駁回;單一 agent 11 條都附嚴重度;兩個陷阱兩邊都沒誤報
skill(quick)單一 agent
指出的種子漏洞10/1111/11
判定 confirmed0不適用(每條都直接附嚴重度)
陷阱誤報0/20/2
子代理數13(2 獵人、1 critic、10 驗證者)0
成本(total_cost_usd)$2.917828$0.1128645
時間約 8 分鐘(22:53:58 啟動,23:01:56 寫完)28.9 秒
額外雜訊無4 條加固建議(helmet、rate limit、lockfile 等)
成本差 26 倍、時間差約 16 倍,抓到的漏洞沒有比較多。

skill 少的那一條是「JWT 密鑰寫死」。它的理由寫在報告裡:token 從來沒被驗簽,所以密鑰目前沒有作用,列成加固備註。MD5 存密碼則被驗證者駁回,理由是「這條沒有自己獨立可達的讀取路徑」,同樣降成加固。兩個判斷都有根據,代價是讀報告的人可能把「現在打不到」讀成「不是問題」。issue #20 的作者也點出同一件事。

skill 多給了什麼?

數量上沒贏,但它每一條的內容比單一 agent 紮實。報告裡每條待驗證的漏洞都有:

  • 跨了哪個信任邊界,例如 anonymous -> any user / admin。
  • 卡在哪個未確認的事實,例如「上游 proxy 有沒有另外驗 JWT 看不到」。
  • 一份不會破壞資料的驗證計畫。
它也把兩個陷阱主動列成「正面的程式寫法」,不是只有沉默不報。單一 agent 那邊每條都直接給 critical/high,看起來比較有結論,但那個嚴重度是「讀程式碼推出來的」,跟 skill 要求的「跑過才算」不是同一個等級的證據。

如果我要把結果交給別人修,skill 的報告比較好用;如果我只是想在 commit 前知道哪裡有洞,單一 agent 29 秒就給了。

Windows 上的踩坑:官方驗證器跑不起來

skill 在第 4、5 階段要跑兩支驗證器。在我的 Windows 11、Node v24.11.1 上:

node validate-findings.cjs poc/skill-run/findings.json
Failed to read findings JSON: OS no-follow and nonblocking input protection is unavailable

exit code 1,validate-coverage-ledger.cjs 同樣錯誤。原因在 readFileWithinLimit():它要求 fs.constants.O_NOFOLLOW 和 O_NONBLOCK 都存在,用來防 symlink 和 FIFO 攻擊。Node 在 win32 這兩個常數是 undefined:

node -e "console.log(process.platform, require('fs').constants.O_NOFOLLOW)"
win32 undefined

skill 自己的處理方式很誠實:它另外做了一份拿掉這道檢查的副本跑過,兩個檔案都通過 schema,但整次 run 還是標成 incomplete,原因寫 validators_unavailable_on_host。想在 Windows 用,請在 WSL 裡跑。

第三方盲測怎麼說?

我的靶站很小、漏洞都很典型,對單一 agent 有利,而且兩組都只跑 1 次。所以我去對照了 repo 的 issue #20:HetCreep 在 2026-09-16 發的盲測,15 個種子漏洞、2 個陷阱,每組各跑 3 輪。

指標skill quick單一 agent
precision 中位數90%—
陷阱誤報0—
recall 中位數0.4670.467
每次成本中位數$29.95$2.06
結論跟我的一樣:準確度很高、陷阱不會誤報,但 quick 模式多花的錢沒有換到更多 recall,成本是單一 agent 的 14.5 倍。他另外記了幾個邊界:依賴套件的 CVE 抓不到(skill 設計上不查外部資料,三輪都 0%);只要一個獵人回傳格式壞掉,quick 模式沒有第二波可以補,那個單元整個 run 就沒覆蓋。

Cloudflare 的 README 自己也寫了:

In our test runs, a single run found roughly half of the vulnerabilities that repeated runs found in total.

單跑一次大約只抓到多跑幾次總和的一半。這個 skill 的設計是「同一個 repo 多跑幾次,後面的 run 讀前面的 ledger 去補缺口」,跑一次就下結論,不是它的用法。

什麼時候值得用它?

情境我的選擇
vibe coding 寫完一段,commit 前想知道有沒有明顯的洞單一 agent,幾十秒、幾毛錢
登入、付款、權限這類改動要上線單一 agent 先掃,修完再用 skill 跑 standard
對外服務上線前的正式稽核、要交報告給別人skill,在 Linux/WSL 有沙箱的環境、跑多輪
想查依賴套件有沒有已知 CVE都不適合,用 npm audit、Dependabot 這類工具
只有 Windows、沒有 WSLskill 會一直是 incomplete,先用單一 agent
就算不裝,這個 skill 也有三條規則值得抄進自己的 code review 提示詞:找漏洞跟驗證漏洞交給不同的 agent;要講出跨了哪個信任邊界才算漏洞;沒有證據就標「待驗證」,不要硬給嚴重度。

這次實驗的限制

  • 兩組各跑 1 輪(n=1),只能看方向,不能當統計結論。
  • 靶站約 6 KB、漏洞都是教科書型。真實專案的漏洞藏在商業邏輯裡,skill 的覆蓋率帳本在那種情況才比較有發揮空間。
  • skill 組被我禁止執行程式,所以 confirmed 是 0。給它沙箱,結果會不一樣。
  • 兩組模型都是 Sonnet。換更強或更弱的模型沒有測。

延伸資源

author
陳
陳彥彤

AI 工程師 · AI 顧問。Java 後端 8 年、AI 工程師 2 年。AI 內訓 · AI 導入顧問 · 前後端與雲端培訓。

support

覺得文章有用可以到 GitHub 給個 star,或是透過信箱聊聊 AI 內訓、AI 導入顧問或前後端 / 雲端培訓。