SKILL.md
readonlyread-only
name
security-review
description
安全程式碼審查,找出漏洞。當被要求進行「安全審查」、「尋找漏洞」、「檢查安全問題」、「OWASP 審查」,或審查程式碼中的注入、XSS、認證、授權、密碼學問題時使用。提供基於信心的系統化審查與報告。
<!--
參考資料基於 OWASP Cheat Sheet Series (CC BY-SA 4.0)
https://cheatsheetseries.owasp.org/
-->
安全審查技能
識別程式碼中可被利用的安全漏洞。僅報告高信心的發現——明確的漏洞模式且攻擊者可控制的輸入。
範圍:研究 vs. 報告
關鍵區別:
- 報告對象:僅限使用者提供的特定檔案、差異或程式碼
- 研究對象:整個程式碼庫,以在報告前建立信心
在標記任何問題之前,你必須研究程式碼庫以了解:
- 這個輸入實際來自哪裡?(追蹤資料流)
- 其他地方是否有驗證/清理?
- 這是如何設定的?(檢查設定、設定檔、中介軟體)
- 框架提供了哪些保護?
不要僅根據模式匹配來報告問題。 先調查,然後只報告你確信可被利用的問題。
信心等級
| 等級 | 條件 | 行動 |
|---|---|---|
| 高 | 漏洞模式 + 攻擊者可控制輸入已確認 | 報告並附上嚴重性 |
| 中 | 漏洞模式,輸入來源不明確 | 註記為「需驗證」 |
| 低 | 理論上、最佳實踐、縱深防禦 | 不報告 |
不要標記
一般規則
- 測試檔案(除非明確審查測試安全性)
- 死碼、註解掉的程式碼、文件字串
- 使用常數或伺服器控制的設定的模式
- 需要事先認證才能到達的程式碼路徑(改為註記認證需求)
伺服器控制的值(非攻擊者可控制)
這些由運維人員設定,非攻擊者可控制:
| 來源 | 範例 | 為何安全 |
|---|---|---|
| Django 設定 | settings.API_URL, settings.ALLOWED_HOSTS |
部署時透過設定/環境變數設定 |
| 環境變數 | os.environ.get('DATABASE_URL') |
部署設定 |
| 設定檔 | config.yaml, app.config['KEY'] |
伺服器端檔案 |
| 框架常數 | django.conf.settings.* |
使用者無法修改 |
| 硬編碼值 | BASE_URL = "https://api.internal" |
編譯時期常數 |
SSRF 範例 - 不是漏洞:
# 安全:URL 來自 Django 設定(伺服器控制)
response = requests.get(f"{settings.SEER_AUTOFIX_URL}{path}")
SSRF 範例 - 是漏洞:
# 有漏洞:URL 來自請求(攻擊者可控制)
response = requests.get(request.GET.get('url'))
框架已緩解的模式
在標記前請檢查語言指南。常見的誤報:
| 模式 | 為何通常安全 |
|---|---|
Django {{ variable }} |
預設自動跳脫 |
React {variable} |
預設自動跳脫 |
Vue {{ variable }} |
預設自動跳脫 |
User.objects.filter(id=input) |
ORM 參數化查詢 |
cursor.execute("...%s", (input,)) |
參數化查詢 |
innerHTML = "<b>Loading...</b>" |
常數字串,無使用者輸入 |
僅在以下情況標記:
- Django:
{{ var|safe }},{% autoescape off %},mark_safe(user_input) - React:
dangerouslySetInnerHTML={{__html: userInput}} - Vue:
v-html="userInput" - ORM:
.raw(),.extra(),RawSQL()搭配字串插值
審查流程
1. 偵測上下文
我正在審查哪種程式碼?
| 程式碼類型 | 載入這些參考 |
|---|---|
| API 端點、路由 | authorization.md, authentication.md, injection.md |
| 前端、模板 | xss.md, csrf.md |
| 檔案處理、上傳 | file-security.md |
| 密碼學、秘密、令牌 | cryptography.md, data-protection.md |
| 資料序列化 | deserialization.md |
| 外部請求 | ssrf.md |
| 業務流程 | business-logic.md |
| GraphQL、REST 設計 | api-security.md |
| 設定、標頭、CORS | misconfiguration.md |
| CI/CD、相依性 | supply-chain.md |
| 錯誤處理 | error-handling.md |
| 稽核、日誌 | logging.md |
2. 載入語言指南
根據副檔名或匯入:
| 指標 | 指南 |
|---|---|
.py, django, flask, fastapi |
languages/python.md |
.js, .ts, express, react, vue, next |
languages/javascript.md |
.go, go.mod |
languages/go.md |
.rs, Cargo.toml |
languages/rust.md |
.java, spring, @Controller |
languages/java.md |
3. 載入基礎設施指南(如適用)
| 檔案類型 | 指南 |
|---|---|
Dockerfile, .dockerignore |
infrastructure/docker.md |
| K8s 清單、Helm charts | infrastructure/kubernetes.md |
.tf, Terraform |
infrastructure/terraform.md |
GitHub Actions, .gitlab-ci.yml |
infrastructure/ci-cd.md |
| AWS/GCP/Azure 設定、IAM | infrastructure/cloud.md |
4. 標記前先研究
針對每個潛在問題,研究程式碼庫以建立信心:
- 這個值實際來自哪裡?追蹤資料流。
- 是在部署時設定的(設定、環境變數)還是來自使用者輸入?
- 其他地方是否有驗證、清理或白名單?
- 哪些框架保護措施適用?
只有在了解更廣泛的上下文後,對問題有高信心時才報告。
5. 驗證可利用性
對於每個潛在發現,確認:
輸入是否為攻擊者可控制?
| 攻擊者可控制(需調查) | 伺服器控制(通常安全) |
|---|---|
request.GET, request.POST, request.args |
settings.X, app.config['X'] |
request.json, request.data, request.body |
os.environ.get('X') |
request.headers(大部分標頭) |
硬編碼常數 |
request.cookies(未簽署) |
來自設定的內部服務 URL |
URL 路徑片段:/users/<id>/ |
來自管理員/系統的資料庫內容 |
| 檔案上傳(內容與名稱) | 已簽署的 session 資料 |
| 來自其他使用者的資料庫內容 | 框架設定 |
| WebSocket 訊息 |
框架是否緩解了這個問題?
- 檢查語言指南中的自動跳脫、參數化
- 檢查是否有清理的中介軟體/裝飾器
上游是否有驗證?
- 此程式碼之前的輸入驗證
- 清理函式庫(DOMPurify, bleach 等)
6. 僅報告高信心
跳過理論問題。僅報告在研究後確認可被利用的問題。
嚴重性分類
| 嚴重性 | 影響 | 範例 |
|---|---|---|
| 嚴重 | 直接利用、嚴重影響、無需認證 | RCE、SQL 注入導致資料外洩、認證繞過、硬編碼秘密 |
| 高 | 有條件可利用、顯著影響 | 儲存型 XSS、SSRF 到 metadata、IDOR 到敏感資料 |
| 中 | 需要特定條件、中等影響 | 反射型 XSS、CSRF 影響狀態變更操作、路徑遍歷 |
| 低 | 縱深防禦、最小直接影響 | 缺少標頭、詳細錯誤訊息、非關鍵情境中使用弱演算法 |
快速模式參考
總是標記(嚴重)
eval(user_input) # 任何語言
exec(user_input) # 任何語言
pickle.loads(user_data) # Python
yaml.load(user_data) # Python(非 safe_load)
unserialize($user_data) # PHP
deserialize(user_data) # Java ObjectInputStream
shell=True + user_input # Python subprocess
child_process.exec(user) # Node.js
總是標記(高)
innerHTML = userInput # DOM XSS
dangerouslySetInnerHTML={user} # React XSS
v-html="userInput" # Vue XSS
f"SELECT * FROM x WHERE {user}" # SQL 注入
`SELECT * FROM x WHERE ${user}` # SQL 注入
os.system(f"cmd {user_input}") # 命令注入
總是標記(秘密)
password = "hardcoded"
api_key = "sk-..."
AWS_SECRET_ACCESS_KEY = "..."
private_key = "-----BEGIN"
先檢查上下文(標記前必須調查)
# SSRF - 僅當 URL 來自使用者輸入,而非設定/設定檔
requests.get(request.GET['url']) # 標記:使用者控制的 URL
requests.get(settings.API_URL) # 安全:伺服器控制的設定
requests.get(f"{settings.BASE}/{x}") # 檢查:'x' 是否為使用者輸入?
# 路徑遍歷 - 僅當路徑來自使用者輸入
open(request.GET['file']) # 標記:使用者控制的路徑
open(settings.LOG_PATH) # 安全:伺服器控制的設定
open(f"{BASE_DIR}/{filename}") # 檢查:'filename' 是否為使用者輸入?
# 開放重定向 - 僅當 URL 來自使用者輸入
redirect(request.GET['next']) # 標記:使用者控制的重定向
redirect(settings.LOGIN_URL) # 安全:伺服器控制的設定
# 弱加密 - 僅當用於安全目的
hashlib.md5(file_content) # 安全:檔案校驗、快取
hashlib.md5(password) # 標記:密碼雜湊
random.random() # 安全:非安全用途(UI、抽樣)
random.random() for token # 標記:安全令牌需要 secrets 模組
輸出格式
## 安全審查:[檔案/元件名稱]
### 摘要
- **發現**:X 個(Y 個嚴重、Z 個高、...)
- **風險等級**:嚴重/高/中/低
- **信心**:高/混合
### 發現
#### [VULN-001] [漏洞類型](嚴重性)
- **位置**:`file.py:123`
- **信心**:高
- **問題**:[漏洞是什麼]
- **影響**:[攻擊者能做什麼]
- **證據**:
```python
[有漏洞的程式碼片段]
- 修復:[如何補救]
需驗證
[VERIFY-001] [潛在問題]
- 位置:
file.py:456 - 問題:[需要驗證什麼]
如果未發現漏洞,則陳述:「未發現高信心的漏洞。」
---
### 參考檔案
#### 核心漏洞(`references/`)
| 檔案 | 涵蓋範圍 |
|------|--------|
| `injection.md` | SQL、NoSQL、OS 命令、LDAP、模板注入 |
| `xss.md` | 反射型、儲存型、DOM 型 XSS |
| `authorization.md` | 授權、IDOR、權限提升 |
| `authentication.md` | Session、憑證、密碼儲存 |
| `cryptography.md` | 演算法、金鑰管理、隨機性 |
| `deserialization.md` | Pickle、YAML、Java、PHP 反序列化 |
| `file-security.md` | 路徑遍歷、上傳、XXE |
| `ssrf.md` | 伺服器端請求偽造 |
| `csrf.md` | 跨站請求偽造 |
| `data-protection.md` | 秘密暴露、PII、日誌 |
| `api-security.md` | REST、GraphQL、大量賦值 |
| `business-logic.md` | 競爭條件、工作流程繞過 |
| `modern-threats.md` | 原型污染、LLM 注入、WebSocket |
| `misconfiguration.md` | 標頭、CORS、除錯模式、預設值 |
| `error-handling.md` | 開放失敗、資訊揭露 |
| `supply-chain.md` | 相依性、建置安全 |
| `logging.md` | 稽核失敗、日誌注入 |
#### 語言指南(`languages/`)
- `python.md` - Django、Flask、FastAPI 模式
- `javascript.md` - Node、Express、React、Vue、Next.js
- `go.md` - Go 特定安全模式
- `rust.md` - Rust unsafe 區塊、FFI 安全
- `java.md` - Spring、Java EE 模式
#### 基礎設施(`infrastructure/`)
- `docker.md` - 容器安全
- `kubernetes.md` - K8s RBAC、秘密、政策
- `terraform.md` - IaC 安全
- `ci-cd.md` - 管線安全
- `cloud.md` - AWS/GCP/Azure 安全






