security-review

security-review

热门

安全代码审查,用于发现漏洞。当被要求进行“安全审查”、“查找漏洞”、“检查安全问题”、“审计安全”、“OWASP审查”或审查代码中的注入、XSS、认证、授权、加密问题时使用。提供基于置信度的系统性审查报告。

850Star
0Fork
更新于 2026/7/11
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 安全