名称: 安全审查 描述: 用于漏洞的安全代码审查。当被要求"安全审查"、“查找漏洞”、“检查安全问题”、“审计安全”、"OWASP审查"或审查代码中的注入、XSS、认证、授权、密码学问题时使用。提供基于置信度的系统性审查报告。 允许工具: 读取、搜索、全局匹配、Bash、任务 许可证: LICENSE
<!– 基于OWASP备忘单系列(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子进程
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-based 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不安全块、FFI安全
- `java.md` - Spring、Java EE模式
### 基础设施(`infrastructure/`)
- `docker.md` - 容器安全
- `kubernetes.md` - K8s RBAC、秘密、策略
- `terraform.md` - IaC安全
- `ci-cd.md` - 管道安全
- `cloud.md` - AWS/GCP/Azure安全