
iocx v0.7.6.1
PE 바이너리와 텍스트에서 고신호 IOC를 추출하는 확장 가능하고 결정론적인 정적 분석 엔진으로, SOC 자동화 및 현대 위협 분석 파이프라인을 위해 구축되었습니다.
IOCX
현대 보안 파이프라인을 위한 결정적(Deterministic), 무위험 IOC 추출
IOCX CLI를 사용한 PE 파일의 정적 IOC 추출
공식 IOCX 프로젝트
이 프로젝트는 결정적 정적 IOC 추출 및 PE 분석을 위한 원본 IOCX 엔진입니다. "iocx"라는 이름을 사용하는 다른 모든 저장소는 이 프로젝트와 관련이 없습니다.
공식 링크:
- PyPI: https://pypi.org/project/iocx/
- Github: https://github.com/iocx-dev/iocx
- 웹사이트: https://iocx.dev/
IOCX가 중요한 이유
현대 악성코드는 기본적으로 적대적(adversarial) 입니다 — 변형되고, 회피적이며, 단순한 추출기를 무너뜨리도록 설계되었습니다.
- 바이너리를 인식하지 못하는 도구는 변형된 PE에서 붕괴됩니다
- 샌드박스는 안전하지 않으며 CI/CD에서 사용할 수 없습니다
- 재현성은 자동화된 파이프라인에 필수적입니다
IOCX는 정확성과 결정성이 실제로 중요한 환경을 위해 구축되었습니다.
IOCX 엔진
IOCX는 공식 정적 IOC 추출 엔진입니다 — DFIR, SOC 자동화, CI/CD 보안, 대규모 위협 인텔리전스 파이프라인을 위해 구축된 결정적이고 바이너리를 인식하는 시스템입니다.
정규식 전용 추출기나 샌드박스 의존 도구와 달리 IOCX는 다음을 수행합니다:
- 순수 정적 분석
- 실행 위험 제로
- 안정적이고 결정적인 출력
- 적대적 테스트를 거친 휴리스틱
확장 가능한 현대 위협 분석을 위한 MalX Labs 생태계의 핵심 구성 요소입니다.
10초 만에 IOCX 사용해보기
echo "http://malicious.example" | iocx -
또는 PE 파일을 안전하게 스캔:
iocx suspicious.exe -a deep
IOCX가 존재하는 이유
보안 팀은 세 가지 지속적인 문제에 직면합니다:
- 정규식 추출기는 적대적 입력에서 붕괴됩니다
- 샌드박싱은 안전하지 않고 느리며 자동화에 부적합합니다
- 대부분의 IOC 도구는 일관성이 없거나 느리거나 실행 간에 미묘하게 다른 출력을 생성합니다
IOCX는 자동화, 안전성, 확장성을 위해 설계된 결정적이고 정적 전용 엔진으로 이 문제를 해결합니다.
IOCX가 아닌 것
IOCX는 의도적으로 다음이 아닙니다:
- 샌드박스
- 행동 분석 도구
- 에뮬레이터
- 강화(enrichment) 엔진
신뢰할 수 없는 코드를 절대 실행하지 않습니다. 동적 분석을 절대 수행하지 않습니다. 안전성, 결정성, CI/CD 호환성을 위해 설계상 정적 전용입니다.
설계 철학
IOCX는 레거시 도구의 가정이 아닌 현대 악성코드의 현실을 위해 설계되었습니다.
1. 모호성보다 결정성
안정적이고 재현 가능한 출력 — 무작위성 없음, 변동성 없음.
2. 동적보다 정적
실행은 안전하지 않습니다. 정적 분석은 예측 가능하고 확장 가능하며 CI 친화적입니다.
3. 적대적 우선 엔지니어링
변형된 PE, 손상된 RVA, 적대적 문자열 — IOCX는 이를 정상 입력으로 취급합니다.
4. 계약으로서의 스키마 안정성
다운스트림 시스템은 업그레이드 시 절대 중단되지 않아야 합니다.
5. 타협 없는 성능
원시 텍스트에서 150–300 MB/s. 일반적인 PE에서 6–15 MB/s. 최악의 적대적 부하에서도 예측 가능.
이러한 약속은 PE 구조 분석에 대한 발표된 연구 방법론 — 결정적 픽스처 구성, 단일 이상 징후 규율, 정확성의 기준으로서의 Windows 로더 동작 — 에서 파생되었습니다. 전체 방법론은 docs/methodology.md를 참조하고, 더 넓은 적대적 PE 분류 체계와 상업용 픽스처 제품군은 paax.dev를 참조하십시오.
IOCX의 차별점
| 기능 | IOCX | 일반적인 IOC 추출기 | 샌드박스 / 동적 도구 |
|---|---|---|---|
| 안전성 | 무실행, 정적 전용 | 정규식 전용, 바이너리 안전성 없음 | 신뢰할 수 없는 코드 실행 (고위험) |
| 결정성 | 완전히 결정적인 출력 | 노이즈에서 비결정적 | 설계상 비결정적 |
| 바이너리 인식 | 전체 PE 파싱, 휴리스틱 | 바이너리 지원 없음 | 가능하지만 안전하지 않고 느림 |
| 적대적 복원력 | 변형된 PE, 적대적 문자열에 대해 테스트됨 | 쉽게 우회됨 | 종종 충돌하거나 오분류 |
| 성능 | 150–300 MB/s (텍스트), 6–15 MB/s (PE) | 매우 가변적 | 극도로 느림 |
| CI/CD 친화성 | 예 — 안전, 결정적, 빠름 | 부분적 | 아니요 — 파이프라인에 안전하지 않음 |
| 스키마 안정성 | 보장됨 | 드묾 | 없음 |
요약: IOCX는 이상적인 입력이 아닌 실제 적대적 현실을 위해 구축되었습니다.
사용 사례
CI/CD 및 DevSecOps
- 릴리스 전 바이너리 스캔
- 빌드 내 우발적 URL, IP 또는 비밀번호 감지
- 실행 위험 제로로 보안 게이트 적용
SOC 및 침해 대응
- 알림 또는 분석가 클립보드 텍스트에서 지표 추출
- 실행 없이 악성코드 샘플 안전하게 검사
- IOC를 구조화된 JSON으로 정규화
위협 인텔리전스
- 대규모 피드 처리
- 비구조화된 보고서 파싱
- 결정적 출력 기반 강화 파이프라인 구축
자동화 및 스크립팅
- 로그 또는 아티팩트를 IOCX에 파이프
- ETL 또는 배치 워크플로우에 Python API 사용
- 사용자 정의 감지기로 확장
성능 프로필
1. 원시 IOC 추출 (텍스트, 로그, 버퍼)
150–300 MB/s 지속 처리량 빠른 경로 — PE 파싱 없음.
| 감지기 | 1 MB 시간 | 처리량 |
|---|---|---|
| Crypto | 0.0037 s | ~270 MB/s |
| Filepaths | 0.0041 s | ~250 MB/s |
| IP | 0.0065 s | ~156 MB/s |
| Domains | 0.0035 s | ~300 MB/s |
2. 일반적인 PE 파일 (~39 KB)
- 0.0122 s (일반)
- 0.0145 s (휴리스틱 포함)
- 6–15 MB/s 처리량
3. 적대적 고밀도 PE (1.5 MB)
- 0.192 s
- ~7.6 MB/s 처리량
- TLS 이상 징후, 구조적 이상 징후, 안티디버그 패턴 트리거
4. 전체 엔진 (비-PE)
- 1 MB: 0.038 s
버전 주요 사항
버전 기록 보기
v0.7.6.2 — Import 테이블 검증기
- 새로운 결정적 import 테이블 구조 검증기 (
IMPORT_*사유 코드). version_info가 이제 제한된 공개 프로젝션을 통해 모든 분석 수준에서 파싱되어 표시됩니다 (-a full뿐만 아니라).- CLI 재구축: 브랜드화된
--version출력, 더 명확한--help텍스트, 인수 그룹 재구성. - 모든 항목에서 도달 가능한 리로케이션 파서 충돌, PE32+ 데이터 디렉토리 오프셋 버그, 여러 가지 조용한 export/resource 오류 누락 수정.
- 파서 오류 태그가 검증기에 의해 조용히 소비되지 않도록 방지하는 새로운 정적 CI 검사.
- 테스트 스위트: 2,136 → 2,802 테스트.
v0.7.6.1 — 예외 디렉토리 검증기
- PE 예외 (
.pdata) 디렉토리의 심층 의미론적 검증 추가; 14개의 새로운 사유 코드; 총 15개의 검증기. - 엔진 전반에 걸쳐 구조적 발견 사항을 억제하던 결함 수정.
- 프로덕션에서 죽은 것으로 확인된 추가 검사 4개: 디렉토리 배치 2개, 섹션 매핑 1개, 리소스 디렉토리 경계 검사 1개.
- 출력에 표시됨: 이전에 억제되거나 잘못 레이블링된 발견 사항이 이제 표시됩니다.
- 테스트: 1620 → 2136. 커버리지: 100%.
v0.7.6 — 구조 검증기 확장: Debug 및 리로케이션 디렉토리
- 두 개의 새로운 PE 구조 검증기 — 리로케이션 및 디버그
- WIN_CERTIFICATE 및 tls 검증기는 이제 pefile과 독립적인 전용 구조 파서에서 구조적 진실을 소싱
- 우선순위 해결 하위 사유 분류 체계를 갖춘 12개의 새로운 사유 코드
- 결정적 바이트 수준 파싱 — pefile의 지연 해석에 의존하지 않음
- 100% 커버리지의 1620 테스트
v0.7.5 — 구조 검증기 확장
- 네 개의 새로운 PE 구조 검증기 — exports, delay-load imports, VS_VERSIONINFO, 리소스 계층 구조
- 우선순위 해결 하위 사유 분류 체계를 갖춘 24개의 새로운 사유 코드
- 결정적 바이트 수준 파싱 — pefile의 지연 해석에 의존하지 않음
- 보안 관련 메타데이터 — DLL 특성, 하위 시스템/머신 이름 디코딩, 리소스별 엔트로피
- 100% 커버리지의 1370 테스트 — 실제 바이너리에서
dumpbin에 대해 종단 간 검증됨
v0.7.4.1 — Windows 호환성 핫픽스
- Windows 시스템에서 import 실패를 유발한
python-magic의존성 제거 - 완전한 크로스 플랫폼 이식성을 위한 순수 Python 파일 유형 감지기 추가
- 엄격한 Windows 호환 PE 검증을 적용하여 PE 감지 로직 개선
- IOC 추출에 대한 동작 변경 없음
--min-length일관성 수정은 v0.7.5에서 계획됨
v0.7.4 — 고급 디렉토리 파싱
- 전체 Load Config 디렉토리 파싱 및 검증
- 다운스트림 휴리스틱을 위한 확장된 Optional Header 메타데이터
- 새로운 GuardCF, cookie, 이상 징후 휴리스틱
- 더 빠른 PE 분석
- 테스트 스위트의 99개 PE 픽스처; 45개 완전히 사양 검증됨
v0.7.3 — 구조적 정확성 및 결정적 휴리스틱
- 모든 PE 구조 검증기의 주요 강화
- 결정적이고 스냅샷 안정적인 동작
- 명확하고 일관된 ReasonCodes
- 구조적 진실에 기반한 더 강력한 휴리스틱
v0.7.2 — 의존성 수정
- 누락된
idna의존성 추가 - 동작 또는 스키마 변경 없음
v0.7.1 — 적대적 휴리스틱 확장 및 파서 강화
- 여섯 개의 새로운 PE 휴리스틱
- 확장된 적대적 PE 코퍼스
- 강화된 도메인/URL/crypto/hash 추출기
- 결정적 스냅샷 검증 출력
v0.7.0 — 결정적 휴리스틱 및 적대적 테스트 기반
- 결정적 휴리스틱
- 레이어-3 적대적 샘플
- 스냅샷 계약 테스트
- Rich Header 충돌 수정
v0.6.0 — 안정적인 출력 스키마 및 결정적 메타데이터
- 완전히 안정적인 JSON 스키마
- 정규화된 PE 메타데이터
- 공식화된 분석 수준
v0.5.0 — 분석 수준, PE 섹션 분석, 난독화 힌트
- 새로운 분석 수준 시스템
- PE 구조 분석
- 난독화 휴리스틱
v0.4.0 — 플러그인 아키텍처
- 플러그인 준비 규칙 엔진
- 통합 감지 흐름
v0.3.0 — Crypto IOC 감지
- Ethereum 및 Bitcoin 지갑 감지
v0.2.0 — 고신뢰성 IP 감지
- 주요 IPv4/IPv6 개선
빠른 시작
설치
pip install iocx
파일에서 IOC 추출
iocx suspicious.exe
텍스트에서 추출
echo "Visit http://bad.example.com" | iocx -
PE 분석 활성화
iocx suspicious.exe -a
Python API
from iocx.engine import Engine
engine = Engine()
results = engine.extract("suspicious.exe")
print(results)
출력 예시
IOCX는 IOC, PE 메타데이터, 섹션 분석, 휴리스틱 및 난독화 지표를 포함하는 구조화되고 결정적인 JSON을 생성합니다.
아래 예시는 실제 적대적 PE 샘플의 축약된 출력입니다. 문서화 목적으로 크기를 관리 가능하게 유지하면서 스키마의 형태와 깊이를 보여줍니다.
예시 JSON 출력 보기
{
"file": "heuristic_rich.full.exe",
"type": "PE",
"iocs": {
"urls": ["http://not-a-real-domain.test/payload"],
"domains": ["example-malware.com"],
"ips": ["192.0.2.123"],
"hashes": [
"abcd1234ef567890abcd1234ef567890",
"1234567890",
"3333333333333333"
],
"filepaths": [
"/usr/src/mingw-w64-11.0.1-3build1/mingw-w64-crt/crt/crtexe.c",
"/usr/x86_64-w64-mingw32/include",
"/usr/src/mingw-w64-11.0.1-3build1/mingw-w64-crt/crt/pseudo-reloc.c"
]
},
"metadata": {
"file_type": "PE",
"imports": ["KERNEL32.dll", "msvcrt.dll", "USER32.dll"],
"sections": [
".text", ".data", ".rwx", ".rdata",
"UPX0", ".pdata", ".xdata", ".tls"
],
"resources": [],
"resource_strings": [],
"delayed_imports": [],
"bound_imports": [],
"exports": [],
"signatures": [],
"has_signature": false,
"tls": {
"start_address": 5368758272,
"end_address": 5368758280,
"callbacks": 5368754232
},
"header": {
"entry_point": 5088,
"image_base": 5368709120,
"machine": "AMD64",
"subsystem": "Windows GUI"
},
"optional_header": {
"section_alignment": 4096,
"file_alignment": 512,
"size_of_image": 155648
}
},
"analysis": {
"sections": [
{ "name": ".text", "entropy": 5.92 },
{ "name": ".rwx", "entropy": 0 },
{ "name": "UPX0", "entropy": 0.34 },
{ "name": ".rdata", "entropy": 4.03 }
],
"obfuscation": [
{
"value": "abnormal_section_layout_virtual_only",
"category": "obfuscation_hint",
"metadata": {
"section": ".bss",
"raw_size": 0,
"virtual_size": 384
}
}
],
"extended": [
{
"value": "summary",
"category": "pe_metadata",
"metadata": {
"dll_count": 3,
"import_count": 45,
"resource_count": 0,
"has_tls": true,
"has_signature": false
}
}
],
"heuristics": [
{
"value": "packer_suspected",
"metadata": {
"reason": "packer_section_name",
"section": "UPX0"
}
},
{
"value": "anti_debug_heuristic",
"metadata": {
"reason": "anti_debug_api_import",
"dll": "kernel32.dll",
"function": "CheckRemoteDebuggerPresent"
}
},
{
"value": "anti_debug_heuristic",
"metadata": {
"reason": "timing_api_import",
"dll": "kernel32.dll",
"function": "GetTickCount"
}
},
{
"value": "pe_structure_anomaly",
"metadata": {
"reason": "section_overlaps_headers",
"section": ".bss",
"raw_address": 0,
"size_of_headers": 1536
}
},
{
"value": "pe_structure_anomaly",
"metadata": {
"reason": "data_directory_overlap",
"directory_a": "IMAGE_DIRECTORY_ENTRY_IMPORT",
"directory_b": "IMAGE_DIRECTORY_ENTRY_IAT"
}
}
]
}
}
아키텍처
iocx/
├── examples/
├── docs/
├── tests/
└── iocx
├── detectors/
├── parsers/
├── plugins/
├── cli/
└── analysis/
플러그인 생태계 및 확장성
IOCX는 안전하고 예측 가능하게 확장되도록 설계되었습니다. 플러그인은 일급 시민이며, 코어 엔진과 동일한 결정적 스냅샷 테스트로 검증됩니다.
다음을 구축할 수 있습니다:
- 사용자 정의 IOC 감지기
- 사용자 정의 정규식 규칙
- 바이너리 인식 플러그인
- 내부 휴리스틱
- 파이프라인별 추출기
참조:
docs/specs/overlap-suppression.mddocs/specs/plugin-authoring-guidelines.md
생태계 개요
IOCX는 단일 바이너리 그 이상입니다 — 모듈식 생태계입니다:
- 코어 엔진 — 결정적 IOC 추출 + PE 분석
- 플러그인 시스템 — 사용자 정의 감지기 및 분석 모듈
- 적대적 코퍼스 — 변형된 PE, 적대적 문자열, 퍼즈 샘플
- 스냅샷 테스트 프레임워크 — 결정적 출력 보장
- 성능 벤치마크 — CI에서 강제됨
- 문서 스위트 — 사양, 계약 및 플러그인 가이드
IOCX 사용자
IOCX는 다음 분야에서 사용됩니다:
- DFIR 팀
- SOC 자동화 파이프라인
- CI/CD 보안 게이트
- 위협 인텔리전스 플랫폼
- 악성코드 연구소
- 보안 엔지니어링 팀
지표를 안전하게, 결정적으로, 대규모로 추출해야 하는 모든 곳에서 IOCX가 적합합니다.
안전한 테스트 (악성코드 불필요)
모든 테스트 샘플은:
- 합성
- 무해
- 공개적으로 안전 (EICAR, GTUBE)
- 우발적 악성코드 취급을 피하도록 설계됨
성능 보장
IOCX는 CI에서 엄격한 성능 임계값을 적용하여 다음을 보장합니다:
- 정규식 역추적 중단 없음
- 병리적 속도 저하 없음
- 릴리스 전반에 걸친 안정적인 성능
참조:
docs/performance.md
프로젝트 정체성 및 명명
IOCX라는 이름은 다음에 게시된 공식 엔진만을 지칭합니다:
허용되지 않음
iocx라는 이름의 저장소- 이 프로젝트의 일부가 아닌 "iocx"라는 도구
- 허가 없이 제휴를 암시하는 행위
허용됨
iocx-<plugin>iocx-extension-<name>iocx-detector-<feature>
공식 IOCX 저장소
- 코어 엔진: https://github.com/iocx-dev/iocx
- 플러그인 메타 저장소: https://github.com/iocx-dev/iocx-plugins
- 문서: https://github.com/iocx-dev/iocx/tree/main/docs/specs
- PyPI 패키지: https://pypi.org/project/iocx/
로드맵
IOCX 개발은 안정성, 확장성 및 더 깊은 정적 분석 범위에 중점을 둡니다. 아래 항목은 진행 중인 작업 및 탐구 영역을 나타냅니다.
- 확장된 PE 휴리스틱 (delay-load 동작, 구조적 이상 징후, 리로케이션 패턴)
- OSINT, DFIR 및 위협 인텔리전스 워크플로우를 위한 선택적 억제 규칙
- ELF 및 Mach-O 메타데이터 추출
- 다중 아티팩트 워크플로우를 위한 배치 분석 모드
- YARA 스타일 출력 모드 및 강화 훅
- 바이너리 무관 정적 분석
- 크로스 플랫폼 플러그인 생태계
- Rust, Go 및 Node.js용 언어 바인딩
기여
다음을 환영합니다:
- 새로운 감지기
- 파서 개선
- 문서 업데이트
- 합성 적대적 샘플
지침은 CONTRIBUTING.md를 참조하십시오.
보안
보안 문제를 발견한 경우 GitHub 이슈를 열지 마십시오.
SECURITY.md의 지침을 따르십시오.
라이선스
MPL‑2.0 라이선스 — LICENSE 참조.