SKILL.md
readonly只读
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 图表 | 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>/ |
来自管理员/系统的数据库内容 |
| 文件上传(内容和名称) | 签名的会话数据 |
| 来自其他用户的数据库内容 | 框架设置 |
| WebSocket 消息 |
框架是否缓解了此问题?
- 检查语言指南中的自动转义、参数化
- 检查是否存在清理的中间件/装饰器
上游是否有验证?
- 此代码之前的输入验证
- 清理库(DOMPurify, bleach 等)
6. 仅报告高置信度
跳过理论问题。仅报告研究后确认可利用的问题。
严重性分类
| 严重性 | 影响 | 示例 |
|---|---|---|
| 严重 | 直接利用,严重影响,无需认证 | RCE、SQL 注入导致数据泄露、认证绕过、硬编码密钥 |
| 高 | 有条件可利用,影响显著 | 存储型 XSS、SSRF 到元数据、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、操作系统命令、LDAP、模板注入 |
| `xss.md` | 反射型、存储型、基于 DOM 的 XSS |
| `authorization.md` | 授权、IDOR、权限提升 |
| `authentication.md` | 会话、凭证、密码存储 |
| `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 安全






