security-review (everything-claude-code)
對照安全檢查清單審查身分驗證、使用者輸入、密鑰、API 端點與付款功能。
ECC security-review:尋找植入漏洞的表現不比單純使用 Codex 好,Token 用量也差不多
Codex CLI · gpt-6-astra
24.9 / 30
相對未使用技能的提升:-0.16 · 視情況推薦 · 18 次執行
視情況推薦:提升幅度 -0.16 低於 +1.0。推薦條件為總分至少 22/30、產出品質至少 3.5、提升幅度至少 +1.0。
SOTA
透過使用 Codex 測試。
涵蓋 Codex, Claude Code
Codex CLI 0.166(SOTA 等級):18 次評分執行。依我們的等級規則,在這裡通過也涵蓋 Claude Code;但這不代表第二等級的結果。
分數
每個維度為 0 到 5 分,六個維度相加即為滿分 30 的總分。每個維度都是 5 分最好。成本 5 分代表便宜又快速;安裝 5 分代表容易安裝。
- 觸發可靠性
- 5.0
- 相對未使用技能的提升
- 1.8
- 產出品質
- 4.1
- Token 與時間成本
- 5.0
- 安裝與可攜性
- 4.0
- 安全性
- 5.0
安全審查
安全靜態掃描:5 CRITICAL / 6 HIGH / 4 MEDIUM。人工審查:可在無網路沙箱中安全執行(已說明掃描器命中的項目)。掃描結果不能證明技能一定安全。
安裝
npx skills@latest add affaan-m/everything-claude-code --skill security-review
固定 Commit: b38be6a7f6350964d59328b52f0624e1d1d552d1
測試日期: 2026-11-02
我們測了什麼
- 審查小型服務模組 — 在我合併 orders_service.py 之前,先做安全審查。列出你找到的問題,最嚴重的排在最前面。不要修改任何檔案。
- 審查身分驗證輔助程式 — 對 auth_handlers.py 做安全審查:這是我剛為登入流程寫的。列出問題,最嚴重的排在最前面。不要修改任何檔案。
- 審查上傳端點 — 對 upload_api.py 做安全審查。列出漏洞,最嚴重的排在最前面。不要修改任何檔案。
優點
- 技能即使未被點名也會被採用:6/6 次實驗組執行都讀取了技能檔案。
- 沒有額外 Token 負擔:Token 用量是未使用技能的 1.03 倍。
缺點
- 相對未使用技能沒有可測量的提升(-0.16,落在雜訊範圍內)。
- 一句話提示得分 4.29,使用技能則為 4.06(-0.23)。
- 測試注意事項:任務 t1 有三個植入項目並非安全問題,這使得最佳可能的召回率上限約為 3.1。
- 每個任務的每個組別 n=2;約 1 分以內的差異屬於雜訊。
評測
在 Mac 測試機上執行 Codex CLI 0.166(gpt-6-astra,低推理),每次執行都使用全新的暫存專案與暫存的 HOME/TMPDIR/快取,技能分為已安裝(實驗組)、未安裝(對照組),以及未安裝但把技能核心要求濃縮成一句話附加在提示詞後(一句話提示組),每個任務的每個組別執行 2 次,關閉網路,封鎖 /tmp 寫入。提示詞從未提到技能(除了下方註明的措辭)。三個小型檔案,每個都埋了 8 個問題(一個服務模組、一個身分驗證輔助程式、上傳端點),並要求以唯讀方式「列出問題,最嚴重的排在最前面」。訂單服務包含三個不是安全漏洞的問題(一個 off-by-one 邊界、一個資源洩漏、以浮點數處理金額),安全審查理應略過,因此在該任務中安全審查者最多只能找到 8 個中的 5 個,分數上限約為 3.1。
三組對照
| 組別 | 平均分數(0-5) | 每次執行 Token 用量 |
|---|---|---|
| 未使用技能 | 4.22 | 60k |
| 一句話提示 | 4.29 | 44k |
| 使用技能 | 4.06 | 62k |
以 Codex CLI 執行 18 次,採規則式檢查評分,不經 LLM 評審。總分 24.9 / 30,評級為 視情況推薦。
揭露事項:任務 t1 有三個植入項目並非安全問題,這使得最佳可能的召回率上限約為 3.1。
評定:視情況而定(24.9 / 30)。 來源:affaan-m/everything-claude-code,skills/security-review,固定於提交 b38be6a。安裝:npx skills@latest add affaan-m/everything-claude-code --skill security-review。授權: MIT(儲存庫 LICENSE)。
這是什麼
security-review 技能(來自 affaan-m/everything-claude-code,簡稱 ECC):一份安全檢查清單,適用於新增身分驗證、處理使用者輸入、操作機密資訊、建立 API 端點或實作付款功能時。SKILL.md 約有 1,800 字的 Markdown(機密管理、輸入驗證、SQL 注入、身分驗證與授權、XSS、CSRF、速率限制、敏感資料外洩、相依套件安全,附有簡短的正反程式碼範例與部署前檢查清單),另外還有一份關於雲端基礎設施安全的 Markdown 檔案。沒有腳本。
測試方式
在 Mac 測試機上使用 Codex CLI 0.166(gpt-6-astra,低推理),每次執行都建立全新的臨時專案,並使用臨時的 HOME/TMPDIR/快取;分別為安裝技能(技能組)、未安裝(對照組),以及未安裝但把技能核心要求濃縮成一句話附加在提示詞後(一句話組);每項任務的每組執行 2 次;關閉網路,並封鎖對 /tmp 的寫入。提示詞完全不會提到技能名稱(以下註明的措辭除外)。
三個小型檔案,各預埋 8 個問題(一個服務模組、一個驗證輔助模組、上傳端點),並要求以唯讀方式「列出問題,最嚴重的排前面」。訂單服務中包含三個並非安全漏洞的問題(差一錯誤的邊界、資源洩漏、浮點數金額),安全審查理應略過,因此在該任務中,安全審查者最多只能找到 8 個中的 5 個,分數上限約為 3.1。
- 審查小型服務模組 — 請在我合併前對 orders_service.py 進行安全審查。列出你找到的問題,最嚴重的排前面。請勿變更任何檔案。
- 審查驗證輔助模組 — 請對 auth_handlers.py 進行安全審查:這是我剛為登入流程寫的。列出問題,最嚴重的排前面。請勿變更任何檔案。
- 審查上傳端點 — 請對 upload_api.py 進行安全審查。列出漏洞,最嚴重的排前面。請勿變更任何檔案。
計分採程式化方式(隱藏測試/預埋問題召回/限制條件檢查/視情況搭配渲染與 OCR),每次執行 0–5 分。分數並非由任何 LLM 評審決定。
結果
提供給第三組的一句話版本:「依安全檢查清單檢查程式碼:寫死的機密資訊、未經驗證的輸入、SQL/命令注入、失效的身分驗證與授權、不安全的檔案上傳、錯誤訊息或日誌中的敏感資料,以及缺少速率限制;每項發現都要引用確切行號。」
| 任務 | 對照組分數 | 一句話版本 | 技能組 | 對照組 token 數 | 一句話版本 token 數 | 技能組 token 數 | 技能讀取 |
|---|---|---|---|---|---|---|---|
| t1-orders | 2.89 | 3.12 | 2.42 | 60k | 44k | 72k | 2/2 |
| t2-auth | 4.77 | 5.0 | 4.77 | 59k | 44k | 61k | 2/2 |
| t3-upload | 5.0 | 4.77 | 5.0 | 59k | 44k | 51k | 2/2 |
平均分數:無技能 4.22,技能組 4.06(差異 -0.16)。每次執行 token 數:60k 對 62k(1.03 倍);時間 38 秒對 44 秒。一句話組:4.29(技能相較一句話版本的增益:-0.23;一句話版本相較無技能的增益:+0.08);一句話版本每次執行 44k token,因此技能的 token 成本是一句話版本的 1.40 倍。
實際表現
- 沒有增益。平均分數:無技能 4.22、一句話安全檢查清單 4.29、技能組 4.06。預埋問題召回:無技能每次執行 8 個中 4.8 個、一句話版本 4.9 個、技能組 4.5 個。
- 技能在訂單服務任務上稍差:平均 2.4,對照組 2.9、一句話版本 3.1(每次執行找到 2 與 3 個預埋項目,其他組則為 3–4 個)。在 n=2 的情況下,這屬於雜訊範圍。
- 在驗證輔助模組與上傳端點上,每一組都找到 8 個預埋問題中的 7 或 8 個;兩者都是經典的教科書級缺陷(md5、路徑穿越、pickle、命令注入),單純的 Codex 本來就知道。
- 技能在 6/6 次執行中都被讀取。每次執行花費 62k token,對照組 60k(1.03 倍),一句話版本 44k(1.41 倍):一句話組最便宜,因為它們在回答前讀取的內容較少。
- 計分注意事項:項目是以正規表達式比對,因此措辭不同的發現可能被算成漏掉。
各面向分數
| 面向 | 分數 | 原因 |
|---|---|---|
| 1_output_quality | 4.06 | 技能組平均分數 4.06/5(程式化檢查,詳見各任務 表格)。 |
| 2_lift_vs_no_skill | 1.84 | 相較無技能的 4.22 低 -0.16 分(每項任務 n=2;約 1 分 以下的差異屬於雜訊)。 |
| 3_trigger | 5.0 | 技能組 6/6 次執行都讀取了技能檔案。 |
| 4_instructions_portability | 4 | 純 Markdown 檢查清單,範例多為 JS/TS 與 Supabase 風格;只有類推之下才適用於其他技術堆疊。 |
| 5_efficiency | 5 | token 為 1.03 倍(每次執行 62k 對 60k),時間為 1.17 倍(44 秒對 38 秒)。 |
| 6_safety_hygiene | 5 | 僅 Markdown;掃描器的命中是檢查清單內的程式碼範例(process.env、fetch、樣板字串)。 |
本測試的限制
- 三項小型單檔審查,都是教科書級缺陷;更細微的問題(業務邏輯授權、競態條件、供應鏈)並未預埋。
- 技能的雲端/基礎設施檢查清單與部署前清單並未實際演練:測試中沒有基礎設施檔案。
- 只看召回;誤報與修正建議的品質並未計分。
- 每項任務的每組 n = 2:約 1 分以下的差異屬於雜訊。
- 規則式計分只能衡量檢查項目看得見的部分,無法評判品味,也無法判斷結果是否為最佳解。
安全性
詳見 security.md。掃描:5 CRITICAL / 6 HIGH / 4 MEDIUM。評定:可在無網路沙箱中安全執行。掃描結果乾淨並不代表技能一定安全。
總結
這是一份合理的檢查清單,但單純的 Codex 本來就能找到相同的教科書級漏洞,而用一句話列出相同類別,也能以約 70% 的 token 達到同樣效果。在這類程式碼審查中,技能沒有帶來任何可測量的增益;對於想要一致檢查清單的團隊,它或許可以當成提示使用。
完整紀錄
執行日誌:security-review (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) 欄位:任務、組-輪次、得分(0-5)、token、秒、通過的檢查、代理開啟的 skill 檔案。 t1-orders control-1: 得分 3.12, token 60493, 秒 36.1, 檢查 1/2, 未開啟 t1-orders control-2: 得分 2.66, token 60831, 秒 41.9, 檢查 1/2, 未開啟 t1-orders oneliner-1: 得分 3.12, token 44382, 秒 32.3, 檢查 1/2, 未開啟 t1-orders oneliner-2: 得分 3.12, token 44393, 秒 35.0, 檢查 1/2, 未開啟 t1-orders treatment-1: 得分 2.19, token 73335, 秒 69.3, 檢查 1/2, 開啟 security-review t1-orders treatment-2: 得分 2.66, token 72383, 秒 54.7, 檢查 1/2, 開啟 security-review t2-auth control-1: 得分 4.53, token 59839, 秒 37.6, 檢查 2/2, 未開啟 t2-auth control-2: 得分 5.0, token 59894, 秒 37.4, 檢查 2/2, 未開啟 t2-auth oneliner-1: 得分 5.0, token 44259, 秒 36.9, 檢查 2/2, 未開啟
18 次執行、3 個產出檔案
範例產出
SOTA · 装了 skill:final message(t1-orders,第 1 次,Codex)
Found six security issues, ordered by severity. Exposure depends on how callers expose these functions; no caller code was provided. 1. **High — SQL injection** — [orders_service.py:9](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:9) `order_id` is interpolated directly into SQL. An input such as `0 OR 1=1` bypasses the intended lookup condition; crafted `UNION` queries could extract other database data. Bind `order_id` as a parameter. 2. **High — Missing cancellation authorization** — [orders_service.py:13](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:13) `current_user` is never used. Anyone able to invoke this function can cancel another user’s order by supplying its ID. Enforce ownership or an authorized administrative role before updating it. 3. **High — Arbitrary file overwrite through exports** — [orders_service.py:39](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:39) `open(path, "w")` immediately truncates any accessible target and follows symlinks. If callers control `path`, they can overwrite files with the service’s permissions—even before the query succeeds. Use server-generated filenames within a controlled export directory and prevent traversal and symlink escapes. 4. **High — Cross-user order export** — [orders_service.py:40](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:40) The export accepts any `user_id` without checking the requester’s identity or permissions. A caller can export another customer’s records. Derive the user ID from authenticated context and explicitly authorize administrative exports. 5. **High if valid — Embedded payment credential and credential logging** — [orders_service.py:4](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:4), [orders_service.py:48](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:48) A live-looking API key is embedded in source and would be printed after successful gateway calls. Its validity is unverified; the current gateway stub always raises. If real, rotate it, load its replacement from secret storage, and remove credential logging. 6. **Medium — Untrusted payment values lack validation** — [orders_service.py:31](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:31), [orders_service.py:45](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:45) Totals trust supplied prices and quantities, while `charge` accepts an amount without matching it to the stored order. If client-controlled, these permit manipulated totals or underpayment. Retrieve authoritative prices, validate quantities and amounts, and compute the charge server-side. No files were changed. This was a static review; the sandbox blocked the attempted in-memory verification.