SuperAPI AI 工具集

insecure-defaults

安全与审计

查看项目

更新于 10-16 02:23

技能介绍

用途

insecure-defaults 用于检测“失效开放”(fail-open)的不安全默认配置,即应用在缺少配置时仍能启动,但以不安全的方式运行。它帮助识别可被利用的默认值,并与“失效安全”(fail-secure)模式区分开:后者在配置缺失时会安全地崩溃。

典型失效开放(CRITICAL):SECRET = env.get('KEY') or 'default' → 应用使用弱密钥运行。 典型失效安全(SAFE):SECRET = env['KEY'] → 缺少配置时应用崩溃。

主要能力

  • 发现回退密钥、硬编码凭据、弱默认值、弱加密算法、宽松访问控制、调试特性等不安全默认配置。
  • 通过代码路径追踪验证实际运行时行为。
  • 确认问题是否可达生产环境,并据此评估严重程度。
  • 输出带证据的报告,包含位置、模式、验证、生产影响和利用方式。

使用方式

该技能按以下工作流程执行:

  1. 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

    聚焦可达生产环境的代码,而非测试夹具或示例文件。

  2. VERIFY:验证实际行为。对每个匹配项追踪代码路径,回答:代码何时执行(启动时还是运行时)?配置变量缺失时会发生什么?是否有强制安全配置的验证?

  3. CONFIRM:确认生产影响。如果生产配置提供了该变量 → 严重程度较低(但仍是代码级漏洞);如果生产配置缺失或使用默认值 → CRITICAL。

  4. 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。