用途
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。
限制
资料未提供该技能的安装命令、收费方式、价格、支持平台或效果数据,暂未提供。
引用文档
以下为作者声明的引用来源,保留指定版本、署名和许可。
- trailofbits/skills/plugins/insecure-defaults/skills/insecure-defaults/SKILL.md — 署名:Trail of Bits;许可:CC-BY-SA-4.0;版本:
5c15f4f5644b4bd3d48882a802a7232d501852b6。