安全代码审查Skill security-review

此技能用于系统性地审查代码以识别高置信度的安全漏洞,如SQL注入、XSS、SSRF、认证授权问题等,基于OWASP最佳实践和语言特定指南,提供严谨的报告流程,适用于软件开发、DevOps和网络安全领域的关键词包括:安全审计、代码漏洞检查、OWASP审查、自动安全扫描、渗透测试辅助、漏洞挖掘、合规检查。

安全审计 0 次安装 0 次浏览 更新于 3/17/2026

名称: 安全审查 描述: 用于漏洞的安全代码审查。当被要求"安全审查"、“查找漏洞”、“检查安全问题”、“审计安全”、"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安全