주요 내용으로 건너뛰기

메모리 취약점:과거, 현재, 미래 (4) Heap Attacks


스택 기반 공격에 대한 다양한 방어책이 제시되자, 공격자들이 다른 방향으로 Attack vector를 찾고자 눈을 돌린 곳이 바로 heap 영역이다. 그래서 힙 기반의 공격은 스택 기반 공격에 비해 비교적 늦게 연구가 시작되었다. 하지만 이내 대부분의 운영체제에서 Exploit이 가능함을 확인하게 되었다. 

1998년 DilDog에 의해 발표된 “L0pht Advisory MSIE4.0(1)”라는 내용으로 Bugtraq에서 최초로 Heap overflow에 대한 아이디어가 공개되었고, 그다음 해인 1999년에 w00w00팀의 “w00w00 on Heap Overflows"에서 힙 오버플로우 취약점에 대한 내용을 자세히 다루었다. 그러나 이때까지는 힙 오버플로우를 이용한 명쾌하고 적절한 익스플로잇 기법이 아직 충분히 공개되지 못하였으며 그저 초보적인 수준에 해당했다. 다만 Stack 뿐만이 아니라 Heap을 이용한 메모리 취약점 역시 시스템을 위험에 빠뜨릴 수 있다는 점을 시사하는데 그쳤다.

Heap-based memory error를 이용한 exploit을 구체적으로 전개한 사람은 Solar Designer이다. 그는 2000년에 “JPEG COM Marker Processing Vulnerability” 기고글을 통해 heap management metadata의 사용이 바람직하지 못하며 무결성 검사가 수반되지 않는 경우 사용하지 않는 것이 차라리 낫다는 점을 지적했다. 이를 이용해 heap management metadata를 손상시키는 방법으로 heap 기반 exploit을 성공시킨다면 임의의 코드를 수행할 수 있는 권한을 얻는데 이를 'write-anything-anywhere'이라고 하며, 이는 상당히 위력 있는 공격 기법으로 우려되었다. 다만 이는 스택의 상황에 비하자면 공격을 성공시키는 것 자체가 훨씬 더 어렵긴 하였다.  

2001년에는 Heap기반 exploit을 보다 자세히 다룬 내용이 Phrack Magazine에 실렸는데,  System V 및 GNU C 라이브러리 구현의 복잡성을 파헤쳐 힙 기반 메모리 오류 악용 사례를 작성하는 데 필요한 모든 정보를 꼼꼼하게 정리하였다.

  • MaXX, “VUDO Malloc Tricks”
  • Anonymous, “Once Upon a Free()”

또한 2003년에는 write-anything-anywhere 를 수행할 뿐만 아니라 데이터 기밀성 침해까지 수행할 수 있는 방법이 “Advanced Doug lea’s malloc exploits”으로 Phrack magazine에 공개되었는데, 이 공격은 심지어 ASLR이 적용된 Unix 시스템에 대해서도 성공 가능한 Heap exploitation 기법이었다.

한편 Heap 기반 공격은 Unix 환경을 기반으로만 많이 연구되었기에 Windows 운영체제는 이러한 Heap Exploit에 대한 연구가 비교적 적었다. 그러던 중 2002년에 Blackhat USA에서 Third Generation Exploitation 발표를 시작으로, 2004년에 마찬가지로 블랙햇 컨퍼런스에서 D. Litchfiel의 “Windows Heap Overflows” 등을 통해 Heap Exploit 가능성이 처음 입증되었다. 

이에 그해 출시된 Windows XP SP2부터는 Heap 영역이 Non-Executable 속성으로 전환되었다. 뿐만 아니라 heap cookies, Canary, safe heap management metadata unlinking(write-anything-anywhere를 할 수 없도록 패치한 버전) 등의 다양한 보호 기법이 추가되었다. 

그러나 이를 비웃기라도하듯, Windows XP의 보안패치가 적용되면 속속들이 이를 우회할 수 있는 공격 기법이 늘 발견되었다.

  • M. Conover and O. Horovitz, “Windows Heap Exploitation (Win2KSP0 through WinXPSP2),” in SyScan, Dec. 2004.
  • A. Anisimov, “Defeating Microsoft Windows XP SP2 Heap protection and DEP bypass,” Jan. 2005.
  • N. Falliere, “Critical Section Heap Exploit Technique,” August 2005.
  • B. Moore, “Exploiting Freelist[0] on XP SP2,” Dec. 2005.
  • M. Conover, “Double Free Vulnerabilities,” Jan. 2007.
  • J. McDonald and C. Valasek, “Practical Windows XP/2003 Heap Exploitation,” in Blackhat USA, July 2009.

특히 2004년에 P. Phantasmagoria가 공개한 “Exploiting the wilderness” 에 이르러서는, heap management metadata에 대한 무결성 손상에 대한 감지 기능이 적용된 dynamic memory allocator 패치 버전에 대해서도 성공적으로 exploit 할 수 있는 굉장히 통달한 수준의 heap attack이 제안되었다. 이러한 역동의 대격변이 이루어지자, 해커들은 Unix 뿐만 아니라 Windows 기반으로 무대를 자유롭게 넓혀왔다. 

Microsoft는 2007 년 1 월에 Windows Vista가 출시하며 Heap Exploit에 대응하는 더욱 Hardening tech를 덧붙였다. [A. Marinescu, “Windows Vista Heap Management Enhancements,” in Blackhat USA, August 2006.] 그리고 또 마찬가지로 Vista에 대한 Heap Exploit 역시 다시금 연구되었다.

  • N. Waisman, “Understanding and Bypassing Windows Heap Protection” June 2007.
  • B. Hawkes, “Attacking the Vista Heap” in Blackhat USA, August 2008.

2005년 “The Malloc Maleficarum”이라는 글에서 Heap exploit에 대한 다양한 시나리오를 가설로 제시한 적이 있는데, 해당 내용들에 대한 구체적이고 상세적인 증명이 Phrack magazine에 2009년과 2010년에 각각 “Malloc Des-Maleficarum”,  “The House Of Lore: Reloaded”으로 발표되기도 하였다. 특히 두 번째 글에서는 힙 기반 공격에 대한 방어 메커니즘으로 NX-heap의 효율성에 대해 언급하였는데 NX-stack의 과거에서 교훈을 찾을 수 있듯이, 예상대로 Non-Executable Heap은 return-into-libc 또는 Return Oriented Programming 기반의 공격으로 우회가 가능하였다. 다른 대안은 ASLR이었고, ASLR 보호 기법에 대한 효과적인 공격 기법이 필요하게 되었다.

이후 현재 시점까지 밝혀진 ASLR에 대항하는 공격 기법은 Heap spraying과 Heap Feng Shui라고 알려진 기법들이다. 이는 주로 웹 브라우저의 취약점을 대상으로 많이 사용되는데, JavaScript 및 ActionScript와 같이 클라이언트 측에서 작동하는 웹 브라우저에서 end-user의 호스트 컴퓨터를 감염시키는 용도로 이용되곤 한다. 


결론적으로 요약하면, 역사적으로 Heap에 대한 공격으로는 classic overflow를 통한 주변 메모리 주소 조작과, heap management metadata에 대한 corruption을 통해 write-anything-anywhere 권한을 획득하는 것을 통해 임의 코드를 수행하는 취약점이 주를 이루었고, 이후 heap cookie, safe heap management metadata unlinking, 무결성 점검 등의 보호 기법이 적용되어 길이 막히게 되었다. 또한 ASLR 보호 기법이 대중화됨에 따라 heap영역의 주소 역시 무작위로 배치되어 heap exploit이 곤란하게 되었다.  기본적으로 Heap overflow를 통한 공격이 스택 기반 공격에 비해 그 과정과 방법이 더 어렵고, heap allocator의 구현이 보안적으로 많이 개선되었기에 일부 공격에 성공하더라도 exploit까지 수행하기는 더더욱 어려운 실정이다.

현재 시점에서 가장 진보된 공격 기법은 Heap Spraying으로 ASLR을 우회하는 방법까지 포함한다. 연구가 더 필요한 지점은 Heap Spraying에 대한 방어책인데, 실제로 이는 인터넷 브라우저를 통해 상당수의 악성코드를 배포하고는 공격수단(Drive-by-Downloads)으로 사용되고 있기 때문이다.

  • M. Egele, P. Wurzinger, C. Kruegel, and E. Kirda, “Defending Browsers against Drive-by Downloads: Mitigating Heap-Spraying Code Injection Attacks” in DIMVA, July 2009.

이에 대한 효과적(effective)이고 효율적인(efficient) 보호 기법 연구가 조속히 진행되기를 바란다.

Software Security Engineer

CPUU 님의 창작활동을 응원하고 싶으세요?

댓글

SNS 계정으로 간편하게 로그인하고 댓글을 남겨주세요.