
제로 의존성 Windows PE 출처 추적 및 오탐 감소 엔진 (내장 Authenticode + OS 보안 카탈로그, Rich Header ROL32 검증, 재현 가능 빌드 탐지, 차분 섹션 엔트로피).
Windows DFIR을 위한 결정론적 PE 출처 검증 및 오탐 감소 엔진
순진한 정적 악성코드 스캐너, YARA 휴리스틱, 엔트로피 스크립트는 극단적으로 높은 오탐률(깨끗한 엔드포인트에서 흔히 40%에서 60%)을 보입니다. 이들은 정당한 Windows 시스템 유틸리티, .NET 어셈블리, Electron 앱, PyInstaller 번들, 서명되지 않은 개발자 C/C++ 빌드를 악성코드로 상습적으로 오분류합니다.
TrueVerdict는 Python 표준 라이브러리(ctypes, struct, math, hashlib)와 네이티브 Win32 암호화 API(wintrust.dll, crypt32.dll)만으로 엄격하게 구축된 제로 의존성 Portable Executable(PE32 / PE32+) 트리아지 엔진입니다. 단일 지표 휴리스틱을 7계층 암호화 및 구조적 상호 검증 매트릭스로 대체하여 오탐을 **거의 제로(표준 OS/개발자 코퍼스에서 0.00%)**로 끌어내립니다.
flowchart TD
A["Target PE32 / PE32+ Binary"] --> L1["Layer 1: Dual-Path Cryptographic Verification\n(wintrust.dll Embedded PKCS#7 + CatRoot .cat Lookup)"]
L1 --> L2["Layer 2: Compiler Provenance\n(Rich Header 'DanS' XOR Decryption & ROL32 Checksum)"]
L2 --> L3["Layer 3: Debug & Timestamp Validation\n(IMAGE_DEBUG_TYPE_REPRO Deterministic Build Detection)"]
L3 --> L4["Layer 4: Differential Entropy & Section Permissions\n(.text vs .rsrc Segmentation + RWX Memory Detection)"]
L4 --> L5["Layer 5: Combinatorial IAT Profiling\n(MD5 Imphash + Offensive Cluster vs. Benign CRT Density)"]
L5 --> L6["Layer 6: Canonical Path & Identity Verification\n(System32 Path Validation + Levenshtein Typosquatting + VS_VERSIONINFO)"]
L6 --> L7["Layer 7: Multi-Vector Corroboration Gate\n(Blocks Single-Indicator Alerts; Requires >= 2 Independent Layers)"]
L7 --> V["Deterministic Triage Verdict\n(BENIGN / LOW_RISK_ANOMALY / SUSPICIOUS / MALICIOUS)"]python trueverdict.py --benchmark를 실행하면 32개의 실제 Windows 11 시스템 및 개발자 바이너리(카탈로그 서명 유틸리티, Brepro 미래 타임스탬프 바이너리, 서명되지 않은 깨끗한 C/C++ 빌드 포함)와 5개의 합성 적대적 PE64 샘플을 평가합니다:
======================================================================================
TRUEVERDICT - LIVE FALSE-POSITIVE STRESS BENCHMARK & ADVERSARIAL VALIDATION
======================================================================================
[PHASE 1] Scanning 32 Legitimate OS & Developer Binaries...
--------------------------------------------------------------------------------------
BINARY NAME | SIGNING MODE | NAIVE | FINAL | VERDICT
--------------------------------------------------------------------------------------
notepad.exe | OS_CATALOG | 45 | 0 | BENIGN (99.9%)
cmd.exe | OS_CATALOG | 80 | 0 | BENIGN (99.9%)
svchost.exe | EMBEDDED_AUTHENTICODE | 60 | 0 | BENIGN (99.9%)
calc.exe | OS_CATALOG | 45 | 0 | BENIGN (99.9%)
explorer.exe | EMBEDDED_AUTHENTICODE | 60 | 0 | BENIGN (99.9%)
regedit.exe | OS_CATALOG | 45 | 0 | BENIGN (99.9%)
certutil.exe | OS_CATALOG | 45 | 0 | BENIGN (99.9%)
spoolsv.exe | OS_CATALOG | 80 | 0 | BENIGN (99.9%)
powershell.exe | OS_CATALOG | 45 | 0 | BENIGN (99.9%)
python.exe | EMBEDDED_AUTHENTICODE | 0 | 0 | BENIGN (99.9%)
clean_unsigned_dev_tool.exe | UNSIGNED | 20 | 0 | BENIGN (98.5%)
... (all 32 legitimate binaries score 0/100)
[PHASE 2] Scanning 5 Synthetic Adversarial Threat Specimens...
--------------------------------------------------------------------------------------
THREAT SPECIMEN | PRIMARY DETECTION VECTORS | SCORE | VERDICT
--------------------------------------------------------------------------------------
svchost.exe | L2_RICH_F,L6_MASQUE | 100 | MALICIOUS (99.4%)
scvhost.exe | L2_RICH_F,L6_MASQUE | 100 | MALICIOUS (99.4%)
reflective_rwx_stub.exe | L4_RWX_ME,L4_PACKED | 100 | MALICIOUS (99.4%)
hollow_injector.exe | L2_RICH_F,L3_TIMEST | 90 | MALICIOUS (94.6%)
tampered_cert_implant.exe | L1_CRYPTO,L2_RICH_F | 100 | MALICIOUS (99.4%)
======================================================================================
BENCHMARK SUMMARY: NAIVE HEURISTICS vs. TRUEVERDICT CORROBORATION ENGINE
======================================================================================
Total Binaries Evaluated : 37 (2.70s)
Naive Heuristic False Positives : 18/32 (56.25% FPR)
TrueVerdict False Positives : 0/32 (0.00% FPR)
Total False-Positive Risk Suppressed: -1175 heuristic noise points
Adversarial Threat Detection Rate : 5/5 (100.00% TPR)
======================================================================================
cmd.exe)Windows 11의 C:\Windows\System32\cmd.exe가 내장 Authenticode 서명이 없고, **2034년 컴파일 타임스탬프(0x789F4656)**를 가지며, ResumeThread를 임포트한다는 점에 주목하십시오. 순진한 휴리스틱 스캐너는 이를 **80/100 (악성/의심)**으로 점수화합니다. TrueVerdict는 OS 카탈로그 서명을 확인하고, IMAGE_DEBUG_TYPE_REPRO 항목을 검증하며, DanS Rich Header 체크섬을 확인하여 위험 점수를 **0/100 (BENIGN)**으로 낮춥니다:
====================================================================================
TRUEVERDICT FORENSIC TRIAGE REPORT : cmd.exe
====================================================================================
File Path : C:\Windows\System32\cmd.exe
File Size : 344,064 bytes
SHA-256 : 97ac98b1a92c286054cce55239cfccdfc23a5517bd07fe693072c9ca96c7dabb
Imphash (MD5) : 010b165e4c37f484601d3dbd700c9423
Architecture : x64 (64-bit) | Linker: 14.38 | Container: NATIVE_UNPACKED
Compile Timestamp : 2034-02-16 12:02:30 UTC [REPRODUCIBLE_BUILD_HASH]
[1] CRYPTOGRAPHIC PROVENANCE (AUTHENTICODE + OS CATALOG)
------------------------------------------------------------------------------
Verification Mode : OS_CATALOG
Status : Valid Windows Security Catalog Signature
Verified Signer : Microsoft Windows Production PCA 2011
Certificate Issuer: Microsoft Root Certificate Authority 2010
OS Security Cat : C:\WINDOWS\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Microsoft-Windows-Client-Desktop-Required-Package0512~31bf3856ad364e35~amd64~~10.0.26100.9444.cat
[2] COMPILER PROVENANCE (RICH HEADER & DEBUG METADATA)
------------------------------------------------------------------------------
Rich Header (DanS): Present | XOR Key: 0xD7965A3A | ROL32 Checksum: VALID (Authentic MSVC Build)
Toolchain Objects : 11 @comp.id records
CodeView PDB Path : cmd.pdb
[5] FALSE-POSITIVE SUPPRESSION & CORROBORATION MATRIX
------------------------------------------------------------------------------
[+] TRUST ANCHOR [L1_CRYPTO_TRUST ] (-75) Valid Windows Security Catalog Signature (Microsoft Windows Production PCA 2011)
[+] TRUST ANCHOR [L2_RICH_PROVENANCE ] (-15) Authentic MSVC Rich Header ('DanS') verified via ROL32 checksum (0xD7965A3A, 11 toolchain build objects)
[~] FP SUPPRESSED [L1_CATALOG_RECOVERY ] (-20) Binary has no embedded Authenticode table, but matched verified OS Catalog
[~] FP SUPPRESSED [L3_BREPRO_TIMESTAMP ] (-25) Non-chronological PE TimeDateStamp (0x789F4656) verified as deterministic Reproducible Build (IMAGE_DEBUG_TYPE_REPRO) hash
[~] FP SUPPRESSED [L5_DUAL_USE_API_SUPPRESSION] (-35) Dual-use Win32 APIs (ResumeThread) suppressed within high-density/trusted IAT (287 total imports)
[*] Active Risk Vectors: 0 (Zero corroborated threat indicators)
====================================================================================
NAIVE HEURISTIC SCORE : 80/100 --> TRUEVERDICT FINAL SCORE : 0/100 (-80 FP noise suppressed)
FINAL VERDICT : BENIGN (Confidence: 99.9% | Corroborated Layers: 0)
====================================================================================
TrueVerdict는 외부 PyPI 패키지가 전혀 필요 없으며 Windows의 표준 Python 3.10+ 설치 환경에서 바로 실행됩니다.
git clone https://github.com/prox0959/TrueVerdict.git
cd TrueVerdict
# 1. Run the live False-Positive Stress Benchmark (32 OS/Dev binaries + 5 synthetic threats)
python trueverdict.py --benchmark
# 2. Triage a single binary (.exe, .dll, .sys)
python trueverdict.py C:\Windows\System32\cmd.exe
# 3. Triage an entire directory and export structured JSON
python trueverdict.py --dir C:\Windows\System32 --limit 50 --json system32_triage.json
# 4. Run unit & integration test suite
python -m unittest discover -s tests -v
MIT License에 따라 배포됩니다.
| 순진한 스캐너의 함정 | 깨끗한 바이너리가 이를 유발하는 이유 | TrueVerdict가 오탐을 제거하는 방법 |
|---|
| 1. Windows 시스템 파일의 "누락된" 디지털 서명 | C:\Windows\System32 바이너리(cmd.exe, notepad.exe, powershell.exe, regedit.exe)의 50% 이상이 내장 Authenticode 인증서 테이블(IMAGE_DIRECTORY_ENTRY_SECURITY == 0)을 포함하지 않습니다. | 내장 PKCS#7 서명(WinVerifyTrust)과 Windows OS 보안 카탈로그(CatRoot .cat) 데이터베이스를 CryptCATAdminCalcHashFromFileHandle + CryptCATAdminEnumCatalogFromHash를 통해 모두 조회합니다. |
| 2. "미래 / 위조된" 컴파일 타임스탬프 (예: 2034년 또는 2089년) | Windows 10 1607+부터 Microsoft는 **재현 가능 빌드(Brepro)**로 전환하여 COFF TimeDateStamp를 결정론적 빌드 해시로 대체했습니다. | IMAGE_DIRECTORY_ENTRY_DEBUG에서 **IMAGE_DEBUG_TYPE_REPRO (Type 16)**를 파싱합니다. 결정론적 빌드 해시를 인식하고 잘못된 타임스탬프 경고를 억제합니다. |
3. 높은 파일 엔트로피 (H > 7.2 bits/byte) | .rsrc의 압축된 아이콘/PNG, .NET 메타데이터, 또는 설치 프로그램 오버레이(PyInstaller, InnoSetup, NSIS, Electron)는 자연스럽게 7.5 - 7.99 bits/byte에 근접합니다. | 차등 섹션 엔트로피를 계산하여 실행 코드(.text)를 비실행 리소스(.rsrc)로부터 분리하고 알려진 애플리케이션 컨테이너를 핑거프린팅합니다. |
4. 이중 용도 Win32 API 임포트 (VirtualAllocEx, ResumeThread) | 컴파일러, 브라우저, 디버거, 언어 런타임(python.exe, cmd.exe, kernel32.dll)은 메모리 및 스레드 조작 API를 정당하게 임포트합니다. | 임포트 테이블 밀도 및 조합 클러스터를 평가하여 고밀도 CRT/OS 임포트 테이블(55+ 임포트) 또는 검증된 서명 내에 포함된 이중 용도 API를 억제합니다. |
| 5. 서명되지 않은 로컬 개발자 빌드 | 로컬에서 컴파일된 C/C++, Rust, Go 바이너리는 Authenticode 인증서가 없어 "서명되지 않음 = 의심스러움" 규칙에 걸립니다. | 서명되지 않음 != 악성 (기준 페널티 0)을 적용하고 **MSVC Rich Header (DanS)**를 복호화하고 ROL32 체크섬을 검증하여 컴파일러 출처를 확인합니다. |