상세 컨텐츠

본문 제목

CVE-2015-7547: glibc getaddrinfo 스택 버퍼 오버플로우 취약점

국내외 보안동향

by 알약(Alyac) 2016. 2. 17. 14:20

본문

CVE-2015-7547: glibc getaddrinfo 스택 버퍼 오버플로우 취약점



최근 구글 엔지니어가 특정 호스트에 연결을 시도할 때 마다 SSH 클라이언트에서 segfault가 발생한다는 사실을 알아냈습니다. 이에 대해 추가로 조사를 진행하던 중, 문제는 SSH가 아니라 glibc에 존재한다는 사실을 발견하였다고 합니다.

연구 끝에 구글은 이 이슈가 원격 코드 실행으로도 이어질 수 있다고 결정내렸습니다.


glibc란?

GNU C Library의 약자로, C언어로 작성한 프로그램이 동작하기 위해 필요한 C 표준 라이브러리의 한종류입니다. GNU프로젝트의 일환으로 만들어졌으며, GNU시스템과 리눅스에서 많이 사용됩니다.



이슈 요약


초기 연구를 통해 구글은 해당 이슈가 모든 버전의 glibc 2.9 이상 모든 버전에 영향을 미친다는 것을 발견하였습니다. 만약 언급된 glibc 버전보다 더 오래 된 버전을 사용하고 있다고 하더라도, 업데이트를 하는 것이 좋습니다. 만약 이 취약점이 발견 된 상태라면, 기기 관리자들은 공격 위험을 완화 시키기 위한 대응 작업을 진행해야 합니다.

이 취약점(CVE-2015-7547)은 glibc DNS 클라이언트 단의 resolver에서 발생하는 스택 버퍼 오버플로우이며, 리눅스 장비에 원격 코드 실행으로 이어질 수 있습니다. 이는 getaddinfo() 라이브러리 함수가 사용 되었을 때 발생하게 되며 이 함수를 사용하는 소프트웨어는 공격자가 제어하는 도메인명, DNS 서버에 악용될 수 있으며, 중간자 공격에 취약할 수 있게 됩니다.

구글은 glibc를 당장 패치할 수 없을 경우, 공격을 방지하는데 도움을 줄 수 있는 완화법을 공개하였습니다. 이 취약점은 스택을 덮어쓸 다른 응답이 뒤이어 오는, 매우 큰 (2048 바이트 이상) UDP나 TCP 응답을 필요로 하는데, 이때 로컬에서 DNS resolver가 수락하는 응답의 크기에 제한을 두고, DNS 쿼리들이 Truncation bit set으로 UDP 응답의 사이즈를 제한하는 DNS 서버로 보내지는지 확인 하는 것이 구글이 공개한 완화법입니다.



기술적 정보


Glibc는 DNS 쿼리에 대한 호스팅 응답을 위한 _nss_dns_gethostbyname4_r()의 DNS 답변을 위해 alloca()를 통해 스택에 2048바이트의 공간을 예약합니다. 이후 send_dg()와 send_vc()에서, 응답이 2048 바이트보다 클 경우 새로운 버퍼가 heap으로부터 할당 되고 모든 정보(버퍼 포인터, 새 버퍼 사이즈, 응답 사이즈)가 업데이트 됩니다.

일부 조건 하에서, 스택 버퍼와 새로운 heap 할당이 잘못 매치 되는 경우가 있습니다. 또한 응답 사이즈가 스택 버퍼보다 크고 heap 버퍼가 할당 된 경우라도, DNS 응답을 저장하는데 스택 버퍼가 사용되게 되는데 이로 인해 스택 버퍼 오버플로우가 발생할 수 있습니다.

이 버퍼 오버플로우를 촉발시키는 벡터들은 매우 흔하며, ssh, sudo, curl도 예외가 아닙니다. 구글 엔지니어들은 악용 가능한 벡터들이 매우 다양하며 널리 퍼져있다고 확신하고 있습니다.



악용


원격 코드 실행이 가능하지만, 그리 간단하지만은 않습니다. ASLR과 같은 시스템의 보안 장치들을 우회 해야 하기 때문인데요. 구글 엔지니어들은 자신들이 만든 익스플로잇 코드를 공개 하지는 않을 예정이지만, 공격적이지 않은 PoC는 현재 공개해둔 상태입니다. 이를 이용하여 관리자는 본인이 관리하는 시스템이 이 이슈에 영향을 받는지 여부 및 완화법 등을 확인해볼 수 있습니다.


아래 디버깅 세션에서 확인할 수 있듯이, EIP/RIP을 확실히 제어 가능합니다.


(gdb) x/i $rip

=> 0x7fe156f0ccce <_nss_dns_gethostbyname4_r+398>: req

(gdb) x/a $rsp

0x7fff56fd8a48: 0x4242424242424242 0x4242424242420042


코드에 충돌이 일어날 경우, 이는 보이는 것 보다 훨씬 중요한 신호일 수 있습니다. 충돌을 무시하려면 위험을 감수해야 합니다.


ASLR로 인한 익스플로잇 실패 지표의 범위는 아래와 같습니다.


  • 공격자가 제어하는 ptr에서 free(ptr) 충돌 발생
  • ptr이 유효한 읽을 수 있는 주소여야 하기 때문에, 공격자가 어느 정도 제어하는 ptr에서 free(ptr) 충돌 발생
  • 로컬에서 덮어쓰기 된 변수가 가리키는 메모리 읽기 시 충돌 발생
  • 공격자가 제어하는 포인터의 메모리 쓰기 시 충돌 발생



CVE-2015-7547 취약점 관련 패치는 이곳에서 다운 받을 수 있습니다.

https://sourceware.org/ml/libc-alpha/2016-02/msg00416.html




출처:

https://googleonlinesecurity.blogspot.kr/2016/02/cve-2015-7547-glibc-getaddrinfo-stack.html

https://github.com/fjserna/CVE-2015-7547



관련글 더보기

댓글 영역