name: insecure-defaults description: “检测失败开放的不安全默认设置(硬编码密钥、弱认证、宽松安全),这些设置允许应用程序在生产环境中不安全地运行。在审计安全、审查配置管理或分析环境变量处理时使用。” allowed-tools:
- 读取
- Grep
- Glob
- Bash
不安全默认值检测
找到失败开放漏洞,其中应用程序在缺少配置的情况下不安全运行。区分可被利用的默认值与安全崩溃的失败安全模式。
- 失败开放(严重):
SECRET = env.get('KEY') or 'default'→ 应用程序使用弱密钥运行 - 失败安全(安全):
SECRET = env['KEY']→ 如果缺失,应用程序崩溃
何时使用
- 生产应用程序的安全审计(认证、加密、API 安全)
- 部署文件、IaC 模板、Docker 配置的配置审查
- 环境变量处理和密钥管理的代码审查
- 部署前检查硬编码凭据或弱默认设置
何时不使用
不要将此技能用于:
- 测试固定装置,明确限定在测试环境中(
test/、spec/、__tests__/中的文件) - 示例/模板文件(
.example、.template、.sample后缀) - 仅开发工具(本地 Docker Compose 用于开发、调试脚本)
- 文档示例,在 README.md 或 docs/ 目录中
- 构建时配置,在部署期间被替换
- 崩溃缺失行为,其中应用程序没有适当配置不会启动(失败安全)
如有疑问:追踪代码路径以确定应用程序是否使用默认值运行或崩溃。
需要拒绝的理由
- “这只是开发默认值” → 如果它进入生产代码,就是一个发现
- “生产配置覆盖了它” → 验证生产配置是否存在;如果没有,代码级别漏洞仍然存在
- “这永远不会在没有适当配置的情况下运行” → 通过代码追踪证明;许多应用程序静默失败
- “它后面有认证” → 深度防御;被劫持的会话仍可利用弱默认值
- “我们会在发布前修复它” → 现在记录;“以后”很少实现
工作流
对每个潜在发现遵循此工作流:
1. 搜索:执行项目发现并找到不安全默认设置
确定语言、框架和项目约定。使用此信息进一步发现如密钥存储位置、密钥使用模式、凭证化第三方集成、加密和其他相关配置。进一步使用信息分析不安全默认配置。
示例
在 **/config/、**/auth/、**/database/ 和 env 文件中搜索模式:
- 备用密钥:
getenv.*\) or ['"]、process\.env\.[A-Z_]+ \|\| ['"]、ENV\.fetch.*default: - 硬编码凭据:
password.*=.*['"][^'"]{8,}['"]、api[_-]?key.*=.*['"][^'"]+['"] - 弱默认值:
DEBUG.*=.*true、AUTH.*=.*false、CORS.*=.*\* - 加密算法:
MD5|SHA1|DES|RC4|ECB在安全上下文中
根据发现结果定制搜索方法。
关注生产可达代码,而非测试固定装置或示例文件。
2. 验证:实际行为
对于每个匹配,追踪代码路径以理解运行时行为。
需要回答的问题:
- 何时执行此代码?(启动时 vs. 运行时)
- 如果配置变量缺失会发生什么?
- 是否有验证强制执行安全配置?
3. 确认:生产影响
确定此问题是否影响生产:
如果生产配置提供变量 → 较低严重性(但仍然是代码级别漏洞) 如果生产配置缺失或使用默认值 → 严重
4. 报告:带证据
示例报告:
发现:硬编码 JWT 密钥备用
位置:src/auth/jwt.ts:15
模式:const secret = process.env.JWT_SECRET || 'default';
验证:应用程序在没有 JWT_SECRET 时启动;密钥用于第 42 行的 jwt.sign()
生产影响:Dockerfile 缺少 JWT_SECRET
利用:攻击者使用 'default' 伪造 JWT,获得未授权访问
快速验证清单
备用密钥: SECRET = env.get(X) or Y
→ 验证:应用程序在没有环境变量时启动?密钥用于加密/认证?
→ 跳过:测试固定装置、示例文件
默认凭据: 硬编码 username/password 对
→ 验证:在部署配置中活跃?无运行时覆盖?
→ 跳过:禁用账户、文档示例
失败开放安全: AUTH_REQUIRED = env.get(X, 'false')
→ 验证:默认不安全(false/禁用/宽松)?
→ 安全:应用程序崩溃或默认安全(true/启用/限制)
弱加密: MD5/SHA1/DES/RC4/ECB 在安全上下文中 → 验证:用于密码、加密或令牌? → 跳过:校验和、非安全哈希
宽松访问: CORS *、权限 0777、默认公开
→ 验证:默认允许未授权访问?
→ 跳过:明确配置的宽松性且有理由
调试功能: 堆栈跟踪、自省、详细错误 → 验证:默认启用?在响应中暴露? → 跳过:仅日志记录,非用户面向
对于详细示例和反例,参见 examples.md。