Optimization check-security

코드 보안 취약점을 탐지한다. bandit을 사용하여 일반적인 보안 이슈를 검사한다.

install
source · Clone the upstream repo
git clone https://github.com/sunLeee/optimization
Claude Code · Install into ~/.claude/skills/
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"
manifest: .claude/skills/quality/check/check-security/SKILL.md
source content

check-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 IDCWE심각도
하드코딩된 비밀번호B105, B106CWE-259HIGH
SQL InjectionB608CWE-89HIGH
안전하지 않은 pickleB301CWE-502HIGH
exec/eval 사용B102, B307CWE-78MEDIUM
안전하지 않은 해시 (MD5, SHA1)B303, B324CWE-328MEDIUM
assert 사용B101CWE-703LOW

프로세스

/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)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 요약 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

심각도개수
HIGH2
MEDIUM1
LOW0

총 3개 보안 이슈 탐지

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 다음 단계 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  1. HIGH 이슈 즉시 수정 (배포 전 필수)
  2. MEDIUM 이슈 수정 권장
  3. /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` 이하는 리뷰 후 결정 권장