关于 insecure-defaults
用于安全审计的技能,可发现配置缺失时仍以弱安全或宽松设置运行的默认值问题。它强调追踪实际运行行为和生产影响,并区分失效开放与安全失败,排除测试和示例代码。
主要功能
- 01搜索回退密钥和凭据
- 02检查薄弱安全默认值
- 03追踪缺少配置时的行为
- 04评估生产环境影响
- 05排除测试夹具和示例文件
适用场景
- 01审计生产环境的身份验证设置
- 02审查部署和基础设施配置
- 03检查环境变量与密钥处理
- 04部署前检查不安全默认值
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ trailofbits/ skills --skill insecure-defaults安装后在 Claude Code 中输入/insecure-defaults确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlassets/trail-of-bits-mark.svgreferences/examples.md详细介绍
不安全默认值检测
查找因缺少配置而导致应用以不安全方式运行的失效开放漏洞。区分可被利用的默认值与会安全崩溃的失效安全模式。
- 失效开放(严重):
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/ 和 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. 验证:实际行为
对每个匹配项,跟踪代码路径以了解运行时行为。
需要回答的问题:
- 这段代码何时执行?(启动时还是运行时)
- 缺少配置变量时会发生什么?
- 是否有验证逻辑强制要求使用安全配置?
3. 确认:生产影响
确定此问题是否会影响生产环境:
如果生产配置提供了该变量 → 严重程度较低(但仍是代码层面的漏洞) 如果生产配置缺少该变量或使用默认值 → 严重
4. 报告:提供证据
报告示例:
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/已禁用/宽松)?
→ 安全:应用会崩溃,或默认配置安全(true/已启用/受限)
弱加密算法: 在安全场景中使用 MD5/SHA1/DES/RC4/ECB → 验证:是否用于密码、加密或令牌? → 跳过:校验和、非安全用途的哈希
宽松访问权限: CORS *、权限 0777、默认公开
→ 验证:默认是否允许未经授权的访问?
→ 跳过:有明确理由的显式宽松配置
调试功能: 堆栈跟踪、内省、详细错误 → 验证:是否默认启用?是否在响应中暴露? → 跳过:仅用于日志记录、不会向用户展示的内容
详细示例和反例请参阅 examples.md。