security-sweep 안내

취약점 우선순위 P0~P3는 어떻게 정하나요?

KEV 등재·심각도·도달성·EPSS를 조합한 규칙으로 매깁니다.

security-sweep의 report.py가 아래 규칙으로 1차 우선순위를 매기고, 이어서 Claude가 P0/P1 항목마다 코드 근거를 직접 열어 확정하거나 한 줄 사유와 함께 조정합니다. 여러 조건이 겹치면 가장 높은 우선순위를 씁니다.

규칙

우선순위조건의미
P0CISA KEV 등재, 또는 critical/high 이고 실제 호출(called)지금 고친다
P1critical/high 이고 imported/unknown, 또는 EPSS ≥ 0.1, 또는 비밀 발견이번 주
P2medium, 또는 high 인데 not-imported다음 정기 업그레이드
P3low/unknown, 낮은 설정 문제기록만
검증 실패OSV 404: 우선순위 없이 별도 섹션출처 스캐너와 ID만 나열

근거

신호왜 이렇게 쓰나
CISA KEV실제 공격에 쓰인 것이 확인된 목록입니다. “공격받을 수 있다”가 아니라 “공격받고 있다”이므로 도달성과 무관하게 P0입니다.
EPSS ≥ 0.130일 내 악용 확률 추정치(0~1)입니다. 0.1 이상은 상위 소수에 해당하므로 심각도가 medium이어도 P1로 올립니다.
도달성실제 호출(called)이면 심각도 그대로, import만 있으면(imported) P1, 흔적이 없으면(not-imported) 한 단계 내립니다. 판정 불가(unknown)는 보수적으로 P1입니다.
비밀값이미 노출된 자격 증명은 교체 전까지 위험이 그대로이므로 항상 P1 이상입니다.

not-imported ≠ 안전. 앱 코드가 B를 import하지 않아도 의존성 A가 B의 취약 함수를 호출할 수 있습니다. 그래서 P3가 아니라 P2로 둡니다. 동적 로딩(importlib, require(variable), apply/3)도 grep으로는 보이지 않습니다.

실제 조정 예시

도구의 imported는 “코드 어딘가에서 이 패키지를 쓴다”까지만 말해 줍니다. 실제 예시에서 Elixir 프로젝트 하나를 코드로 판정한 결과입니다.

도구 우선순위발견사람 판정근거
P1bandit 1.12.5 EEF-CVE-2026-105659 (HTTP/2 리소스 고갈)실제 (조건부)Bandit이 실제 HTTP 서버. 앞단 프록시가 HTTP/1.1로만 전달하면 위험 감소
P2decimal 3.1.1 CVE-2026-97853 (Decimal.round/3 DoS)도달 불가유일한 호출이 Decimal.round(0)으로 자릿수가 상수라 공격자가 조종 못 함
P1config/config.exs 하드코딩 비밀값 (EXS-CFG-001)오탐Phoenix가 생성한 LiveView signing_salt는 비밀이 아님

좋은 사유는 “위치 + 무엇이 어디로 흐르는지 / 왜 닿지 않는지”이고, 나쁜 사유는 “아마 안 씀”, “오래된 CVE”, “ID가 이상함”입니다. 근거 위치가 없는 조정은 하지 않습니다.

전체 규칙 문서 (prioritize.md) · CVE 실재 검증 방법 · security-sweep 소개

자주 묻는 질문

P1이 100건 넘게 나오면 어떻게 읽나요?

패키지별로 묶어 읽습니다. 실제 예시의 P1 107건 중 99건은 pillow와 sharp 두 패키지였습니다. 할 일은 건수가 아니라 올릴 패키지 수입니다.

KEV 항목도 코드에서 안 쓰면 내려도 되나요?

아니요. KEV 항목은 도달성과 무관하게 P0를 유지합니다. 도달성 판정이 grep 기반 추정이라 오판 비용이 너무 크기 때문입니다.

security-sweep이란?

security-sweep은 한 문장 요청으로 여러 프로젝트·서버·컨테이너 이미지의 알려진 취약점을 한 번에 점검하는 오픈소스 Claude Code 스킬입니다.

/plugin marketplace add baryonlabs/security-sweep
/plugin install security-sweep@baryonlabs-security

소개 페이지 · GitHub 저장소