检测因不安全默认配置(硬编码密钥、弱认证、宽松安全策略)导致的“故障开放”漏洞,这些漏洞使应用在生产环境中以不安全方式运行。适用于安全审计、配置管理审查或环境变量处理分析。
不安全默认配置检测
发现应用因缺少配置而以不安全方式运行的故障开放漏洞。区分可被利用的默认配置与安全故障模式(后者会安全崩溃)。
- 故障开放(严重):
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/ 和环境变量文件中搜索模式:
- 回退密钥:
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/disabled/permissive)?
→ 安全:应用崩溃或默认值安全(true/enabled/restricted)
弱加密: 安全上下文中的 MD5/SHA1/DES/RC4/ECB
→ 验证:用于密码、加密或令牌?
→ 跳过:校验和、非安全哈希
宽松访问: CORS *、权限 0777、默认公开
→ 验证:默认允许未授权访问?
→ 跳过:明确配置的宽松策略且有正当理由
调试功能: 堆栈跟踪、内省、详细错误
→ 验证:默认启用?暴露在响应中?
→ 跳过:仅日志记录,不面向用户
有关详细示例和反例,请参阅 examples.md。






