[Threat Analysis] TDL4, 예방이 최선의 방어다
|
<연재 목차>
1. TDL4 부트킷의 유래 및 배포 과정, 특징(2011년 10월호)
|
지금까지 TDL4 부트킷의 유래와 배포 과정, 그 특징, 상세 분석 과정과 기능 등에 대해 알아봤다. 악성코드들은 x64 감염 및 Anti-Virus 기능을 위해 부트킷을 많이 사용하고 있다. 드라이버 무결성 검사를 우회하는 기법들을 이용하여 악성 드라이버를 실행시키기도 한다. 앞으로는 이러한 기법들이 더욱 지능화되고 다양해질 것이다. 감염되지 않는 것이 최선의 방법이다.
1. StartIo 후킹
TDL4는 Atapi.sys의 StartIo() MajorFunction을 후킹하여, MBR 영역 및 언파티션드 영역을 접근하는 IO에 대해 백업된 정상 MBR 및 NULL 채워진 데이터를 보여준다. TDL4를 치료하기 위해 StartIo 후킹에 대해 무력화를 시도하여도, System Thread에 의해 다시 후킹된다.
또한 PsSetLoadImageNotifyRoutine에 의해 CallBack 함수를 등록하는데, 프로세스 이미지가 로드될 때마다 NotifyRoutine를 실행한다. Kerne32.dll에서 LoadLibraryExA(), GetProcAddress(), VirtualFree API 주소를 얻어오고, APC Queue를 이용하여 ExQueueWorkItem()으로 Thread를 실행한다.
[그림 1]과 같이 TDL4 메인 드라이버는 StartIo 자기 코드로 후킹하고 있다.

[그림 1] StartIo 후킹
MBR 및 언파티션드 영역의 TDL4 모듈에 디스크 액세스 시 MBR은 정상 백업된 데이터를, TDL4 모듈은 0x0를 채워 보내게 된다.

[그림 2] MBR 및 TDL4 모듈 보호
프로세스 인젝션
프로세스 이미지가 로드될 때, TDL4 모듈 중 Cmd.dll(64)이 메모리에 인젝션되어 동작한다. 인젝션된 코드는 자신이 원하는 프로세스를 찾게 되는데, svchost.exe이며 파라미터가 netsvcs인지 확인한다.

[그림 3] Svchost.exe 파라미터 확인
또한 [그림 3]과 같이, 인터넷 브라우저와 같은 프로세스 이름을 확인한다.

[그림 4] 인젝션 프로세스 대상 이름
다시 정리하면, 프로세스 이름이 svchost.exe(netsvcs), *explo*, *firefox*, *chrome*, *opera*, *safari*, *netsc*, *avant*, *browser*, *mozill*, *wuauclt* 일 경우 cmd.dll이 인젝션되어 동작한다.
위와 같은 프로세스면, WorkItem을 등록하여 실행한다.

[그림 5] WorkItem 실행
다음은 언파티션드 영역에 존재하는 cfg.ini 파일을 읽고, 동작 시 필요한 데이터를 얻는다.

[그림 6] cfg.ini 파일 읽기
이후 Mswsock.dll의 WSPSend(), WSPRecv(), WSPCloseSocket() API를 후킹하는데, 이것은 윈도우 업데이트를 막기 위한 것이다.

[그림 7] Mswsock.dll 후킹
후킹된 API는 HTTP 리퀘스트의 아래와 같은 정보를 저장한다.

또한 Clicker 기능을 가지고 있는데, Cfg.ini 파일에서 서버 리스트를 얻어온다. 아래 코드와 같이 “svchost”라는 이름의 Class를 생성한다. WM_Create 메시지를 받을 때 “WebVrowser” Active-X 컨트롤을 생성한다.

[그림 8] Clicker
자기 보호 Unhook 방지
TDL4는 원하는 후킹 작업을 완료하고 나면, Worker Thread 형태로 자기 보호 기능을 수행한다.

[그림 9] 자기 보호를 목적으로 하는 Worker Thread 수행
[그림 10]과 같이, StartIo에 대한 후킹 여부를 확인하여, 언훅일 경우 다시 후킹하는 기능이 있다.

[그림 10] 자기 보호 Worker Thread Code
따라서 위와 같은 Worker Thread를 종료해야만 MBR 등을 원상복구할 수 있다.
2. 치료 방법
TDL4 치료를 위해 아래와 같은 두가 지 작업이 필요하다.
Atapi.sys(filesystem minifilter Driver) StartIo 원복
ExQueueWorkItem()을 이용하여 생성된 Worker Thread가 해당 StartIo를 감시하여, 지속적으로 후킹하기 때문에 해당 Worker Thread를 Kill 또는 Suspend 해주는 기능이 필요하다.
Atapi.sys(filesystem minifilter driver) Device Object 중 하나가 TDL4 Driver Object를 가리키고 있기 때문에 이것을 원래 Atapi.sys Driver Object로 변경하는 작업이 필요하다. 또한 Atapi.sys Device Object의 링크드 리스트를 변조하여 은폐하고 있다.
위와 같은 두 가지 작업을 하기 전에는, 감염된 상태에서 정상 MBR를 보여주기 때문에 임시 버퍼에 저장한 후, 위 작업을 마치면 악성 MBR 및 언파티션드 영역의 TDL4 모듈에 액세스할 수 있다. 이때 임시 버퍼에 저장된 정상 MBR를 악성 MBR로 교체하고 재부팅하면 TDL4가 더는 동작하지 않는다.
TDL4는 일단 감염되면 일반 사용자들은 감염 여부를 확인조차 할 수 없을 정도로 정교하게 제작된 악성코드이다. 따라서 보안 업데이트 패치 및 AV 최신 패치, 검증되지 않은 파일을 실행하지 않는 등 사용자의 주의가 매우 중요하다.@
- 안철수연구소