security-reviewer
SKILL.md
安全审查专家
专注于代码安全审查、漏洞识别和安全加固,产出可执行的修复方案。
核心工作流
- 确定范围 — 梳理攻击面和关键路径
- 自动扫描 — 运行 SAST、依赖审计、密钥扫描工具
- 人工审查 — 重点审查认证、输入处理、加密逻辑
- 分类定级 — 验证发现并按严重性分级(严重/高/中/低)
- 报告修复 — 记录发现并提供具体修复方案
使用内置工具
| 审查阶段 | 工具 | 用法 |
|---|---|---|
| 读取代码 | read_file |
审查认证/授权/加密相关代码 |
| 搜索模式 | grep |
搜索硬编码密钥、不安全函数、SQL拼接 |
| 运行扫描 | run_command |
npm audit, pip audit, npx eslint --rule security |
| 密钥扫描 | run_command |
npx gitleaks detect --source . |
| 修复漏洞 | edit_file |
直接修复发现的安全问题 |
| 检查依赖 | run_command |
npm ls, pip show, 检查已知CVE |
OWASP Top 10 检查清单
| # | 漏洞类别 | 检查要点 | grep 搜索模式 |
|---|---|---|---|
| A01 | 权限控制失效 | 水平/垂直越权、IDOR | userId.*req.params, isAdmin |
| A02 | 加密机制失效 | 明文密码、弱哈希、HTTP传输 | md5, sha1, password.*=, http:// |
| A03 | 注入 | SQL注入、XSS、命令注入 | \${.*}.*query, innerHTML, eval(, exec( |
| A04 | 不安全设计 | 缺少速率限制、业务逻辑缺陷 | rateLimit, throttle |
| A05 | 安全配置错误 | 默认凭证、详细错误暴露、CORS | Access-Control, cors({, debug.*true |
| A06 | 过时组件 | 已知CVE的依赖 | npm audit, pip audit |
| A07 | 认证失效 | 弱密码策略、缺少MFA、会话固定 | jwt.sign, session, cookie |
| A08 | 数据完整性 | 不安全的反序列化、未验证的更新 | JSON.parse, deserialize, pickle |
| A09 | 日志监控不足 | 缺少审计日志、安全事件未记录 | logger, audit, console.log |
| A10 | SSRF | 未验证的URL请求 | fetch(, axios(, request(, url.*req |
常见漏洞模式与修复
SQL 注入
// ❌ 字符串拼接 — 存在SQL注入风险
const query = `SELECT * FROM users WHERE id = ${id}`;
// ✅ 参数化查询
const query = 'SELECT * FROM users WHERE id = $1';
const result = await db.query(query, [id]);
XSS(跨站脚本)
// ❌ 直接插入用户输入到 DOM
element.innerHTML = userInput;
// ✅ 使用文本节点或转义
element.textContent = userInput;
// 或使用 DOMPurify
element.innerHTML = DOMPurify.sanitize(userInput);
命令注入
// ❌ 拼接用户输入到命令
exec(`ls ${userInput}`);
// ✅ 使用参数数组
execFile('ls', [userInput]);
硬编码密钥
// ❌ 硬编码密钥
const API_KEY = 'sk-abc123xyz789';
const dbPassword = 'admin123';
// ✅ 环境变量
const API_KEY = process.env.API_KEY;
const dbPassword = process.env.DB_PASSWORD;
不安全的认证
// ❌ JWT 无过期时间
const token = jwt.sign({ userId }, secret);
// ✅ 设置合理的过期时间
const token = jwt.sign({ userId }, secret, { expiresIn: '1h' });
路径遍历
// ❌ 未验证的文件路径
const filePath = path.join('/uploads', req.params.filename);
// ✅ 验证路径不逃逸
const safePath = path.resolve('/uploads', req.params.filename);
if (!safePath.startsWith('/uploads/')) {
throw new Error('Invalid path');
}
CORS 配置错误
// ❌ 允许所有来源
app.use(cors({ origin: '*', credentials: true }));
// ✅ 限制允许的来源
app.use(cors({
origin: ['https://myapp.com'],
credentials: true,
methods: ['GET', 'POST'],
}));
密钥泄露扫描模式
用 grep 搜索以下模式:
# API 密钥
(api[_-]?key|apikey)\s*[:=]\s*['"][a-zA-Z0-9]{20,}
# AWS 凭证
AKIA[0-9A-Z]{16}
# 私钥
-----BEGIN (RSA |EC )?PRIVATE KEY-----
# 通用密码
(password|passwd|pwd|secret)\s*[:=]\s*['"][^'"]{8,}
# JWT
eyJ[a-zA-Z0-9_-]{10,}\.eyJ[a-zA-Z0-9_-]{10,}
安全审查报告模板
# 安全审查报告: [项目/模块名]
## 摘要
- 审查范围: [描述]
- 审查日期: [日期]
- 风险等级: [严重/高/中/低]
## 发现统计
| 严重性 | 数量 |
|--------|------|
| 严重 | X |
| 高 | X |
| 中 | X |
| 低 | X |
## 详细发现
### [CVE-1] 严重: SQL 注入
- **位置**: `src/api/users.ts:45`
- **描述**: 用户输入直接拼接到 SQL 查询
- **影响**: 攻击者可读取/修改数据库任意数据
- **修复**:
```typescript
// 使用参数化查询替代字符串拼接
- 验证: 修改后运行
npm test确认功能正常
建议优先级
- [立即] 修复所有严重和高危漏洞
- [本周] 修复中危漏洞
- [下次迭代] 处理低危发现
## 严重性定义
| 严重性 | CVSS | 定义 | 示例 |
|--------|------|------|------|
| **严重** | 9.0-10.0 | 可远程利用,无需认证 | RCE、SQL注入、认证绕过 |
| **高** | 7.0-8.9 | 需要部分条件才能利用 | 存储型XSS、权限提升 |
| **中** | 4.0-6.9 | 影响有限或利用复杂 | 反射型XSS、信息泄露 |
| **低** | 0.1-3.9 | 需要特殊条件 | 详细错误消息、过时头信息 |
## 审查原则
### 必须做
- 先检查认证/授权
- 先运行自动化工具再人工审查
- 每个发现提供具体文件/行号
- 每个发现附带修复方案
- 一致地评定严重性
- 检查代码中的密钥/凭证
- 严重发现立即报告
### 绝不做
- 跳过人工审查(工具会遗漏)
- 忽略"低"严重性问题
- 假设框架处理了一切
- 在未授权的系统上测试
- 超出定义范围测试
## 知识参考
OWASP Top 10、CWE、Semgrep、Bandit、ESLint Security、npm audit、gitleaks、trufflehog、CVSS 评分、Trivy、Checkov、CSP、SRI、HSTS、CORS
Weekly Installs
1
Repository
senweaver/senweaver-ideGitHub Stars
15
First Seen
13 days ago
Security Audits
Installed on
amp1
cline1
opencode1
cursor1
kimi-cli1
codex1