DLL Injection 의 절대방어는 가능한가
몇년 전까지만 해도 DLL Injection 이 굉장한 해킹 기술 중의 하나였고, DLL Injection 을 구현해서
어떠한 해킹 행위를 하는 것은 존경받거나 추앙받을만한 일이었습니다. 그러나 기술의 발전과
정보의 공유로 요즘은 DLL Injection 이 평범한 대중적인 기술이 되었고, 기본중의 기본 아니 그냥
기초학문 정도로 전락한 것 같습니다. 뭐 한마디로 개나새나 다 하는 기법이 됐습니다.
(이상하게 Injection 이라는 단어는 좋지 않은 의미로 주로 쓰이는 것 같네요. 웹 해킹의
SQL Injection도 그렇고...)
그러나 분명한 건, 대중적인 기술이고 개나새나 초딩도 구현할 수 있는 기법이면서
아직도 그걸 막을 수 있는 획기적인 대책은 아직 나오지 않았다는 겁니다. 이 대목에서
"이사람! DLL Injection 을 방어하는 방법에 대해서 전혀 접해본 것도 없나?" 라고 생각하신
분들 혹시 BaseThreadStartThunk 나 LoadLibraryExW 같은것 말씀하시려는 모양이라면
네 벌써 써봤습니다. 그리고 시원~~하게 뚫려 봤습니다. 라고 하고 싶네요 ㅠㅠ
몇년간 DLL Injection 을 막으려고 오만가지 생각과 오만 짓들을 다 해봤습니다만
해커들은 항상 생각지도 못한 개구멍을 찾아내서 결국은 넣더군요...;; 요즘엔 사실
답이 없다 라는 생각만이 앞섭니다.
제가 겪은 난점은 이렇습니다.
무수히 많지만 공개가능한 수준에서 세가지 정도만 나열해 보겠습니다.
1. DLL Injection 을 방어하는 루틴이 아무리 빨리 등장해도, ( WinMain()의
맨 윗줄이나 TLS CallBack 에도 넣어봤음) 해커들은 그 루틴이 등장하기 전에
주입을 함.
2. 보호 루틴을 먼저 띄운후 대상을 로딩해도, 시스템 DLL 을 가장해서 삽입 ;;
3. 다른 DLL 의 Import Table 에 Hacker.dll 을 추가하여 인젝션.
사실 요거 세개의 조합으로만 움직여도 인젝션 그 자체를 차단하는 것은 불가능 합니다.
현업에서 해커들에게 많이 시달려본 분은 이미 아시는 사실일 수도 있겠지만
정말 인젝션 그 자체를 차단하는 것은 영원히 해결되지 않을 난제라고 해도 무리는
아닌 것 같습니다.
그래서 저는 DLL Injection 을 감지/차단 하는 방법은, 사실 논문이나 연구자료 정도
이상으로 써먹기는 힘들다고 생각합니다. 필드에서는 뭐 그걸로 "어느 정도" 의 효용성은
발휘할 지 몰라도 정말 맘먹고 뚫는 해커에겐 소용없는 짓이라는걸 너무 많이 느꼈습니다.
우리가 일반적으로 아는 상식으로는 클라이언트 단에서는 맘먹고 뚫으면 절대 막을 수
없다고 하지만, 실제로 클라이언트 단이라도 정말 맘먹고 막으면 차단이 가능한 영역도
분명히 있습니다. 다만 "DLL Injection 의 절대 방어"는 그 영역이 아니라고 하고 싶네요.
window31. 2009년 9월.
