
Windows 커널 드라이버 패치에서 취약점 수정을 탐지하기 위한 의미 분석 엔진 — 58개의 YAML 규칙, Ghidra 디컴파일, 도달 가능성 추적 및 점수화
자동 패치 인텔리전스 및 탐지 프레임워크
Windows 커널 드라이버 패치에서 취약점 수정을 탐지하는 의미 분석 엔진입니다. AutoPiff는 보수적인 YAML 규칙을 사용하여 보안 관련 코드 변경을 높은 정밀도와 설명 가능성으로 식별합니다.
AutoPiff는 취약한 드라이버 버전과 패치된 드라이버 버전 간의 차이를 분석하여 다음을 자동으로 탐지합니다.
ExFreePool 후 null 할당)memcpy 전 길이 유효성 검사)ProbeForRead/ProbeForWrite)공급업체가 연간 500건의 드라이버 업데이트 출시
├── 490건은 기능/성능/미용 변경
├── 8건은 사소한 버그 수정
└── 2건은 묵시적 보안 수정 (CVE 미할당)
자동화 없음: 500건을 수동 검토하여 2건 발견
AutoPiff 사용: 10개의 고점수 항목을 검토하여 2건 발견
보안 패치는 종종 CVE 할당 없이 출시됩니다. 모든 드라이버 업데이트를 수동으로 리버스 엔지니어링하여 보안 관련 변경을 찾는 것은 현실적이지 않습니다. AutoPiff는 중요한 변경 사항을 자동으로 표면화하여 이 문제를 해결합니다.
| 단계 | 수동 노력 | AutoPiff 사용 | 절약 시간 |
|---|---|---|---|
| 버전 페어링 | 드라이버당 5-15분 | 자동 | ~100% |
| 디컴파일 | 바이너리당 2-10분 | 배치, 병렬 처리 | ~95% |
| 함수 매칭 | 페어당 30-60분 | 즉시 | ~100% |
| 보안 변경 식별 | 페어당 2-8시간 | 몇 초 | ~99% |
| 초기 분류 및 순위 지정 | 1-2시간 | 즉시 | ~100% |
| 보고서 생성 | 30-60분 | 즉시 | ~100% |
총계: 드라이버 페어당 4-12시간 → 2-5분
┌─────────────────────────────────────────────────────────────────┐
│ AutoPiff에 의해 자동화 │
│ ├── 바늘 찾기: "ExFreePool 근처에서 변경된 함수" │
│ ├── 분류: "Use-After-Free 수정처럼 보임" │
│ └── 순위 지정: "점수 5.5 - 조사할 가치 있음" │
├─────────────────────────────────────────────────────────────────┤
│ 여전히 수동 (귀하의 전문성) │
│ ├── 익스플로잇 가능성 확인: "실제로 이걸 트리거할 수 있나?" │
│ ├── 근본 원인 분석: "왜 취약했을까?" │
│ ├── 익스플로잇 개발: "이 싱크에 어떻게 도달하나?" │
│ └── 영향 평가: "실제 위험은 무엇인가?" │
└─────────────────────────────────────────────────────────────────┘
AutoPiff는 익스플로잇 연구를 대체하지 않습니다. 정찰 단계를 자동화하여 대규모로 실행 가능하게 만듭니다.
1. 묵시적 패치 탐지
2. 1-데이 취약점 연구
3. 공급업체 보안 감사
4. 역사적 CVE 코퍼스 구축
AutoPiff는 8개의 순차적 단계와 병렬 DriverAtlas 분기로 구성된 Karton 파이프라인으로 실행됩니다. 각 단계는 Redis/RabbitMQ를 통해 통신하는 독립적인 마이크로서비스입니다.
graph LR
sources["WinBIndex<br/>VirusTotal"]:::src --> s0["Stage 0<br/>Monitor"]
s0 --> s14["Stages 1-4<br/>Patch Differ"]
s0 --> triage["DriverAtlas<br/>Triage"]:::triage
s14 --> s5["Stage 5<br/>Reachability"]
s5 --> s6["Stage 6<br/>Ranking"]
s6 --> s7["Stage 7<br/>Report"]
s6 --> s8["Stage 8<br/>Alerter"]
triage --> alerts["MWDB Tags<br/>+ Alerts"]:::triage
classDef src fill:#1a1a2e,stroke:#e94560,color:#eee
classDef triage fill:#1a1a2e,stroke:#e9a345,color:#eee
classDef default fill:#16213e,stroke:#0f3460,color:#eee| 단계 | 서비스 | 수행 작업 |
|---|---|---|
| 0 | driver-monitor | WinBIndex와 VirusTotal에서 새 드라이버 버전을 폴링하여 MWDB에 업로드 |
| 1-4 | karton-patch-differ | 버전 페어링, Ghidra 디컴파일, 함수 매칭, 의미 규칙 평가 |
| 5 | karton-reachability | IOCTL/IRP 진입점에서 변경된 함수까지 Ghidra 호출 그래프 BFS, 전체 디컴파일 내보내기 |
| 6 | karton-ranking | 도달 가능성, 의미 심각도 및 공격 표면을 사용하여 발견 항목 점수화 |
| 7 | karton-report | 구조화된 마크다운 보고서 생성, MWDB에 업로드 |
| 8 | autopiff-alerter | 점수 >= 8.0인 발견 항목에 대해 Telegram 알림 전송 |
| — | autopiff-driver-triage | DriverAtlas 공격 표면 점수화 (1-4와 병렬), MWDB 샘플 태깅, Telegram 알림 |
AutoPiff는 22개 범주에 걸쳐 58개의 규칙을 포함합니다. 전체 사양은 Docs/semantic_rules.md에서, 기술 참조는 Docs/SEMANTIC_RULES_REFERENCE.md에서 확인하세요.
| 범주 | 예시 탐지 |
|---|---|
bounds_check | memcpy 전 길이 검사 추가 |
lifetime_fix | ExFreePool 후 null 할당 |
user_boundary_check | ProbeForRead/ProbeForWrite 추가 |
int_overflow | 안전한 수학 헬퍼 사용 |
state_hardening | 인터록된 참조 카운트 연산 |
ioctl_input_validation | 디스패치 핸들러의 새로운 크기/유형 검사 |
pool_type_hardening | NonPagedPoolNx로 마이그레이션 |
privilege_check | SeSinglePrivilegeCheck 추가 |
규칙 엔진은 8개의 싱크 그룹에 걸쳐 50개 이상의 위험한 API 심볼을 추적합니다.
memory_copy: RtlCopyMemory, memcpy, memmovepool_alloc: ExAllocatePool, ExAllocatePoolWithTagpool_free: ExFreePool, ExFreePoolWithTaguser_probe: ProbeForRead, ProbeForWriteio_sanitization: RtlULongAdd, RtlSizeTMultexceptions: __try, __exceptstring_copy: strcpy, wcsncpyrefcounting: InterlockedIncrement/Decrement발견 항목은 구성 가능한 모델(rules/scoring.yaml)을 사용하여 점수화됩니다.
final_score = semantic_score + reachability_bonus + sink_bonus - penalties
점수 구성 요소:
게이팅:
git clone https://github.com/splintersfury/AutoPiff.git
cd AutoPiff
docker compose up -d
MWDB, 대시보드 및 모니터링을 포함한 전체 프로덕션 스택은 driver_analyzer를 참조하세요.
pip install pyyaml
from services.karton_patch_differ.rule_engine import SemanticRuleEngine
engine = SemanticRuleEngine('rules/semantic_rules.yaml', 'rules/sinks.yaml')
hits = engine.evaluate(func_name, old_code, new_code, diff_lines)
| 변수 | 설명 | 기본값 |
|---|---|---|
MWDB_API_URL | MWDB Core API 엔드포인트 | http://mwdb-core:8080/api/ |
MWDB_API_KEY | 업로드용 MWDB API 키 | (필수) |
KARTON_REDIS_HOST | Karton용 Redis 호스트 | karton-redis |
AUTOPIFF_GHIDRA_TIMEOUT | Ghidra 디컴파일 시간 초과 (초) | 900 |
VT_API_KEY | 드라이버 모니터링용 VirusTotal API 키 | (선택 사항) |
TELEGRAM_BOT_TOKEN | 알림용 Telegram 봇 토큰 | (선택 사항) |
TELEGRAM_CHAT_ID | 알림용 Telegram 채팅 | (선택 사항) |
AUTOPIFF_SCORE_THRESHOLD | Telegram 알림 최소 점수 | 8.0 |
DRIVERATLAS_SCORE_THRESHOLD | 트라이지 알림 최소 공격 표면 점수 | 8.0 |
rules/semantic_rules.yaml을 편집하여 규칙을 추가하거나 수정하세요.
rules:
- rule_id: my_custom_rule
category: bounds_check
confidence: 0.85
required_signals:
- sink_group: memory_copy
- change_type: guard_added
- guard_kind: length_check
plain_english_summary: Added length validation before memory copy.
AutoPiff는 MWDB 샘플에 첨부된 JSON 보고서를 생성합니다.
{
"pairing": {
"driver_new": {"sha256": "...", "version": "2.0.9.0"},
"driver_old": {"sha256": "...", "version": "2.0.8.0"},
"decision": "accept",
"confidence": 0.95
},
"semantic_deltas": {
"deltas": [
{
"function": "HandleIoctl",
"rule_id": "null_after_free_added",
"category": "lifetime_fix",
"confidence": 0.88,
"sinks": ["pool_free"],
"final_score": 5.5,
"why_matters": "Pointer is now set to NULL after freeing memory."
}
],
"summary": {
"total_deltas": 1,
"top_score": 5.5,
"match_rate": 100.0
}
}
}
| 문서 | 설명 |
|---|---|
Docs/semantic_rules.md | 의미 규칙 사양: 규칙 구조 및 각 범주가 탐지하는 내용 |
Docs/SEMANTIC_RULES_REFERENCE.md | 규칙 엔진, 평가 로직 및 점수화에 대한 기술 참조 |
Docs/reachability.md | 디스패치 진입점에서 호출 그래프 BFS에 대한 도달 가능성 태깅 사양 |
Docs/reporting.md | 보고서 출력 사양 및 형식 |
Docs/decisions.md | 설계 결정 및 근거 기록 |
rules/semantic_rules.yaml | 58개 탐지 규칙 모두 (YAML) |
rules/sinks.yaml | 범주별로 그룹화된 50개 이상의 위험한 API 심볼 |
rules/scoring.yaml | 점수 모델 구성 |
schemas/ | 모든 파이프라인 단계 출력에 대한 JSON 스키마 |
AutoPiff/
├── Docs/ # 설계 문서 및 사양
├── ghidra/scripts/ # Ghidra 헤드리스 스크립트
│ └── autopiff_reachability.py # 도달 가능성 BFS + 디컴파일 내보내기
├── rules/
│ ├── semantic_rules.yaml # 58개 탐지 규칙
│ ├── sinks.yaml # 50개 이상의 위험한 API 심볼
│ └── scoring.yaml # 점수 모델 구성
├── schemas/ # 각 단계에 대한 JSON 스키마
├── services/
│ ├── karton-patch-differ/ # 1-4단계: 차이 분석 + 의미 분석
│ ├── karton-reachability/ # 5단계: 호출 그래프 + 디컴파일
│ ├── karton-ranking/ # 6단계: 점수화
│ ├── karton-report/ # 7단계: 보고서 생성
│ ├── karton-driver-triage/ # DriverAtlas 공격 표면 트라이지
│ ├── autopiff-alerter/ # 8단계: Telegram 알림
│ ├── driver-monitor/ # 0단계: 버전 폴링
│ └── dashboard/ # 웹 UI
├── tests/unit/ # 137개 단위 테스트
├── docker-compose.yml
└── README.md
AutoPiff는 driver_analyzer와 함께 작동하도록 설계되었으며, 이는 전체 프로덕션 인프라(MWDB, Karton, MinIO, 대시보드)를 제공합니다. driver_analyzer compose 파일은 AutoPiff 서비스를 직접 빌드합니다.
# driver_analyzer/docker-compose.yml 내
karton-driver-patch-differ:
build:
context: ../AutoPiff
dockerfile: services/karton-patch-differ/Dockerfile
volumes:
- ../AutoPiff/rules:/app/rules:ro
설치 지침은 driver_analyzer README를 참조하세요.
MIT 라이선스 - 자세한 내용은 LICENSE를 참조하세요.