SuperAPI AI 工具集

insecure-defaults

安全与审计

查看项目

更新于 10-16 23:14

技能介绍

用途

insecure-defaults 用于发现“失败开放”(fail-open)类型的安全漏洞:应用在缺少配置的情况下仍以不安全方式继续运行。该技能的核心目标是区分真正可利用的不安全默认值与“安全失败”(fail-secure)模式,后者在缺少必要配置时会安全地崩溃。

两类模式的对照:

  • 失败开放(CRITICAL): SECRET = env.get('KEY') or 'default',应用会带着弱密钥继续运行。
  • 安全失败(SAFE): SECRET = env['KEY'],缺少该变量时应用直接崩溃。

适用场景

根据资料,该技能适用于:

  • 生产应用的安全审计,包括认证、加密与 API 安全。
  • 部署文件、IaC 模板与 Docker 配置的配置审查。
  • 针对环境变量处理与密钥管理的代码审查。
  • 上线前对硬编码凭据或弱默认值的检查。

不适用场景

资料明确列出以下情况不应使用该技能:

  • 明确限定于测试环境的测试夹具(如 test/、spec/、__tests__/ 目录中的文件)。
  • 示例/模板文件(后缀为 .example、.template、.sample)。
  • 仅用于开发的工具(例如用于本地开发的 Docker Compose、调试脚本)。
  • README.md 或 docs/ 目录中的文档示例。
  • 在部署期间会被替换的构建期配置。
  • 缺少配置即崩溃的行为,即应用没有正确配置就无法启动(fail-secure)。

遇到不确定的情况,应追踪代码路径,判断应用是会带着默认值继续运行,还是会崩溃。

应拒绝的常见辩解

  • “这只是开发用默认值” → 只要它进入生产代码,就是一处发现。
  • “生产配置会覆盖它” → 需核实生产配置确实存在;若不存在,代码层面的漏洞依然成立。
  • “没有正确配置它绝不会运行” → 用代码追踪来证明;许多应用会静默失败。
  • “它在认证之后” → 纵深防御;被攻陷的会话仍可利用弱默认值。
  • “我们会在发布前修复” → 现在就记录;“以后”很少到来。

工作流程

对每一处潜在发现,按以下流程处理:

1. SEARCH:项目发现并查找不安全默认值

先确定语言、框架与项目约定,再据此进一步发现密钥存储位置、密钥使用模式、带凭据的第三方集成、加密以及其他相关配置,并分析不安全的默认配置。

示例:在 **/config/、**/auth/、**/database/ 以及 env 文件中搜索以下模式:

  • 回退密钥: getenv.*\) or ['"]、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:带证据报告

报告示例:

Finding: Hardcoded JWT Secret Fallback
Location: src/auth/jwt.ts:15
Pattern: const secret = process.env.JWT_SECRET || 'default';

Verification: App starts without JWT_SECRET; secret used in jwt.sign() at line 42
Production Impact: Dockerfile missing JWT_SECRET
Exploitation: Attacker forges JWTs using 'default', gains unauthorized access

快速核查清单

  • 回退密钥: 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。

限制

资料未提供该技能的安装命令、收费方式、价格、支持平台或效果数据,暂未提供。

引用文档

以下为作者声明的引用来源,保留指定版本、署名和许可。

作者的来源声明