security-review

security-review

熱門

安全程式碼審查,找出漏洞。當被要求進行「安全審查」、「尋找漏洞」、「檢查安全問題」、「OWASP 審查」,或審查程式碼中的注入、XSS、認證、授權、密碼學問題時使用。提供基於信心的系統化審查與報告。

850星標
0分支
更新於 2026/7/11
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 安全