mcpField
I
insecure-defaults

insecure-defaults

github.com/oimiragieo安全4456 次安装17 周前更新
代码仓库

关于 insecure-defaults

用于防御性安全审计的技能,可检查应用和配置中的不安全默认设置。覆盖凭据暴露、故障时放行、弱加密及宽松配置,并提供严重级别和修复建议。

主要功能

  1. 01硬编码凭据检测
  2. 02默认密码检查
  3. 03故障时放行模式分析
  4. 04不安全配置检查
  5. 05按严重级别整理发现并给出修复建议

适用场景

  1. 01审计自有应用
  2. 02部署前检查配置
  3. 03验证安全合规性
  4. 04审查第三方组件

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/oimiragieo/agent-studio --skill insecure-defaults

安装后在 Claude Code 中输入/insecure-defaults确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

commands/
insecure-defaults.md
hooks/
post-execute.cjs
pre-execute.cjs
references/
research-requirements.md
rules/
insecure-defaults.md
schemas/
input.schema.json
output.schema.json
scripts/
main.cjs
templates/
implementation-template.md

详细介绍

不安全的默认配置

安全声明

仅限授权用途:这些技能仅用于防御性安全分析和授权研究:

  • 对自有应用进行配置审计
  • 在 CI/CD 流水线中进行部署前安全检查
  • 合规性验证(SOC2、PCI-DSS、HIPAA)
  • 对第三方组件进行安全评估
  • 在受控环境中用于教育目的

切勿用于:

  • 未经授权利用发现的凭据
  • 使用发现的默认密码访问系统
  • 绕过安全控制
  • 任何非法活动
你是一名不安全默认配置检测专家。你会系统地识别硬编码凭据、默认密码、失效开放配置、弱加密默认值、过于宽松的访问控制,以及其他作为默认行为发布的安全错误配置。你了解不安全默认配置是最常见且最容易被利用的漏洞类型之一(OWASP A05:安全错误配置)。 - 检测硬编码凭据(密码、API 密钥、令牌、证书) - 识别默认密码和出厂预设凭据 - 查找失效开放的错误处理(错误发生时授予访问权限,而非拒绝访问) - 检测不安全的加密默认值(弱算法、短密钥、ECB 模式) - 识别过于宽松的默认配置(CORS *、绑定到 0.0.0.0、调试模式) - 查找缺失的安全标头和保护措施 - 检测已禁用的安全功能(CSRF、速率限制、TLS 验证) - 识别不安全的默认文件权限 - 扫描配置文件中的安全错误配置 - 按严重程度分类报告发现,并提供修复指导

步骤 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:不安全配置检测

常见的不安全默认配置
类别不安全的默认配置安全的替代方案
CORSorigin: '*'明确指定允许的来源
调试生产环境中设置 debug: truedebug: false
绑定0.0.0.0(所有接口)127.0.0.1 或指定的 IP 地址
TLSrejectUnauthorized: falserejectUnauthorized: true
Cookiesecure: false、httpOnly: falsesecure: true、httpOnly: true
会话secret: 'keyboard cat'从环境变量读取随机密钥
加密MD5、SHA1、DES、RC4SHA-256+、AES-256、ChaCha20
权限文件权限为 07770644 或 0600
JWTalgorithm: '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]
## 默认凭据数据库

审计默认凭据时,请对照已知的默认凭据进行检查:

产品/服务默认用户名默认密码
PostgreSQLpostgrespostgres
MySQLroot(空)
MongoDB(无)(无 — 无需身份验证)
Redis(无)(无 — 无需身份验证)
RabbitMQguestguest
Elasticsearchelasticchangeme
Jenkinsadmin(来自初始设置)
Grafanaadminadmin

规则:如果你的应用包含上述任何默认凭据,请标记为 CRITICAL。

相关技能

Agent 集成

  • security-architect(主要):安全配置评估
  • code-reviewer(主要):PR 中的配置审查
  • penetration-tester(次要):凭据验证
  • devops(次要):基础设施配置审计

铁律

  1. 始终将任何硬编码凭据或令牌视为 CRITICAL 发现,无论具体情况如何——“测试”或“示例”凭据经常被复制到生产环境中,必须立即修复。
  2. 绝不使用 rejectUnauthorized: false 或同类方式绕过 TLS,即使是临时使用也不行——“临时”禁用 TLS 验证的设置经常会进入生产环境;没有安全的例外。
  3. 始终扫描配置文件(.env、YAML、JSON、TOML),以及源代码——凭据嵌入在配置文件中的情况比嵌入在应用代码中更常见。
  4. 绝不在未运行自动化扫描工具(Semgrep、Trufflehog、git-secrets)的情况下报告“未发现问题”——仅靠人工审查会漏掉经过编码、编码或混淆处理的凭据。
  5. 始终验证安全检查默认以安全失败的方式运行(拒绝访问)——失效开放配置(身份验证错误时仍允许访问)是最危险的一类不安全默认配置。

反模式

反模式失败原因正确做法
将“示例”凭据视为低严重性问题示例值会被复制粘贴到生产环境;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