insecure-defaults

insecure-defaults

热门

检测因不安全默认配置(硬编码密钥、弱认证、宽松安全策略)导致的“故障开放”漏洞,这些漏洞使应用在生产环境中以不安全方式运行。适用于安全审计、配置管理审查或环境变量处理分析。

6336Star
545Fork
更新于 2026/7/30
SKILL.md
readonly只读
name
insecure-defaults
description

检测因不安全默认配置(硬编码密钥、弱认证、宽松安全策略)导致的“故障开放”漏洞,这些漏洞使应用在生产环境中以不安全方式运行。适用于安全审计、配置管理审查或环境变量处理分析。

不安全默认配置检测

发现应用因缺少配置而以不安全方式运行的故障开放漏洞。区分可被利用的默认配置与安全故障模式(后者会安全崩溃)。

  • 故障开放(严重): 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.*=.*trueAUTH.*=.*falseCORS.*=.*\*
  • 加密算法: 安全上下文中的 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