名称: insecure-defaults
描述: "检测允许应用在生产环境中不安全运行的'故障开放'不安全默认配置(硬编码密钥、弱身份验证、宽松安全设置)。适用于安全审计、配置管理审查或环境变量处理分析。"
允许工具:
- Read
- Grep
- Glob
- Bash
发现因配置缺失导致应用不安全运行的故障开放漏洞。区分可被利用的默认配置与安全崩溃的故障安全模式。
SECRET = env.get('KEY') or 'default' → 应用使用弱密钥运行SECRET = env['KEY'] → 配置缺失时应用崩溃请勿将此技能用于:
- 明确限定于测试环境的测试固件(位于 test/、spec/、__tests__/ 目录的文件)
- 示例/模板文件(后缀为 .example、.template、.sample)
- 仅限开发使用的工具(本地开发用Docker Compose、调试脚本)
- README.md或docs/目录中的文档示例
- 在部署期间会被替换的构建时配置
- 缺少配置时应用无法启动的行为(故障安全)
如有疑问:追踪代码路径以确定应用是使用默认值运行还是崩溃。
对每个潜在发现项遵循此工作流程:
确定语言、框架和项目约定。利用这些信息进一步发现密钥存储位置、密钥使用模式、需要凭据的第三方集成、加密以及其他相关配置。进一步分析不安全默认配置。
示例
在 **/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
根据发现结果调整搜索方法。
重点关注生产环境可访问的代码,而非测试固件或示例文件。
对每个匹配项,追踪代码路径以理解运行时行为。
需要回答的问题:
- 此代码何时执行?(启动时 vs. 运行时)
- 如果配置变量缺失会发生什么?
- 是否有强制实施安全配置的验证?
确定此问题是否影响生产环境:
如果生产配置提供了该变量 → 较低严重性(但仍是代码级漏洞)
如果生产配置缺失或使用默认值 → 严重
报告示例:
发现项:硬编码的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。