| name | security-pipeline |
| description | Use when security verification is needed - pre-commit security checks, vulnerability scanning, STRIDE threat analysis. Integrates with /handoff-verify --security and /commit-push-pr. CWE Top 25 based. |
| version | 2.0.0 |
Overview
๋ณด์ ํ์ดํ๋ผ์ธ ์คํฌ์ ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋์ผ๋ก CWE Top 25 ๊ธฐ๋ฐ ๋ณด์ ๊ฒ์ฆ์ ์ํํ๋ค.
/handoff-verify --security, /commit-push-pr ์คํ ์ ํตํฉ ๋์ํ๋ค.
๋ณด์ ์ฒดํฌ๋ฆฌ์คํธ ์ฐธ์กฐ: ~/.claude/skills/_reference/security-checklist.md
effort:max๊ฐ ํญ์ ๊ฐ์ ์ ์ฉ๋๋ค. ๋ณด์ ๊ฒ์ฆ์ ์ถ์ฝํ์ง ์๋๋ค.
Trigger Conditions
ํ์ผ ํจํด ๊ธฐ๋ฐ ์๋ ํธ๋ฆฌ๊ฑฐ
๋ค์ ํจํด์ ํฌํจํ๋ ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ณด์ ํ์ดํ๋ผ์ธ์ด ์๋์ผ๋ก ์คํ๋๋ค:
| ํจํด | ํธ๋ฆฌ๊ฑฐ ์์ค | ์ค๋ช
|
|---|
**/auth/** | Full Scan | ์ธ์ฆ ๊ด๋ จ ๋ชจ๋ |
**/payment/** | Full Scan | ๊ฒฐ์ ์ฒ๋ฆฌ ๋ชจ๋ |
**/api/** | CWE Scan | API ์๋ํฌ์ธํธ |
**/middleware/** | CWE Scan | ๋ฏธ๋ค์จ์ด |
**/session* | CWE Scan | ์ธ์
๊ด๋ฆฌ |
**/token* | CWE Scan | ํ ํฐ ์ฒ๋ฆฌ |
**/crypto* | CWE Scan | ์ํธํ ๋ก์ง |
**/admin/** | Full + STRIDE | ๊ด๋ฆฌ์ ๊ธฐ๋ฅ |
**/upload* | CWE Scan | ํ์ผ ์
๋ก๋ |
**/.env* | Credential Scan | ํ๊ฒฝ๋ณ์ ํ์ผ |
**/config/secret* | Credential Scan | ์ํฌ๋ฆฟ ์ค์ |
์ปค๋ฐ ๊ธฐ๋ฐ ์๋ ํธ๋ฆฌ๊ฑฐ
/commit-push-pr ์คํ ์ staged ํ์ผ ๋ชฉ๋ก์์ ์ ํจํด์ด ๊ฐ์ง๋๋ฉด,
์ปค๋ฐ ์ ๋ณด์ ํ์ดํ๋ผ์ธ์ด ์๋์ผ๋ก ์คํ๋๋ค.
CWE Scanning Rules
Critical (์ปค๋ฐ ์ฐจ๋จ)
| CWE ID | Rule | Grep Pattern |
|---|
| CWE-89 | SQL Injection | query\(.*\$\{, query\(.*\+ |
| CWE-79 | XSS | innerHTML, dangerouslySetInnerHTML, v-html |
| CWE-78 | OS Command Injection | exec\(.*\$\{, spawn\(.*req\. |
| CWE-77 | Command Injection | Template string in shell command |
| CWE-798 | Hardcoded Credentials | apiKey\s*=\s*['"], secret\s*=\s*['"] |
High (๊ฒฝ๊ณ , ์ปค๋ฐ ํ์ฉ)
| CWE ID | Rule | Grep Pattern |
|---|
| CWE-22 | Path Traversal | \.\.\/ with user input |
| CWE-352 | CSRF | POST handler without csrf check |
| CWE-287 | Improper Auth | Route without auth middleware |
| CWE-862 | Missing Authz | Handler without role/permission check |
| CWE-502 | Unsafe Deserialization | eval\(, new Function\( |
| CWE-918 | SSRF | fetch\(.*req\., axios.*req\. |
| CWE-434 | Unrestricted Upload | Upload without validation |
| CWE-269 | Privilege Escalation | Role change without verification |
Medium (์ ๋ณด ์ ๊ณต)
| CWE ID | Rule | Grep Pattern |
|---|
| CWE-200 | Info Disclosure | console\.log.*password|token|secret |
| CWE-20 | Input Validation | Endpoint without schema validation |
| CWE-327 | Broken Crypto | md5\(, sha1\(, Math\.random\(\) |
| CWE-276 | Incorrect Perms | origin:\s*['"]?\*, 0o?777 |
Auto-Fix Rules
์๋ ์์ ์ ์ฌ์ฉ์ ์น์ธ ํ ์ ์ฉํ๋ค. ์ ๋ขฐ๋๊ฐ High์ธ ํญ๋ชฉ๋ง ์๋ ์์ ๋์์ด๋ค.
Parameterized Queries (CWE-89)
Before: db.query(`SELECT * FROM users WHERE id = '${id}'`)
After: db.query('SELECT * FROM users WHERE id = $1', [id])
Environment Variables (CWE-798)
Before: const apiKey = 'sk-proj-abc123'
After: const apiKey = process.env.API_KEY
+ .env.example์ API_KEY= ์ถ๊ฐ
Safe DOM Manipulation (CWE-79)
Before: element.innerHTML = userInput
After: element.textContent = userInput
Remove Sensitive Logs (CWE-200)
Before: console.log('Token:', token)
After: // (line removed)
Secure Hash (CWE-327)
Before: const hash = md5(data)
After: const hash = crypto.createHash('sha256').update(data).digest('hex')
Integration Points
/handoff-verify (v6)
/handoff-verify ์ปค๋งจ๋์ ๊ฒ์ฆ ๋จ๊ณ์์ ๋ณด์ ๊ฒ์ฌ๊ฐ ํฌํจ๋๋ค.
verify-agent๊ฐ ๋ฏผ๊ฐ ํ์ผ ๋ณ๊ฒฝ์ ๊ฐ์งํ๋ฉด ์ด ์คํฌ์ ์๋ ํธ์ถํ๋ค.
/commit-push-pr
์ปค๋ฐ ์ ์๋ ๋ณด์ ๊ฒ์ดํธ๋ก ๋์ํ๋ค:
- Critical ๋ฐ๊ฒฌ ์: ์ปค๋ฐ ์ฐจ๋จ (BLOCKED)
- High ๋ฐ๊ฒฌ ์: ๊ฒฝ๊ณ ํ์ ํ ์ฌ์ฉ์ ํ์ธ (WARN)
- Medium ์ดํ๋ง ์กด์ฌ: ํต๊ณผ (PASS)
/security-review (ํตํฉ๋จ)
์ด์ security-review ์คํฌ์ OWASP ์ฒดํฌ๋ฆฌ์คํธ๋ _reference/security-checklist.md๋ก ์ ํ.
์ ์ฒด ๋ณด์ ๋ฆฌ๋ทฐ ์ ์ด ์คํฌ์ CWE Top 25 ๋งคํ + STRIDE + ์์กด์ฑ ๊ฒ์ฌ๊ฐ ์ํ๋๋ฉฐ,
์ฒดํฌ๋ฆฌ์คํธ ์ฐธ์กฐ ํ์ผ์ ํจ๊ป ๋ก๋ํ๋ค.
effort:max Enforcement
์ด ์คํฌ์ ํญ์ effort:max๋ก ์คํ๋๋ค.
๋ณด์ ๊ฒ์ฆ์์ ๋ถ์ ๊น์ด๋ฅผ ์ค์ด๋ ๊ฒ์ ํ์ฉํ์ง ์๋๋ค.
์ ์ฉ ๋ฒ์:
- CWE ํจํด ๋งค์นญ ์ false positive ์ต์ํ๋ฅผ ์ํ ์ปจํ
์คํธ ๋ถ์
- STRIDE ๋ถ๋ฅ ์ ์ ์ฒด ๋ฐ์ดํฐ ํ๋ฆ ์ถ์
- ์๋ ์์ ์ ์ ์ ์ฌ์ด๋ ์ดํํธ ๊ฒ์ฆ
- ์์กด์ฑ ๊ฒ์ฌ ์ transitive dependency ํฌํจ