매직 바이트 조작: 4바이트로 .exe를 .jpg로 위장하는 원리 | T1036.008
MITRE T1036.008 파일 형식 위장 기법의 동작 원리를 상세 분석합니다. 여러 APT 그룹이 사용하는 매직 바이트 조작과 폴리글롯 파일 생성 방법, IcedID 공격 사례와 실전 방어 전략까지 완전 해부합니다.
MITRE ATT&CK 프레임워크에 등록된 T1036.008 Masquerade File Type 기술은 전 세계 여러 APT 그룹이 활용하는 핵심 은폐 기법이다. 이 기술을 활용한 폴리글롯 파일 공격이 IcedID 정보 탈취 악성코드 전달에 성공적으로 사용되었으며, 파일 검증 시스템을 우회하는 방법으로 입증되었다.
파일 형식 위장이 없던 시절, 악성코드 제작자들은 명백히 의심스러운 .exe 파일을 배포해야 했다. 사용자들이 "virus.exe"나 "malware.exe" 같은 파일을 쉽게 의심하자, 공격자들은 더 정교한 방법을 필요로 했다. 또한 이메일 첨부파일 필터링과 웹 업로드 검증이 강화되면서, 실행 파일 확장자는 자동으로 차단되기 시작했다.
T1036.008은 파일의 매직 바이트, 확장명, 아이콘을 조작하여 악성 페이로드를 정상 파일로 위장하는 은폐 기법이다.
Adversaries may masquerade malicious payloads as legitimate files through changes to the payload's format, including the file's signature, extension, and contents. Various file types have a typical standard format, including how they are encoded and organized. For example, a file's signature (also called magic bytes) is commonly used to identify the file's type, so that the appropriate application will open the file.
공식 정의를 해석하면, 적대자가 페이로드의 포맷을 변경하여 악의적인 페이로드를 합법적인 파일로 가장하는 기술이다. 파일 서명(매직 바이트), 확장명, 내용을 조작하는 방식으로 구현된다.
T1036.008 기법은 다음 핵심 요소로 구성된다:
| 용어 | 설명 |
|---|---|
| 매직 바이트 | 정의: 파일 형식을 식별하는 헤더 바이트 / 위치: 파일 시작부 / 목적: 파일 타입 식별 |
| 파일 서명 | 정의: 매직 바이트와 동일한 개념 / 위치: 파일 시작부 / 목적: 무결성 검증 |
| 확장명 | 정의: 파일명 뒤의 형식 표시 / 위치: 파일명 끝 / 목적: 연결 프로그램 결정 |
| 폴리글롯 | 정의: 다중 형식을 만족하는 파일 / 위치: 전체 구조 / 목적: 검증 시스템 우회 |
| MIME 타입 | 정의: 웹에서 사용하는 파일 형식 표시 / 위치: HTTP 헤더 / 목적: 브라우저 처리 방식 결정 |
매직 바이트의 실제 구조:
파일 시스템은 파일의 처음 몇 바이트를 읽어 형식을 판단한다. 예를 들어 JPEG 파일은 항상 FF D8 FF로 시작하고, PNG는 89 50 4E 47로 시작한다.
정상 JPEG 파일:
FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 48 00 48 00 00
^^^^^^^^^^ 매직 바이트 (JPEG 식별자)
위장된 실행 파일:
FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 48 00 48 00 00
4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00
^^^^^^^^^^ 숨겨진 PE 헤더 (실제 실행 코드)
폴리글롯 파일은 두 개 이상의 파일 형식 규칙을 동시에 만족하는 구조이다. 마치 이중 언어를 구사하는 사람처럼, 하나의 파일이 상황에 따라 다르게 해석된다.
JPEG/PE 폴리글롯 구조:
# 폴리글롯 파일 생성 예시 (교육 목적)
def create_jpeg_pe_polyglot():
# JPEG 헤더 (정상 이미지로 인식)
jpeg_header = bytes([0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10])
jpeg_marker = b"JFIF\x00\x01\x01\x01\x00\x48\x00\x48\x00\x00"
# 가짜 JPEG 데이터 (패딩)
fake_image_data = b"\xFF" * 1024
# 실제 PE 실행 파일 데이터
pe_header = b"MZ" # PE 파일 시작
pe_payload = load_malicious_payload() # 실제 악성 코드
# 폴리글롯 조합
polyglot = jpeg_header + jpeg_marker + fake_image_data + pe_header + pe_payload
return polyglot
Windows 운영체제는 파일 확장명을 기반으로 실행 프로그램을 결정한다. 하지만 실제 파일 내용과 확장명이 다를 때 예상치 못한 동작이 발생한다.
실행 우회 시나리오:
레지스트리 조작을 통한 실행:
# Windows 레지스트리 조작 (관리자 권한 필요)
HKEY_CLASSES_ROOT\.jpg\shell\open\command
기본값: "C:\Windows\System32\rundll32.exe" shell32.dll,ShellExec_RunDLL %1
파일 업로드 검증 우회:
대부분의 웹 애플리케이션은 다음과 같은 단순한 검증 로직을 사용한다:
// 취약한 파일 검증 코드 예시
function validateFile(file) {
// 확장명만 확인 (취약점)
const allowedExtensions = ['.jpg', '.png', '.gif', '.pdf'];
const extension = file.name.split('.').pop().toLowerCase();
if (!allowedExtensions.includes('.' + extension)) {
return false;
}
// 매직 바이트 확인 (불완전)
const header = file.slice(0, 4);
const jpegHeader = [0xFF, 0xD8, 0xFF, 0xE0];
// 첫 4바이트만 확인 → 우회 가능
if (header[0] === jpegHeader[0] && header[1] === jpegHeader[1]) {
return true;
}
return false;
}
우회 성공 조건:
T1036.008 기법이 효과적인 이유는 대부분의 보안 시스템이 표면적 검증 에만 의존하기 때문이다. 공격자는 다음 시스템 약점을 집중적으로 노립니다:
IcedID 폴리글롯 CHM 공격
Palo Alto Networks Unit 42가 발견한 실제 공격 사례이다:
공격 성공 요인:
1. 엔트로피 조작:
# 엔트로피 기반 탐지 우회 (교육 목적)
def reduce_entropy(payload):
# 반복 패턴으로 엔트로피 감소
padding = b"\x00" * 1024 # 0으로 채워진 패딩
low_entropy_data = b"A" * 512 + b"B" * 512 # 단순 반복
# 실제 페이로드를 낮은 엔트로피 데이터로 감싸기
disguised_payload = padding + low_entropy_data + payload + padding
return disguised_payload
2. 파일 크기 조작:
대용량 파일로 위장하여 자동 스캔을 우회한다:
# 파일 크기 기반 스캔 우회
def create_oversized_file(malware_payload):
# 100MB 이상의 가짜 데이터 추가
fake_data = generate_realistic_image_data(100 * 1024 * 1024)
# 파일 끝에 실제 페이로드 숨기기
oversized_file = fake_data + malware_payload
return oversized_file
취약점 상세: Microsoft의 서명 검증 로직에서 서명 섹션에 추가 콘텐츠를 삽입해도 서명이 무효화되지 않는 문제였다.
공격 과정:
파일 검증 강화:
# 강화된 파일 검증 로직
def secure_file_validation(file_path):
with open(file_path, 'rb') as f:
# 전체 파일 헤더 분석 (처음 512바이트)
header = f.read(512)
# 매직 바이트 정확성 검증
if not validate_complete_signature(header):
return False
# 파일 구조 무결성 검사
if not verify_file_structure(f):
return False
# 엔트로피 분석으로 암호화/압축 탐지
entropy = calculate_entropy(f.read(4096))
if entropy > 7.5: # 의심스러운 높은 엔트로피
return False
# 실행 가능 섹션 탐지
if detect_executable_sections(f):
return False
return True
핵심 보안 조치:
T1036.008 파일 형식 위장은 단독으로 사용되기보다는 다른 MITRE ATT&CK 기법들과 연계되어 더 큰 위협을 만들어냅니다. 특히 T1036.007 이중 확장자 공격과 함께 사용될 때 사용자 속임수 효과가 극대화된다.
공급망 침해 관점에서 보면, 소프트웨어 공급망 침해 공격에서도 정상 업데이트 파일로 위장한 악성 파일이 매직 바이트 조작을 통해 검증 시스템을 우회하는 사례가 빈번한다.
다음 단계로 학습할 주제:
AI 활용 안내 이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항 본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다. 언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라 처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.