ClawSkills logoClawSkills

Insecure Defaults Detection

检测 fail-open 不安全默认设置(硬编码密钥、弱身份验证、宽松的安全策略),这些设置允许应用程序在生产环境中不安全地运行。在审计安全时使用

介绍

# Insecure Defaults Detection

查找应用程序在配置缺失情况下以不安全方式运行的**故障开放(fail-open)**漏洞。区分可利用的默认值与安全崩溃的故障安全模式。

- **故障开放 (CRITICAL):** `SECRET = env.get('KEY') or 'default'` → 应用程序使用弱密钥运行 - **故障安全 (SAFE):** `SECRET = env['KEY']` → 如果缺失则应用程序崩溃

## 何时使用

- 对生产应用程序进行**安全审计**(身份验证、加密、API 安全) - 对部署文件、基础架构即代码模板、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.*=.*true`、`AUTH.*=.*false`、`CORS.*=.*\*` - **加密算法:** 安全上下文中的 `MD5|SHA1|DES|RC4|ECB`

根据发现结果调整搜索方法。

重点关注生产可达的代码,而非测试装置或示例文件。

### 2. 验证:实际行为

对于每个匹配项,追踪代码路径以了解运行时行为。

**需回答的问题:** - 此代码何时执行?(启动时 vs 运行时) - 如果配置变量缺失会发生什么? - 是否有强制执行安全配置的验证?

### 3. 确认:生产影响

确定此问题是否影响生产环境:

如果生产配置提供了该变量 → 降低严重性(但仍是代码级别漏洞) 如果生产配置缺失或使用默认值 → CRITICAL

### 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/disabled/permissive)? → 安全:应用程序崩溃或默认值是安全的(true/enabled/restricted)

**弱加密:** 安全上下文中的 MD5/SHA1/DES/RC4/ECB → 验证:是否用于密码、加密或令牌? → 跳过:校验和、非安全哈希

**宽松访问:** CORS `*`、权限 `0777`、默认公开 → 验证:默认值是否允许未授权访问? → 跳过:有理由证明的显式配置宽松

**调试功能:** 堆栈跟踪、内省、详细错误 → 验证:默认是否启用?是否在响应中暴露? → 跳过:仅限日志记录、非面向用户

有关详细示例和反例,请参阅 [examples.md](references/examples.md)。

更多产品