git clone https://github.com/sunLeee/optimization
T=$(mktemp -d) && git clone --depth=1 https://github.com/sunLeee/optimization "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/quality/check/check-security" ~/.claude/skills/sunleee-optimization-check-security && rm -rf "$T"
.claude/skills/quality/check/check-security/SKILL.mdcheck-security
코드 보안 취약점을 탐지하는 스킬.
목적
- 보안 취약점 탐지 (bandit)
- 심각도 분류 (HIGH/MEDIUM/LOW)
- CWE 매핑 및 수정 가이드 제공
사용법
/check-security # 전체 코드베이스 검사 /check-security src/ # 특정 경로 검사 /check-security src/ --severity high # HIGH만 검사
검증 규칙
상세 규칙: [@skills/convention-security-hardening/SKILL.md] 스킬 참조 (
)@.claude/skills/convention-security-hardening/SKILL.md이 스킬은 검증 실행 시 [@skills/convention-security-hardening/SKILL.md] 파일을 읽어 최신 규칙을 적용한다.
주요 탐지 항목 요약
| 취약점 | Bandit ID | CWE | 심각도 |
|---|---|---|---|
| 하드코딩된 비밀번호 | B105, B106 | CWE-259 | HIGH |
| SQL Injection | B608 | CWE-89 | HIGH |
| 안전하지 않은 pickle | B301 | CWE-502 | HIGH |
| exec/eval 사용 | B102, B307 | CWE-78 | MEDIUM |
| 안전하지 않은 해시 (MD5, SHA1) | B303, B324 | CWE-328 | MEDIUM |
| assert 사용 | B101 | CWE-703 | LOW |
프로세스
/check-security [path] | v [Step 1] bandit 설치 확인 |-- uv pip list | grep bandit |-- (없으면) uv pip install bandit | v [Step 2] bandit 실행 |-- bandit -r [path] -f json |-- JSON 결과 수집 | v [Step 3] 결과 파싱 |-- 심각도 분류 (HIGH/MEDIUM/LOW) |-- CWE 매핑 | v [Step 4] 수정 가이드 추가 |-- 각 이슈별 권장사항 |-- 코드 예시 제공 | v 완료
예제
기본 검사
User: /check-security src/ Claude: === Security Check: src/ === [1/2] bandit 실행 중... > bandit -r src/ -f json ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [HIGH] 보안 이슈 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ B105: Hardcoded password src/core/config.py:15 > secret_key = "my_secret_password" CWE-259: Use of Hard-coded Password Fix: 환경변수로 이동 ```python # Before secret_key = "my_secret_password" # After import os secret_key = os.environ.get("SECRET_KEY")
B608: SQL Injection src/db/queries.py:23
query = f"SELECT * FROM users WHERE id = {user_id}"
CWE-89: Improper Neutralization of SQL
Fix: 파라미터화된 쿼리 사용
# Before query = f"SELECT * FROM users WHERE id = {user_id}" # After query = "SELECT * FROM users WHERE id = %s" cursor.execute(query, (user_id,))
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [MEDIUM] 보안 이슈 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
B303: Use of insecure MD5 hash src/utils/hash.py:8
hashlib.md5(data)
CWE-328: Use of Weak Hash
Fix: SHA-256 이상 사용
# Before hashlib.md5(data) # After hashlib.sha256(data)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 요약 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
| 심각도 | 개수 |
|---|---|
| HIGH | 2 |
| MEDIUM | 1 |
| LOW | 0 |
총 3개 보안 이슈 탐지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 다음 단계 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- HIGH 이슈 즉시 수정 (배포 전 필수)
- MEDIUM 이슈 수정 권장
- /quality-bandit setup으로 CI 통합 권장
### HIGH만 검사
User: /check-security src/ --severity high
Claude: === Security Check: src/ (HIGH only) ===
bandit -r src/ -f json -ll
[HIGH] 2개 이슈 탐지
B105: src/core/config.py:15 B608: src/db/queries.py:23
상세 내용은 기본 검사 참조
## 관련 스킬 | 스킬명 | 관계 | 설명 | |--------|------|------| | [@skills/code-review/SKILL.md] | 부모 (Composite) | 통합 코드 리뷰 | | [@skills/quality-bandit/SKILL.md] | 연관 | bandit 설정 관리 | ## Changelog | 날짜 | 버전 | 변경 내용 | |------|------|----------| | 2026-01-22 | 1.1.0 | convention-security-hardening 참조 방식으로 리팩토링 | | 2026-01-21 | 1.0.0 | 초기 스킬 생성 | ## Gotchas (실패 포인트) - SQL injection 탐지 시 ORM 사용 코드도 의심 — raw query 여부 확인 필수 - 환경 변수 주입 오탐 — 실제 하드코딩과 환경변수 참조 구분 필요 - bandit -r 없이 실행 시 서브디렉터리 미검사 - `HIGH` severity만 차단, `MEDIUM` 이하는 리뷰 후 결정 권장