关于 insecure-defaults
用于防御性安全审计的技能,可检查应用和配置中的不安全默认设置。覆盖凭据暴露、故障时放行、弱加密及宽松配置,并提供严重级别和修复建议。
主要功能
- 01硬编码凭据检测
- 02默认密码检查
- 03故障时放行模式分析
- 04不安全配置检查
- 05按严重级别整理发现并给出修复建议
适用场景
- 01审计自有应用
- 02部署前检查配置
- 03验证安全合规性
- 04审查第三方组件
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ oimiragieo/ agent-studio --skill insecure-defaults安装后在 Claude Code 中输入/insecure-defaults确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
commands/insecure-defaults.mdhooks/post-execute.cjspre-execute.cjsreferences/research-requirements.mdrules/insecure-defaults.mdschemas/input.schema.jsonoutput.schema.jsonscripts/main.cjstemplates/implementation-template.md详细介绍
不安全的默认配置
安全声明
仅限授权用途:这些技能仅用于防御性安全分析和授权研究:
- 对自有应用进行配置审计
- 在 CI/CD 流水线中进行部署前安全检查
- 合规性验证(SOC2、PCI-DSS、HIPAA)
- 对第三方组件进行安全评估
- 在受控环境中用于教育目的
切勿用于:
- 未经授权利用发现的凭据
- 使用发现的默认密码访问系统
- 绕过安全控制
- 任何非法活动
步骤 1:凭据检测
硬编码凭据模式
搜索直接嵌入源代码中的凭据:
# Password patterns
grep -rnE "(password|passwd|pwd)\s*[=:]\s*['\"][^'\"]{3,}" --include="*.{js,ts,py,java,go,rb,php}" .
# API key patterns
grep -rnE "(api[_-]?key|apikey|api[_-]?secret)\s*[=:]\s*['\"][^'\"]{8,}" --include="*.{js,ts,py,java,go}" .
# Token patterns
grep -rnE "(token|secret|auth)\s*[=:]\s*['\"][A-Za-z0-9+/=]{16,}" --include="*.{js,ts,py,java,go}" .
# AWS credentials
grep -rnE "AKIA[0-9A-Z]{16}" .
grep -rnE "aws_secret_access_key\s*[=:]\s*['\"][^'\"]{20,}" .
# Private keys
grep -rnl "BEGIN (RSA |EC |DSA |OPENSSH )?PRIVATE KEY" .
# Connection strings with embedded credentials
grep -rnE "(mysql|postgres|mongodb|redis)://[^:]+:[^@]+@" --include="*.{js,ts,py,java,go,yml,yaml,json,env}" .
用于凭据检测的 Semgrep 规则
rules:
- id: hardcoded-password
message: >
Hardcoded password detected. Store passwords in environment
variables or a secrets manager (AWS Secrets Manager, HashiCorp Vault).
severity: ERROR
languages: [javascript, typescript]
metadata:
cwe: [CWE-798]
owasp: [A07:2021]
confidence: HIGH
impact: HIGH
category: security
patterns:
- pattern-either:
- pattern: |
$VAR = "..."
- pattern: |
const $VAR = "..."
- pattern: |
let $VAR = "..."
- metavariable-regex:
metavariable: $VAR
regex: (?i)(password|passwd|pwd|secret|credential|api.?key)
- pattern-not: |
$VAR = ""
- pattern-not: |
$VAR = "changeme"
- pattern-not: |
$VAR = "placeholder"
- id: hardcoded-password-in-config
message: >
Password found in configuration file. Use environment variable
references or encrypted secrets instead.
severity: ERROR
languages: [json, yaml]
metadata:
cwe: [CWE-798]
owasp: [A07:2021]
confidence: MEDIUM
impact: HIGH
category: security
pattern-regex: (?i)(password|secret|api.?key|token)\s*[:=]\s*["']?[a-zA-Z0-9+/=!@#$%^&*]{8,}
步骤 2:失效开放检测
什么是失效开放?
当错误处理默认选择授予访问权限而非拒绝访问时,就会发生失效开放。这与“失效安全”原则相反。
失效开放模式
// FAIL-OPEN: Error in auth check grants access
try {
const isAuthorized = await checkAuth(req);
if (!isAuthorized) return res.status(403).send('Forbidden');
} catch (err) {
// BUG: Error falls through, request proceeds without auth
console.log('Auth error:', err);
}
// ... handler continues, even on auth error
// FAIL-SECURE: Error in auth check denies access
try {
const isAuthorized = await checkAuth(req);
if (!isAuthorized) return res.status(403).send('Forbidden');
} catch (err) {
console.error('Auth error:', err);
return res.status(500).send('Internal error'); // DENY on error
}
用于失效开放的 Semgrep 规则
rules:
- id: fail-open-auth-catch
message: >
Authentication/authorization error is caught but execution continues.
This is a fail-open pattern. Ensure errors in auth checks result
in access denial, not access grant.
severity: ERROR
languages: [javascript, typescript]
metadata:
cwe: [CWE-636]
owasp: [A07:2021]
confidence: MEDIUM
impact: HIGH
category: security
patterns:
- pattern: |
try {
...
$AUTH(...)
...
} catch ($ERR) {
...
}
...
$RESPONSE(...)
- metavariable-regex:
metavariable: $AUTH
regex: (?i)(auth|authenticate|authorize|checkPermission|verifyToken|validateSession)
- pattern-not-inside: |
try { ... } catch ($ERR) { ... return ...; }
- pattern-not-inside: |
try { ... } catch ($ERR) { ... throw ...; }
- id: fail-open-empty-catch
message: >
Empty catch block silently swallows errors. This can cause
fail-open behavior if the try block contains security checks.
severity: WARNING
languages: [javascript, typescript]
metadata:
cwe: [CWE-390]
confidence: MEDIUM
impact: MEDIUM
category: security
pattern: |
try { ... } catch ($ERR) { }
步骤 3:不安全配置检测
常见的不安全默认配置
| 类别 | 不安全的默认配置 | 安全的替代方案 |
|---|---|---|
| CORS | origin: '*' | 明确指定允许的来源 |
| 调试 | 生产环境中设置 debug: true | debug: false |
| 绑定 | 0.0.0.0(所有接口) | 127.0.0.1 或指定的 IP 地址 |
| TLS | rejectUnauthorized: false | rejectUnauthorized: true |
| Cookie | secure: false、httpOnly: false | secure: true、httpOnly: true |
| 会话 | secret: 'keyboard cat' | 从环境变量读取随机密钥 |
| 加密 | MD5、SHA1、DES、RC4 | SHA-256+、AES-256、ChaCha20 |
| 权限 | 文件权限为 0777 | 0644 或 0600 |
| JWT | algorithm: 'none' | algorithm: 'RS256' 或 'ES256' |
| 速率限制 | 未设置速率限制 | 启用速率限制 |
| CSRF | 已禁用 CSRF 保护 | 启用 CSRF 保护 |
| Helmet | 没有安全标头 | 启用 Helmet 中间件 |
用于不安全配置的 Semgrep 规则
rules:
- id: cors-wildcard-origin
message: >
CORS allows all origins ('*'). This permits any website to make
cross-origin requests. Specify allowed origins explicitly.
severity: WARNING
languages: [javascript, typescript]
metadata:
cwe: [CWE-942]
owasp: [A05:2021]
confidence: HIGH
impact: MEDIUM
category: security
pattern-either:
- pattern: cors({ origin: '*' })
- pattern: cors({ origin: true })
- pattern: |
$RES.setHeader("Access-Control-Allow-Origin", "*")
- id: tls-verification-disabled
message: >
TLS certificate verification is disabled. This allows
man-in-the-middle attacks. Remove rejectUnauthorized: false.
severity: ERROR
languages: [javascript, typescript]
metadata:
cwe: [CWE-295]
owasp: [A02:2021]
confidence: HIGH
impact: HIGH
category: security
pattern-either:
- pattern: rejectUnauthorized: false
- pattern: process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
- pattern: process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'
- id: debug-mode-enabled
message: >
Debug mode appears to be enabled. Ensure debug mode is
disabled in production to prevent information disclosure.
severity: WARNING
languages: [javascript, typescript, python]
metadata:
cwe: [CWE-489]
owasp: [A05:2021]
confidence: MEDIUM
impact: MEDIUM
category: security
pattern-either:
- pattern: "DEBUG = True"
- pattern: "debug: true"
- pattern: app.debug = true
- id: weak-crypto-algorithm
message: >
Weak cryptographic algorithm detected. Use SHA-256 or stronger
for hashing, AES-256 for encryption.
severity: ERROR
languages: [javascript, typescript]
metadata:
cwe: [CWE-327]
owasp: [A02:2021]
confidence: HIGH
impact: HIGH
category: security
patterns:
- pattern: crypto.createHash($ALGO)
- metavariable-regex:
metavariable: $ALGO
regex: ['"]?(md5|sha1|md4|md2|ripemd)['"]?
步骤 4:环境与配置文件扫描
要检查的文件
# Environment files
find . -name "*.env*" -not -path "*/node_modules/*"
find . -name ".env.example" -o -name ".env.sample"
# Configuration files
find . -name "config.*" -o -name "settings.*" -o -name "application.*" \
| grep -E "\.(js|ts|json|yaml|yml|toml|ini|cfg)$"
# Docker configurations
find . -name "Dockerfile*" -o -name "docker-compose*"
# Cloud configurations
find . -name "*.tf" -o -name "*.tfvars" \
-o -name "serverless.*" -o -name "*.cloudformation.*"
配置审计清单
## Configuration Security Audit
### Credentials
- [ ] No hardcoded passwords in source code
- [ ] No API keys in source code
- [ ] No private keys committed
- [ ] No database credentials in config files
- [ ] .env files are in .gitignore
- [ ] .env.example has placeholder values only
### Network
- [ ] Not binding to 0.0.0.0 in production
- [ ] TLS/SSL enabled for all connections
- [ ] Certificate verification enabled
- [ ] CORS restricted to known origins
### Authentication
- [ ] Session secret is random and from env var
- [ ] JWT algorithm is not 'none'
- [ ] Password hashing uses bcrypt/argon2 (not MD5/SHA1)
- [ ] Cookie settings: secure, httpOnly, sameSite
### Error Handling
- [ ] Auth errors deny access (fail-secure)
- [ ] No empty catch blocks in security paths
- [ ] Stack traces not exposed in production
- [ ] Default error handler returns 500, not 200
### Infrastructure
- [ ] Debug mode disabled in production
- [ ] File permissions are restrictive
- [ ] Default admin accounts disabled/changed
- [ ] Rate limiting enabled
- [ ] Security headers configured (Helmet/equivalent)
步骤 5:报告
不安全默认配置报告
## Insecure Defaults Assessment
**Date**: YYYY-MM-DD
**Scope**: [project/repository]
### Summary
| Category | Findings | Critical | High | Medium | Low |
| --------------------- | -------- | -------- | ----- | ------ | ----- |
| Hardcoded credentials | X | X | X | X | X |
| Fail-open patterns | X | X | X | X | X |
| Insecure config | X | X | X | X | X |
| Weak crypto | X | X | X | X | X |
| **Total** | **X** | **X** | **X** | **X** | **X** |
### Critical Findings
[Detailed findings with remediation]
### Recommended Secure Defaults
[Project-specific secure configuration template]
## 默认凭据数据库
审计默认凭据时,请对照已知的默认凭据进行检查:
| 产品/服务 | 默认用户名 | 默认密码 |
|---|---|---|
| PostgreSQL | postgres | postgres |
| MySQL | root | (空) |
| MongoDB | (无) | (无 — 无需身份验证) |
| Redis | (无) | (无 — 无需身份验证) |
| RabbitMQ | guest | guest |
| Elasticsearch | elastic | changeme |
| Jenkins | admin | (来自初始设置) |
| Grafana | admin | admin |
规则:如果你的应用包含上述任何默认凭据,请标记为 CRITICAL。
相关技能
static-analysis- 使用 CodeQL 和 Semgrep 扫描variant-analysis- 查找不安全模式的变体semgrep-rule-creator- 自定义检测规则differential-review- 检测差异中的新增不安全默认配置security-architect- STRIDE 威胁建模auth-security-expert- 身份验证最佳实践
Agent 集成
- security-architect(主要):安全配置评估
- code-reviewer(主要):PR 中的配置审查
- penetration-tester(次要):凭据验证
- devops(次要):基础设施配置审计
铁律
- 始终将任何硬编码凭据或令牌视为 CRITICAL 发现,无论具体情况如何——“测试”或“示例”凭据经常被复制到生产环境中,必须立即修复。
- 绝不使用
rejectUnauthorized: false或同类方式绕过 TLS,即使是临时使用也不行——“临时”禁用 TLS 验证的设置经常会进入生产环境;没有安全的例外。 - 始终扫描配置文件(
.env、YAML、JSON、TOML),以及源代码——凭据嵌入在配置文件中的情况比嵌入在应用代码中更常见。 - 绝不在未运行自动化扫描工具(Semgrep、Trufflehog、git-secrets)的情况下报告“未发现问题”——仅靠人工审查会漏掉经过编码、编码或混淆处理的凭据。
- 始终验证安全检查默认以安全失败的方式运行(拒绝访问)——失效开放配置(身份验证错误时仍允许访问)是最危险的一类不安全默认配置。
反模式
| 反模式 | 失败原因 | 正确做法 |
|---|---|---|
| 将“示例”凭据视为低严重性问题 | 示例值会被复制粘贴到生产环境;JIRA/Slack 中的真实生产密钥会被“暂时”使用 | 将所有硬编码凭据标记为严重问题;如果它们出现在 git 历史记录中,立即轮换 |
| 仅手动扫描凭据 | 人眼会漏掉 Base64 编码的密钥、多行密钥以及因轮换而被掩盖的模式 | 每次提交都运行 Trufflehog + Semgrep + git-secrets;人工审查只能作为补充,绝不能取代自动扫描 |
在测试代码中使用 rejectUnauthorized: false | 测试配置会被复制粘贴到生产环境;运行时监控无法发现 TLS 绕过 | 使用 NODE_EXTRA_CA_CERTS 配置自定义 CA;绝不禁用对端验证 |
| 不检查配置文件 | 60% 以上的凭据泄露源于配置文件,而非源代码 | 明确扫描 .env、*.yaml、*.json、*.toml、docker-compose.yml |
| 假设框架默认设置是安全的 | Flask 的 debug=True、Django 的 DEBUG=True、Spring Boot 执行器——框架默认设置是为开发者优化的,并不适合生产环境 | 列出特定框架的不安全默认设置;逐项验证其是否适用于生产环境 |
记忆协议(强制)
开始之前:
阅读 .claude/context/memory/learnings.md
完成之后:
- 新模式 ->
.claude/context/memory/learnings.md - 发现问题 ->
.claude/context/memory/issues.md - 做出决策 ->
.claude/context/memory/decisions.md
假设会发生中断:如果没有记入记忆,就等于没有发生。
评论
支持 Markdown