CVE Analysis — CVE 분석 및 의존성 취약점 관리 가이드
CVE 기반 취약점을 효율적으로 탐지, 분석, 우선순위화하는 방법론.
CVSS v3.1 점수 체계
Base Score 벡터
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H → 9.8 (Critical)
AV (Attack Vector): N(Network) > A(Adjacent) > L(Local) > P(Physical)
AC (Attack Complexity): L(Low) > H(High)
PR (Privileges Required): N(None) > L(Low) > H(High)
UI (User Interaction): N(None) > R(Required)
S (Scope): C(Changed) > U(Unchanged)
C (Confidentiality): H(High) > L(Low) > N(None)
I (Integrity): H(High) > L(Low) > N(None)
A (Availability): H(High) > L(Low) > N(None)
실무 우선순위 결정
CVSS만으로 부족 — 맥락 고려 필수:
우선순위 = CVSS Base × 환경 보정 × 악용 가능성
환경 보정:
├── 인터넷 노출: ×1.5 (외부 접근 가능)
├── 내부 전용: ×0.5 (VPN 뒤)
├── 중요 데이터 처리: ×1.3 (PII, 금융)
└── 개발 환경 전용: ×0.3
악용 가능성:
├── PoC 공개: ×2.0 (즉시 대응)
├── 활발한 공격: ×3.0 (최우선)
├── 이론적 가능: ×0.5
└── 해당 코드 경로 미사용: ×0.1
의존성 스캔 도구
Node.js
# npm 내장
npm audit --json
npm audit fix
# Snyk
snyk test --json
snyk monitor # 지속 모니터링
# 결과 해석
{
"vulnerabilities": {
"info": 0, "low": 2, "moderate": 5,
"high": 3, "critical": 1
}
}
Python
# pip-audit
pip-audit --format=json
# Safety
safety check --json
# Bandit (SAST)
bandit -r src/ -f json
Java/Kotlin
# OWASP Dependency-Check
mvn org.owasp:dependency-check-maven:check
# Gradle
./gradlew dependencyCheckAnalyze
컨테이너
# Trivy
trivy image myapp:latest --severity CRITICAL,HIGH
trivy fs --security-checks vuln,config .
# Grype
grype myapp:latest
취약점 분류 프레임워크
CWE 카테고리별 대응
| CWE 카테고리 | 대표 CVE 패턴 | 1차 대응 |
|---|---|---|
| CWE-79 (XSS) | 프론트엔드 라이브러리 | 라이브러리 업데이트 + CSP 적용 |
| CWE-89 (SQLi) | ORM/DB 드라이버 | 패치 + 파라미터화 쿼리 확인 |
| CWE-502 (Deserialization) | Jackson, pickle | 패치 + 역직렬화 화이트리스트 |
| CWE-918 (SSRF) | HTTP 클라이언트 | 패치 + URL 화이트리스트 |
| CWE-1035 (Components) | 프레임워크 자체 | 마이너 버전 업그레이드 |
취약점 대응 의사결정
CVE 발견
├── CVSS ≥ 9.0 (Critical)
│ ├── 패치 가능 → 즉시 패치 (24h 내)
│ └── 패치 불가 → WAF 규칙 + 임시 우회
├── CVSS 7.0~8.9 (High)
│ ├── 인터넷 노출 → 1주 내 패치
│ └── 내부 전용 → 2주 내 패치
├── CVSS 4.0~6.9 (Medium)
│ └── 다음 릴리스에 포함
└── CVSS < 4.0 (Low)
└── 백로그에 등록
시크릿 탐지
검출 패턴
# AWS
AKIA[0-9A-Z]{16}
# GitHub Token
ghp_[a-zA-Z0-9]{36}
# Generic API Key
(?i)(api[_-]?key|apikey|secret)['":\s]*[=:]\s*['"]?[a-zA-Z0-9/+]{20,}
# JWT
eyJ[a-zA-Z0-9_-]*\.eyJ[a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*
# Private Key
-----BEGIN (RSA |EC |DSA )?PRIVATE KEY-----
도구
# gitleaks (Git 히스토리 포함)
gitleaks detect --source=. --report-format=json
# trufflehog
trufflehog git file://. --json
# detect-secrets
detect-secrets scan --all-files
보고서 템플릿
# CVE 분석 보고서
## 요약
| 심각도 | 건수 | 즉시 대응 |
|--------|------|----------|
| Critical | N | N |
| High | N | N |
| Medium | N | |
| Low | N | |
## Critical/High 상세
| CVE ID | CVSS | 패키지 | 영향 | 대응 |
|--------|------|--------|------|------|
## 시크릿 탐지 결과
| 유형 | 파일 | 라인 | 상태 |
## 권고사항
1. [즉시] CVE-XXXX-XXXXX 패치
2. [1주] 의존성 N개 업그레이드
3. [운영] CI에 자동 스캔 추가