TLSCheck 2.0: An Enhanced Memory Forensics Approach to Efficiently Detect TLS Callbacks
이 논문은 Volatility 3 기반의 향상된 메모리 포렌식 플러그인 'TLSCheck 2.0'을 소개하여 PE 헤더 분석, 역어셈블리, YARA 규칙 매칭 및 지시어 수준 분석을 통해 TLS 콜백의 정밀 탐지와 악성 코드 행태 식별을 가능하게 함으로써 메모리 포렌식 및 사고 대응 능력을 강화합니다.
컴퓨터 프로그램을 실행할 때, 보통은 '시작 버튼'을 누르면 프로그램이 실행됩니다. 하지만 해커들은 이 정직한 시작 버튼을 피하고, **프로그램이 완전히 시작되기 직전에 자동으로 실행되는 '비밀 신호 (TLS 콜백)'**를 이용합니다.
일반적인 프로그램: 문 앞에 서서 "안녕하세요!"라고 인사하고 들어갑니다. (수사관도 쉽게 볼 수 있음)
해커의 프로그램 (TLS 콜백): 문이 열리기 전에, 문고리 안쪽에 숨겨진 작은 스위치를 누릅니다. 이 스위치가 눌리면 해커의 악성 코드가 먼저 실행되어 문을 잠그거나, 도둑이 들어갈 준비를 합니다.
문제점: 기존 수사 도구들은 문이 열린 후의 상황만 보거나, 아주 큰 흔적만 찾아냈습니다. 그래서 문고리 안쪽의 이 '비밀 스위치'를 놓치는 경우가 많았습니다.
💡 이 논문이 해결한 것: "비밀 스위치 탐지기"
저자들은 이 **'비밀 스위치 (TLS 콜백)'**를 찾아내고 분석할 수 있는 새로운 도구, TLSCheck 2.0을 만들었습니다.
1. 왜 이 도구가 필요한가요? (배경)
기존의 한계: 예전 수사 도구들은 "문고리 안쪽에 스위치가 있는지"를 모르고 있었습니다. 해커들은 이 스위치를 이용해 해킹 코드를 실행하고, 수사관이 컴퓨터를 켜기 전에 흔적을 지워버리기도 했습니다.
새로운 접근: 이 도구는 메모리 덤프 (컴퓨터의 순간적인 상태 사진) 를 찍어서, 프로그램이 시작되기 직전에 어떤 코드가 실행되었는지를 낱낱이 파헤칩니다.
2. 이 도구는 어떻게 작동하나요? (기능)
이 도구는 마치 현미경을 들고 코드를 하나하나 뜯어보는 전문가처럼 작동합니다.
🔍 정밀한 탐색 (PE 헤더 분석): 프로그램의 설계도 (PE 헤더) 를 펼쳐서, "여기에 비밀 스위치 (TLS 디렉토리) 가 있구나!"라고 찾아냅니다. 32 비트와 64 비트 컴퓨터 모두에서 작동합니다.
📜 코드 해독 (디스어셈블리): 찾아낸 비밀 스위치에 적힌 코드를 해독합니다. 마치 암호를 풀어서 "이 스위치가 누르면 무슨 일이 일어나는지"를 보여줍니다.
🚨 위험 신호 감지 (패턴 매칭): 해커들이 주로 쓰는 나쁜 습관들을 찾아냅니다.
NOP 스레드 (NOP Sled): 해커가 실패하더라도 다시 시도할 수 있도록 길게 늘인 '안전 지대' 같은 코드.
스택 문자열: "안녕"이라는 단어를 'ㄴ', 'ㅏ', 'ㅎ' 순서로 하나씩 쌓아 숨기는 기술.
API 해싱: "파일 열기" 같은 명령어를 수학적으로 변형해서 숨기는 기술.
이 도구는 이런 나쁜 패턴을 자동으로 찾아내어 빨간색으로 표시해 줍니다.
🕵️♀️ 추가 수사 (YARA 및 정규식): 수사관들이 직접 만든 '수색 규칙 (YARA 규칙)'이나 '검색어 (정규식)'를 넣으면, 특정 해커 그룹의 특징까지 찾아낼 수 있습니다.
3. 실제 효과는 어떨까요? (결과)
자동화: 예전에는 수사관이 직접 코드를 하나하나 봐야 했지만, 이 도구는 자동으로 찾아주고 분석해 줍니다.
유연성: 수사관이 "이 정도 길이까지만 보여줘"라고 설정할 수 있습니다. (예: 64 바이트만 보여달라고 설정)
성공 사례: 이 도구를 테스트했을 때, 해커들이 사용하는 '비밀 스위치'를 정확히 찾아내고, 그 안에 숨겨진 나쁜 코드 (예: 디버거를 피하는 기술) 를 찾아냈습니다.
⚠️ 아직 부족한 점 (한계점)
이 도구는 아주 훌륭하지만, 완벽하지는 않습니다.
살아있는 상태만 봄: 이 도구는 컴퓨터가 켜져 있고 프로그램이 **실행 중인 상태 (메모리에 올라가 있는 상태)**에서만 작동합니다. 프로그램을 실행하고 종료해 버린 뒤에는 그 흔적을 찾을 수 없습니다. (마치 사람이 집을 떠난 뒤에는 문고리 안쪽의 흔적을 찾기 어려운 것과 비슷합니다.)
🏁 결론: 왜 이 연구가 중요한가요?
이 논문은 **"해커들이 가장 은밀하게 숨겨둔 문고리 안쪽 (TLS 콜백) 을 수사관들이 쉽게 열어볼 수 있게 했다"**는 점에서 매우 중요합니다.
기존에는 해커들이 이 부분을 이용해 "나는 여기 없어요!"라고 속일 수 있었지만, 이제 TLSCheck 2.0이라는 도구를 통해 수사관들은 그 숨겨진 문고리를 열어보고, "아, 여기 해커가 있었구나!"라고 확신할 수 있게 되었습니다. 이는 사이버 범죄를 막고, 더 안전한 디지털 환경을 만드는 데 큰 도움이 될 것입니다.
TLSCheck 2.0: 메모리 포렌식을 위한 TLS 콜백 효율적 탐지 및 분석 강화
1. 문제 정의 (Problem Statement)
메모리 포렌식의 중요성: 현대 악성코드는 디스크에 흔적을 남기지 않고 메모리 (RAM) 만을 사용하는 '메모리 기반 (Memory-resident)' 기법을 주로 사용하므로, 메모리 덤프 분석은 디지털 포렌식의 핵심입니다.
TLS 콜백의 이중성: 스레드 로컬 스토리지 (Thread Local Storage, TLS) 콜백은 프로세스 초기화 및 종료 시점에 자동으로 실행되는 합법적인 윈도우 구조입니다. 그러나 악성코드는 이를 은폐 (Stealth) 및 지속성 (Persistence) 수단으로 악용합니다.
예시: Ursnif, Nadnazz 봇 등 특정 봇넷은 디버거 (OllyDbg 등) 가 실행 지점 (Entry Point) 에서 멈추지 못하게 하거나, 정상적인 실행 흐름을 우회하여 초기화 단계에서 악성 코드를 실행합니다.
기존 도구의 한계:
Volatility 의 기존 callbacks 플러그인은 커널 수준의 콜백만 탐지하며, 사용자 모드 프로세스의 TLS 콜백은 다루지 못합니다.
malfind 플러그인은 메모리 주입 (Code Injection) 을 탐지하지만, TLS 콜백의 구체적인 분석이나 디스어셈블리 출력 길이에 제한이 있어 수동 분석 (volshell) 을 요구합니다.
TLS 콜백에 대한 전문적이고 자동화된 분석 도구의 부재로 인해, 고급 은폐 기법을 사용하는 위협을 탐지하기 어렵습니다.
2. 방법론 (Methodology)
이 논문은 Volatility 3 프레임워크를 기반으로 한 새로운 플러그인 TlsCheck를 제안하며, 다음과 같은 6 단계의 방법론을 따릅니다.
메모리 구조 분석 (Memory Structure Analysis):
PE (Portable Executable) 헤더를 파싱하여 IMAGE_TLS_DIRECTORY 구조를 찾습니다.
32 비트 및 64 비트 아키텍처 모두를 지원하며, AddressOfCallbacks 필드를 통해 콜백 함수 배열의 주소를 추출합니다.
가상 주소 (RVA) 를 파일 오프셋으로 변환하여 실제 메모리 덤프 내의 코드를 위치시킵니다.
패턴 탐지 구현 (Pattern Detection Implementation):
Capstone 디스어셈블러를 사용하여 추출된 콜백 코드를 역어셈블합니다.
사용자 정의 정규식 (Regex) 과 YARA 규칙을 적용하여 악성 패턴을 스캔합니다.
다층적 분석 (Multi-layered Analysis):
지시어 패턴 매칭: 악성 행위와 관련된 특정 어셈블리 지시어를 탐지합니다.
의미적 컨텍스트 분석: 단순 패턴 매칭을 넘어 실행 흐름을 분석합니다.
재귀적 디스어셈블리 (Recursive Disassembly): 알려진 API 가 아닌 메모리 주소로 호출되는 경우 (Indirect Call), 해당 주소까지 재귀적으로 디스어셈블하여 숨겨진 기능을 파악합니다.
API 해상도 (API Resolutions):
Import Address Table (IAT) 을 참조하여 동적으로 연결된 API 함수 이름을 식별합니다.
API 해싱 (API Hashing) 기법을 사용한 우회 호출을 탐지합니다.
결과 제시 (Result Presentation):
프로세스 정보, 메모리 위치, 디스어셈블된 코드, 탐지된 의심 패턴을 구조화된 형태로 출력합니다.
--disasm-bytes 플래그를 통해 디스어셈블할 바이트 수를 사용자가 커스터마이징할 수 있습니다.
주요 탐지 기법 (Attack Vectors Detection):
동적 메모리 접근을 통한 코드 주입: 레지스터 조작을 통한 임의 메모리 쓰기.
제어 흐름 하이재킹:call eax, jmp ebx 등 간접 점프를 통한 실행 흐름 조작.
스택 문자열 구성 (Stack String Construction):push, mov, xor 등을 이용해 스택에 문자열을 빌드하여 정적 분석을 회피하는 기법.
API 해싱: XOR, ROL, ROR 연산을 통해 API 이름을 숨기고 간접 호출하는 기법.
NOP-Sled 공격: 버퍼 오버플로우 공격 성공률을 높이기 위한 NOP 시퀀스 탐지.
3. 주요 기여 (Key Contributions)
Volatility 3 전용 플러그인 개발: Volatility Plugin Contest 2024 에서 수상한 초기 버전의 고도화된 버전으로, 최신 프레임워크에 최적화되었습니다.
자동화된 컨텍스트 인식 분석: 단순 주소 추출을 넘어, 콜백 코드를 자동으로 디스어셈블하고 의심스러운 행동 (NOP sled, API 해싱 등) 을 자동으로 플래그링합니다.
유연한 사용자 인터페이스:
--pid: 특정 프로세스 ID 대상 분석.
--disasm-bytes: 디스어셈블 바이트 수 조절 (기존 도구의 고정 길이 제한 해소).
--scan-suspicious: 의심 패턴 탐지 활성화.
--regex 및 --yara-file: 사용자 정의 패턴 및 YARA 규칙 적용 가능.
오픈소스 기여: 분석 도구와 소스 코드를 오픈소스 커뮤니티에 공개하여 포렌식 역량을 강화했습니다.
4. 결과 (Results)
테스트 환경: Windows 10 환경에서 생성된 커스텀 메모리 덤프 (VMware 스냅샷) 를 사용하여 테스트했습니다.
성공 사례:
정상적인 TLS 구현과 악성 패턴 (NOP sled, 안티 디버깅, 제어 흐름 조작 등) 을 성공적으로 탐지하고 시각화했습니다.
Malcat 툴과의 디스어셈블 결과 비교를 통해 정확성을 검증했습니다.
한계 사례 (Ursnif 변종):
특정 Ursnif 변종 샘플에서는 TLS 디렉토리에서 콜백을 추출하지 못했습니다.
IDA Freeware 를 이용한 분석에서도 동일한 문제가 발생하여, 이는 악성코드가 TLS 구조를 변조하거나 숨기는 고급 기법을 사용했음을 시사합니다. 이는 향후 연구 과제로 남았습니다.
5. 의의 및 중요성 (Significance)
새로운 위협 탐지 영역 개척: 기존에 간과되었던 TLS 콜백을 체계적으로 분석할 수 있는 첫 번째 자동화 도구 중 하나로, 메모리 포렌식의 범위를 확장했습니다.
실무적 가치: 인시던트 대응 (Incident Response) 및 악성코드 분석가들이 메모리 덤프에서 은밀하게 실행되는 위협을 신속하게 식별하고, 악성 코드의 초기화 로직을 역공학할 수 있는 능력을 제공합니다.
미래 연구의 기반: 프로세스가 종료된 후의 분석 (Retrospective analysis) 이나 숨겨진 프로세스 탐지 등 한계를 극복하기 위한 향후 연구의 발판을 마련했습니다.
이 논문은 메모리 포렌식 분야에서 TLS 콜백이라는 특정 기술적 난제를 해결하기 위한 실용적이고 확장 가능한 솔루션을 제시하며, 진화하는 사이버 위협에 대응하는 데 중요한 도구가 될 것으로 기대됩니다.