diff --git a/engineering-team/security-pen-testing/SKILL.md b/engineering-team/security-pen-testing/SKILL.md
index 50accab..458e1c0 100644
--- a/engineering-team/security-pen-testing/SKILL.md
+++ b/engineering-team/security-pen-testing/SKILL.md
@@ -60,353 +60,71 @@ python scripts/vulnerability_scanner.py --target web --scope full
python scripts/vulnerability_scanner.py --target api --scope quick --json
```
-### A01:2021 — Broken Access Control
+### Quick Reference
-**Test Procedures:**
-1. Attempt horizontal privilege escalation: access another user's resources by changing IDs
-2. Test vertical escalation: access admin endpoints with regular user tokens
-3. Verify CORS configuration — check `Access-Control-Allow-Origin` for wildcards
-4. Test forced browsing to admin pages (`/admin`, `/api/admin`, `/debug`)
-5. Modify JWT claims (`role`, `is_admin`) and replay tokens
-
-**What to Look For:**
-- Missing authorization checks on API endpoints
-- Predictable resource IDs (sequential integers vs. UUIDs)
-- Client-side only access controls (hidden UI elements without server checks)
-- CORS misconfigurations allowing arbitrary origins
-
-### A02:2021 — Cryptographic Failures
-
-**Test Procedures:**
-1. Check TLS version — reject anything below TLS 1.2
-2. Verify password hashing: bcrypt/scrypt/argon2 with adequate cost factor
-3. Look for sensitive data in URLs (tokens in query params get logged)
-4. Check for hardcoded encryption keys in source code
-5. Test for weak random number generation (Math.random() for tokens)
-
-**What to Look For:**
-- MD5/SHA1 used for password hashing
-- Secrets in environment variables without encryption at rest
-- Missing `Strict-Transport-Security` header
-- Self-signed certificates in production
-
-### A03:2021 — Injection
-
-**Test Procedures:**
-1. SQL injection: test all input fields with `' OR 1=1--` and time-based payloads
-2. NoSQL injection: test with `{"$gt": ""}` and `{"$ne": null}` in JSON bodies
-3. Command injection: test inputs with `; whoami` and backtick substitution
-4. LDAP injection: test with `*)(uid=*))(|(uid=*`
-5. Template injection: test with `{{7*7}}` and `${7*7}`
-
-**What to Look For:**
-- String concatenation in SQL queries
-- User input passed to `eval()`, `exec()`, `os.system()`
-- Unparameterized ORM queries
-- Template engines rendering user input without sandboxing
-
-### A04:2021 — Insecure Design
-
-**Test Procedures:**
-1. Review business logic flows for abuse scenarios (e.g., negative quantities in carts)
-2. Check rate limiting on sensitive operations (login, password reset, OTP)
-3. Test multi-step flows for state manipulation (skip payment step)
-4. Verify security questions aren't guessable
-
-**What to Look For:**
-- Missing rate limits on authentication endpoints
-- Business logic that trusts client-side calculations
-- Lack of account lockout after failed attempts
-- Missing CAPTCHA on public-facing forms
-
-### A05:2021 — Security Misconfiguration
-
-**Test Procedures:**
-1. Check for default credentials on admin panels
-2. Verify unnecessary HTTP methods are disabled (TRACE, DELETE on public endpoints)
-3. Check error handling — stack traces should never leak to users
-4. Review HTTP security headers (CSP, X-Frame-Options, X-Content-Type-Options)
-5. Check directory listing is disabled
-
-**What to Look For:**
-- Debug mode enabled in production
-- Default admin:admin credentials
-- Verbose error messages with stack traces
-- Missing security headers
-
-### A06:2021 — Vulnerable and Outdated Components
-
-**Test Procedures:**
-1. Run dependency audit against known CVE databases
-2. Check for end-of-life frameworks and libraries
-3. Verify transitive dependency versions
-4. Check for known vulnerable versions (e.g., Log4j 2.0-2.14.1)
+| # | Category | Key Tests |
+|---|----------|-----------|
+| A01 | Broken Access Control | IDOR, vertical escalation, CORS, JWT claim manipulation, forced browsing |
+| A02 | Cryptographic Failures | TLS version, password hashing, hardcoded keys, weak PRNG |
+| A03 | Injection | SQLi, NoSQLi, command injection, template injection, XSS |
+| A04 | Insecure Design | Rate limiting, business logic abuse, multi-step flow bypass |
+| A05 | Security Misconfiguration | Default credentials, debug mode, security headers, directory listing |
+| A06 | Vulnerable Components | Dependency audit (npm/pip/go), EOL checks, known CVEs |
+| A07 | Auth Failures | Brute force, session cookie flags, session invalidation, MFA bypass |
+| A08 | Integrity Failures | Unsafe deserialization, SRI checks, CI/CD pipeline integrity |
+| A09 | Logging Failures | Auth event logging, sensitive data in logs, alerting thresholds |
+| A10 | SSRF | Internal IP access, cloud metadata endpoints, DNS rebinding |
```bash
-# Audit a package manifest
+# Audit dependencies
python scripts/dependency_auditor.py --file package.json --severity high
python scripts/dependency_auditor.py --file requirements.txt --json
```
-### A07:2021 — Identification and Authentication Failures
-
-**Test Procedures:**
-1. Test brute force protection on login endpoints
-2. Check password policy enforcement (minimum length, complexity)
-3. Verify session invalidation on logout and password change
-4. Test "remember me" token security (HttpOnly, Secure, SameSite flags)
-5. Check multi-factor authentication bypass paths
-
-**What to Look For:**
-- Sessions that persist after logout
-- Missing `HttpOnly` and `Secure` flags on session cookies
-- Password reset tokens that don't expire
-- Username enumeration via different error messages
-
-### A08:2021 — Software and Data Integrity Failures
-
-**Test Procedures:**
-1. Check for unsigned updates or deployment artifacts
-2. Verify CI/CD pipeline integrity (signed commits, protected branches)
-3. Test deserialization endpoints with crafted payloads
-4. Check for SRI (Subresource Integrity) on CDN-loaded scripts
-
-**What to Look For:**
-- Unsafe deserialization of user input (pickle, Java serialization)
-- Missing integrity checks on downloaded artifacts
-- CI/CD pipelines running untrusted code
-- CDN scripts without SRI hashes
-
-### A09:2021 — Security Logging and Monitoring Failures
-
-**Test Procedures:**
-1. Verify authentication events are logged (success and failure)
-2. Check that logs don't contain sensitive data (passwords, tokens, PII)
-3. Test alerting thresholds (do 50 failed logins trigger an alert?)
-4. Verify log integrity — can an attacker tamper with logs?
-
-**What to Look For:**
-- Missing audit trail for admin actions
-- Passwords or tokens appearing in logs
-- No alerting on suspicious patterns
-- Logs stored without integrity protection
-
-### A10:2021 — Server-Side Request Forgery (SSRF)
-
-**Test Procedures:**
-1. Test URL input fields with internal addresses (`http://169.254.169.254/` for cloud metadata)
-2. Check for open redirect chains that reach internal services
-3. Test with DNS rebinding payloads
-4. Verify allowlist validation on outbound requests
-
-**What to Look For:**
-- User-controlled URLs passed to `fetch()`, `requests.get()`, `curl`
-- Missing allowlist on outbound HTTP requests
-- Ability to reach cloud metadata endpoints (AWS, GCP, Azure)
-- PDF generators or screenshot services that fetch arbitrary URLs
+See [owasp_top_10_checklist.md](references/owasp_top_10_checklist.md) for detailed test procedures, code patterns to detect, remediation steps, and CVSS scoring guidance for each category.
---
## Static Analysis
-### CodeQL Custom Rules
+**Recommended tools:** CodeQL (custom queries for project-specific patterns), Semgrep (rule-based scanning with auto-fix), ESLint security plugins (`eslint-plugin-security`, `eslint-plugin-no-unsanitized`).
-Write custom CodeQL queries for project-specific vulnerability patterns:
+Key patterns to detect: SQL injection via string concatenation, hardcoded JWT secrets, unsafe YAML/pickle deserialization, missing security middleware (e.g., Express without Helmet).
-```ql
-/**
- * Detect SQL injection via string concatenation
- */
-import python
-import semmle.python.dataflow.new.DataFlow
-
-from Call call, StringFormatting fmt
-where
- call.getFunc().getName() = "execute" and
- fmt = call.getArg(0) and
- exists(DataFlow::Node source |
- source.asExpr() instanceof Name and
- DataFlow::localFlow(source, DataFlow::exprNode(fmt.getAnOperand()))
- )
-select call, "Potential SQL injection: user input flows into execute()"
-```
-
-### Semgrep Custom Rules
-
-Create project-specific Semgrep rules:
-
-```yaml
-rules:
- - id: hardcoded-jwt-secret
- pattern: |
- jwt.encode($PAYLOAD, "...", ...)
- message: "JWT signed with hardcoded secret"
- severity: ERROR
- languages: [python]
-
- - id: unsafe-yaml-load
- pattern: yaml.load($DATA)
- fix: yaml.safe_load($DATA)
- message: "Use yaml.safe_load() to prevent arbitrary code execution"
- severity: WARNING
- languages: [python]
-
- - id: express-no-helmet
- pattern: |
- const app = express();
- ...
- app.listen(...)
- pattern-not: |
- const app = express();
- ...
- app.use(helmet(...));
- ...
- app.listen(...)
- message: "Express app missing helmet middleware for security headers"
- severity: WARNING
- languages: [javascript, typescript]
-```
-
-### ESLint Security Plugins
-
-Recommended configuration:
-
-```json
-{
- "plugins": ["security", "no-unsanitized"],
- "extends": ["plugin:security/recommended"],
- "rules": {
- "security/detect-object-injection": "error",
- "security/detect-non-literal-regexp": "warn",
- "security/detect-unsafe-regex": "error",
- "security/detect-buffer-noassert": "error",
- "security/detect-eval-with-expression": "error",
- "no-unsanitized/method": "error",
- "no-unsanitized/property": "error"
- }
-}
-```
+See [attack_patterns.md](references/attack_patterns.md) for code patterns and detection payloads across injection types.
---
## Dependency Vulnerability Scanning
-### Ecosystem-Specific Commands
+**Ecosystem commands:** `npm audit`, `pip audit`, `govulncheck ./...`, `bundle audit check`
+
+**CVE Triage Workflow:**
+1. **Collect** — Run ecosystem audit tools, aggregate findings
+2. **Deduplicate** — Group by CVE ID across direct and transitive deps
+3. **Prioritize** — Critical + exploitable + reachable = fix immediately
+4. **Remediate** — Upgrade, patch, or mitigate with compensating controls
+5. **Verify** — Rerun audit to confirm fix, update lock files
```bash
-# Node.js
-npm audit --json | jq '.vulnerabilities | to_entries[] | select(.value.severity == "critical")'
-
-# Python
-pip audit --format json --desc
-safety check --json
-
-# Go
-govulncheck ./...
-
-# Ruby
-bundle audit check --update
-```
-
-### CVE Triage Workflow
-
-1. **Collect**: Run ecosystem audit tools, aggregate findings
-2. **Deduplicate**: Group by CVE ID across direct and transitive deps
-3. **Score**: Use CVSS base score + environmental adjustments
-4. **Prioritize**: Critical + exploitable + reachable = fix immediately
-5. **Remediate**: Upgrade, patch, or mitigate with compensating controls
-6. **Verify**: Rerun audit to confirm fix, update lock files
-
-```bash
-# Use the dependency auditor for automated triage
python scripts/dependency_auditor.py --file package.json --severity critical --json
```
-### Known Vulnerable Patterns
-
-| Package | Vulnerable Versions | CVE | Impact |
-|---------|-------------------|-----|--------|
-| log4j-core | 2.0 - 2.14.1 | CVE-2021-44228 | RCE via JNDI injection |
-| lodash | < 4.17.21 | CVE-2021-23337 | Prototype pollution |
-| axios | < 1.6.0 | CVE-2023-45857 | CSRF token exposure |
-| pillow | < 9.3.0 | CVE-2022-45198 | DoS via crafted image |
-| express | < 4.19.2 | CVE-2024-29041 | Open redirect |
-
---
## Secret Scanning
-### TruffleHog Patterns
+**Tools:** TruffleHog (git history + filesystem), Gitleaks (regex-based with custom rules).
```bash
-# Scan git history for secrets
+# Scan git history for verified secrets
trufflehog git file://. --only-verified --json
-# Scan filesystem (no git history)
+# Scan filesystem
trufflehog filesystem . --json
```
-### Gitleaks Configuration
-
-```toml
-# .gitleaks.toml
-title = "Custom Gitleaks Config"
-
-[[rules]]
-id = "aws-access-key"
-description = "AWS Access Key ID"
-regex = '''AKIA[0-9A-Z]{16}'''
-tags = ["aws", "credentials"]
-
-[[rules]]
-id = "generic-api-key"
-description = "Generic API Key"
-regex = '''(?i)(api[_-]?key|apikey)\s*[:=]\s*['\"][a-zA-Z0-9]{20,}['\"]'''
-tags = ["api", "key"]
-
-[[rules]]
-id = "private-key"
-description = "Private Key Header"
-regex = '''-----BEGIN (RSA|EC|DSA|OPENSSH) PRIVATE KEY-----'''
-tags = ["private-key"]
-
-[allowlist]
-paths = ['''\.test\.''', '''_test\.go''', '''mock''', '''fixture''']
-```
-
-### Pre-commit Hook Integration
-
-```yaml
-# .pre-commit-config.yaml
-repos:
- - repo: https://github.com/gitleaks/gitleaks
- rev: v8.18.0
- hooks:
- - id: gitleaks
-
- - repo: https://github.com/trufflesecurity/trufflehog
- rev: v3.63.0
- hooks:
- - id: trufflehog
- args: ["git", "file://.", "--since-commit", "HEAD", "--only-verified"]
-```
-
-### CI Integration (GitHub Actions)
-
-```yaml
-name: Secret Scan
-on: [push, pull_request]
-jobs:
- scan:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
- - uses: trufflesecurity/trufflehog@main
- with:
- extra_args: --only-verified
-```
+**Integration points:** Pre-commit hooks (gitleaks, trufflehog), CI/CD gates (GitHub Actions with `trufflesecurity/trufflehog@main`). Configure `.gitleaks.toml` for custom rules (AWS keys, API keys, private key headers) and allowlists for test fixtures.
---
@@ -414,252 +132,45 @@ jobs:
### Authentication Bypass
-**JWT Manipulation:**
-1. Decode token at jwt.io — inspect claims without verification
-2. Change `alg` to `none` and remove signature: `eyJ...payload.`
-3. Change `alg` from RS256 to HS256 and sign with the public key
-4. Modify claims (`role: "admin"`, `exp: 9999999999`) and re-sign with weak secrets
-5. Test key confusion: HMAC signed with RSA public key bytes
-
-**Session Fixation:**
-1. Obtain a session token before authentication
-2. Authenticate — check if the session ID changes
-3. If the same session ID persists, the app is vulnerable to session fixation
+- **JWT manipulation:** Change `alg` to `none`, RS256-to-HS256 confusion, claim modification (`role: "admin"`, `exp: 9999999999`)
+- **Session fixation:** Check if session ID changes after authentication
### Authorization Flaws
-**IDOR (Insecure Direct Object Reference):**
-```
-GET /api/users/123/profile → 200 (your profile)
-GET /api/users/124/profile → 200 (someone else's profile — IDOR!)
-GET /api/users/124/profile → 403 (properly protected)
-```
+- **IDOR/BOLA:** Change resource IDs in every endpoint — test read, update, delete across users
+- **BFLA:** Regular user tries admin endpoints (expect 403)
+- **Mass assignment:** Add privileged fields (`role`, `is_admin`) to update requests
-Test pattern: Change numeric IDs, UUIDs, slugs in every endpoint. Use Burp Intruder or a simple script to iterate.
+### Rate Limiting & GraphQL
-**BOLA (Broken Object Level Authorization):**
-Same as IDOR but specifically in REST APIs. Test every CRUD operation:
-- Can user A read user B's resource?
-- Can user A update user B's resource?
-- Can user A delete user B's resource?
+- **Rate limiting:** Rapid-fire requests to auth endpoints; expect 429 after threshold
+- **GraphQL:** Test introspection (should be disabled in prod), query depth attacks, batch mutations bypassing rate limits
-**BFLA (Broken Function Level Authorization):**
-```
-# Regular user tries admin endpoints
-POST /api/admin/users → Should be 403
-DELETE /api/admin/users/123 → Should be 403
-PUT /api/settings/global → Should be 403
-```
-
-### Rate Limiting Validation
-
-Test rate limits on critical endpoints:
-```bash
-# Rapid-fire login attempts
-for i in $(seq 1 100); do
- curl -s -o /dev/null -w "%{http_code}" \
- -X POST https://target.com/api/login \
- -d '{"email":"test@test.com","password":"wrong"}';
-done
-# Expect: 429 after threshold (typically 5-10 attempts)
-```
-
-### Mass Assignment Detection
-
-```bash
-# Try adding admin fields to a regular update request
-PUT /api/users/profile
-{
- "name": "Normal User",
- "email": "user@test.com",
- "role": "admin", # mass assignment attempt
- "is_verified": true, # mass assignment attempt
- "subscription": "enterprise" # mass assignment attempt
-}
-```
-
-### GraphQL-Specific Testing
-
-**Introspection Query:**
-```graphql
-{
- __schema {
- types { name fields { name type { name } } }
- }
-}
-```
-Introspection should be **disabled in production**.
-
-**Query Depth Attack:**
-```graphql
-{
- user(id: 1) {
- friends {
- friends {
- friends {
- friends { # Keep nesting until server crashes
- name
- }
- }
- }
- }
- }
-}
-```
-
-**Batching Attack:**
-```json
-[
- {"query": "mutation { login(user:\"admin\", pass:\"password1\") { token } }"},
- {"query": "mutation { login(user:\"admin\", pass:\"password2\") { token } }"},
- {"query": "mutation { login(user:\"admin\", pass:\"password3\") { token } }"}
-]
-```
-Batch mutations can bypass rate limiting if counted as a single request.
+See [attack_patterns.md](references/attack_patterns.md) for complete JWT manipulation payloads, IDOR testing methodology, BFLA endpoint lists, GraphQL introspection/depth/batch attack patterns, and rate limiting bypass techniques.
---
## Web Vulnerability Testing
-### XSS (Cross-Site Scripting)
+| Vulnerability | Key Tests |
+|--------------|-----------|
+| **XSS** | Reflected (script/img/svg payloads), Stored (persistent fields), DOM-based (innerHTML + location.hash) |
+| **CSRF** | Replay without token (expect 403), cross-session token replay, check SameSite cookie attribute |
+| **SQL Injection** | Error-based (`' OR 1=1--`), union-based enumeration, time-based blind (`SLEEP(5)`), boolean-based blind |
+| **SSRF** | Internal IPs, cloud metadata endpoints (AWS/GCP/Azure), IPv6/hex/decimal encoding bypasses |
+| **Path Traversal** | `../../../etc/passwd`, URL encoding, double encoding bypasses |
-**Reflected XSS Test Payloads** (non-destructive):
-```
-
-">
-javascript:alert(document.domain)
-