用途
insecure-defaults 用于检测“失效开放”(fail-open)的不安全默认配置,即应用在缺少配置时仍能启动,但以不安全的方式运行。它帮助识别可被利用的默认值,并与“失效安全”(fail-secure)模式区分开:后者在配置缺失时会安全地崩溃。
典型失效开放(CRITICAL):SECRET = env.get('KEY') or 'default' → 应用使用弱密钥运行。
典型失效安全(SAFE):SECRET = env['KEY'] → 缺少配置时应用崩溃。
主要能力
- 发现回退密钥、硬编码凭据、弱默认值、弱加密算法、宽松访问控制、调试特性等不安全默认配置。
- 通过代码路径追踪验证实际运行时行为。
- 确认问题是否可达生产环境,并据此评估严重程度。
- 输出带证据的报告,包含位置、模式、验证、生产影响和利用方式。
使用方式
该技能按以下工作流程执行:
-
SEARCH:执行项目发现并查找不安全默认值。确定语言、框架和项目约定,据此发现密钥存储位置、密钥使用模式、带凭据的第三方集成、加密等配置,并分析不安全默认配置。
示例搜索模式(在 /config/、/auth/、**/database/ 和 env 文件中):
- 回退密钥:
getenv.*\)或['"], process\.env\.[A-Z_]+ \|\| ['"], ENV\.fetch.*default: - 硬编码凭据:
password.*=.*['"][^'"]{8,}['"], api[_-]?key.*=.*['"][^'"]+['"] - 弱默认值:
DEBUG.*=.*true, AUTH.*=.*false, CORS.*=.*\* - 加密算法:安全上下文中的
MD5|SHA1|DES|RC4|ECB
聚焦可达生产环境的代码,而非测试夹具或示例文件。
- 回退密钥:
-
VERIFY:验证实际行为。对每个匹配项追踪代码路径,回答:代码何时执行(启动时还是运行时)?配置变量缺失时会发生什么?是否有强制安全配置的验证?
-
CONFIRM:确认生产影响。如果生产配置提供了该变量 → 严重程度较低(但仍是代码级漏洞);如果生产配置缺失或使用默认值 → CRITICAL。
-
REPORT:带证据报告。示例:
- 发现:硬编码 JWT 密钥回退
- 位置:src/auth/jwt.ts:15
- 模式:
const secret = process.env.JWT_SECRET || 'default'; - 验证:应用在没有 JWT_SECRET 时启动;密钥在第 42 行用于 jwt.sign()
- 生产影响:Dockerfile 缺少 JWT_SECRET
- 利用方式:攻击者使用 'default' 伪造 JWT,获得未授权访问
适用场景
- 生产应用的安全审计(认证、加密、API 安全)
- 部署文件、IaC 模板、Docker 配置的配置审查
- 环境变量处理和密钥管理的代码审查
- 部署前对硬编码凭据或弱默认值的检查
限制
以下情况不应使用该技能:
- 明确限定于测试环境的测试夹具(test/、spec/、tests/ 中的文件)
- 示例/模板文件(.example、.template、.sample 后缀)
- 仅开发工具(本地开发用 Docker Compose、调试脚本)
- README.md 或 docs/ 目录中的文档示例
- 部署期间会被替换的构建时配置
- 缺少配置即崩溃的失效安全行为
当不确定时:追踪代码路径,判断应用是使用默认值运行还是崩溃。
需拒绝的合理化借口
- “这只是开发默认值” → 如果它进入生产代码,就是发现项
- “生产配置会覆盖它” → 验证生产配置是否存在;若不存在,代码级漏洞仍然存在
- “没有正确配置它绝不会运行” → 用代码追踪证明;许多应用会静默失败
- “它在认证之后” → 纵深防御;会话被攻破仍可利用弱默认值
- “我们会在发布前修复” → 现在就记录;“以后”很少到来
快速验证清单
- 回退密钥:
SECRET = env.get(X) or Y→ 验证:应用在没有环境变量时启动?密钥用于加密/认证?→ 跳过:测试夹具、示例文件 - 默认凭据:硬编码用户名/密码对 → 验证:在部署配置中生效?无运行时覆盖?→ 跳过:已禁用账户、文档示例
- 失效开放安全:
AUTH_REQUIRED = env.get(X, 'false')→ 验证:默认不安全(false/disabled/permissive)?→ 安全:应用崩溃或默认安全(true/enabled/restricted) - 弱加密:安全上下文中的 MD5/SHA1/DES/RC4/ECB → 验证:用于密码、加密或令牌?→ 跳过:校验和、非安全哈希
- 宽松访问:CORS *、权限 0777、默认公开 → 验证:默认允许未授权访问?→ 跳过:有正当理由的显式配置宽松
- 调试特性:堆栈跟踪、内省、详细错误 → 验证:默认启用?在响应中暴露?→ 跳过:仅日志、非面向用户
更多详细示例和反例,请参见 examples.md。