Security
insecure-defaults
Detects fail-open insecure defaults
---
name: insecure-defaults
description: "Detects fail-open insecure defaults (hardcoded secrets, weak auth, permissive security) that allow apps to run insecurely in production. Use when auditing security, reviewing config management, or analyzing environment variable handling."
allowed-tools:
- Read
- Grep
- Glob
- Bash
---
# Insecure Defaults Detection
Finds **fail-open** vulnerabilities where apps run insecurely with missing configuration. Distinguishes exploitable defaults from fail-secure patterns that crash safely.
- **Fail-open (CRITICAL):** `SECRET = env.get('KEY') or 'default'` β App runs with weak secret
- **Fail-secure (SAFE):** `SECRET = env['KEY']` β App crashes if missing
## When to Use
- **Security audits** of production applications (auth, crypto, API security)
- **Configuration review** of deployment files, IaC templates, Docker configs
- **Code review** of environment variable handling and secrets management
- **Pre-deployment checks** for hardcoded credentials or weak defaults
## When NOT to Use
Do not use this skill for:
- **Test fixtures** explicitly scoped to test environments (files in `test/`, `spec/`, `__tests__/`)
- **Example/template files** (`.example`, `.template`, `.sample` suffixes)
- **Development-only tools** (local Docker Compose for dev, debug scripts)
- **Documentation examples** in README.md or docs/ directories
- **Build-time configuration** that gets replaced during deployment
- **Crash-on-missing behavior** where app won't start without proper config (fail-secure)
When in doubt: trace the code path to determine if the app runs with the default or crashes.
## Rationalizations to Reject
- **"It's just a development default"** β If it reaches production code, it's a finding
- **"The production config overrides it"** β Verify prod config exists; code-level vulnerability remains if not
- **"This would never run without proper config"** β Prove it with code trace; many apps fail silently
- **"It's behind authentication"** β Defense in depth; compromised session still exploits weak defaults
- **"We'll fix it before release"** β Document now; "later" rarely comes
## Workflow
Follow this workflow for every potential finding:
### 1. SEARCH: Perform Project Discovery and Find Insecure Defaults
Determine language, framework, and project conventions. Use this information to further discover things like secret storage locations, secret usage patterns, credentialed third-party integrations, cryptography, and any other relevant configuration. Further use information to analyze insecure default configurations.
**Example**
Search for patterns in `**/config/`, `**/auth/`, `**/database/`, and env files:
- **Fallback secrets:** `getenv.*\) or ['"]`, `process\.env\.[A-Z_]+ \|\| ['"]`, `ENV\.fetch.*default:`
- **Hardcoded credentials:** `password.*=.*['"][^'"]{8,}['"]`, `api[_-]?key.*=.*['"][^'"]+['"]`
- **Weak defaults:** `DEBUG.*=.*true`, `AUTH.*=.*false`, `CORS.*=.*\*`
- **Crypto algorithms:** `MD5|SHA1|DES|RC4|ECB` in security contexts
Tailor search approach based on discovery results.
Focus on production-reachable code, not test fixtures or example files.
### 2. VERIFY: Actual Behavior
For each match, trace the code path to understand runtime behavior.
**Questions to answer:**
- When is this code executed? (Startup vs. runtime)
- What happens if a configuration variable is missing?
- Is there validation that enforces secure configuration?
### 3. CONFIRM: Production Impact
Determine if this issue reaches production:
If production config provides the variable β Lower severity (but still a code-level vulnerability)
If production config missing or uses default β CRITICAL
### 4. REPORT: with Evidence
**Example 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
```
## Quick Verification Checklist
**Fallback Secrets:** `SECRET = env.get(X) or Y`
β Verify: App starts without env var? Secret used in crypto/auth?
β Skip: Test fixtures, example files
**Default Credentials:** Hardcoded `username`/`password` pairs
β Verify: Active in deployed config? No runtime override?
β Skip: Disabled accounts, documentation examples
**Fail-Open Security:** `AUTH_REQUIRED = env.get(X, 'false')`
β Verify: Default is insecure (false/disabled/permissive)?
β Safe: App crashes or default is secure (true/enabled/restricted)
**Weak Crypto:** MD5/SHA1/DES/RC4/ECB in security contexts
β Verify: Used for passwords, encryption, or tokens?
β Skip: Checksums, non-security hashing
**Permissive Access:** CORS `*`, permissions `0777`, public-by-default
β Verify: Default allows unauthorized access?
β Skip: Explicitly configured permissiveness with justification
**Debug Features:** Stack traces, introspection, verbose errors
β Verify: Enabled by default? Exposed in responses?
β Skip: Logging-only, not user-facing
For detailed examples and counter-examples, see [examples.md](references/examples.md).
security
By
Comments
Sign in to leave a comment