리눅스 GNU C 라이브러리(glibc 2.9 이상)에서 원격코드 실행이 가능한 취약점(CVE-2015-7547)이 발견되었다. 해당 취약점은 2015년 7월 13일에 최초 확인되었으며 구글 온라인 시큐리티 연구팀에서 추가연구를 통해 원격코드 실행으로 이어질 수 있다는 것을 확인하였다. ※ GNU C 라이브러리(glibc) : 리눅스 계열 운영체제에서 C언어로 작성된 실행파일들이 동작하기 위해 공통적으로 사용하는 기능을 쉽게 이용할 수 있도록 묶어 놓은 소프트웨어 집합
2. 취약점 정보
■ 취약점 영향 · 원격코드 실행
■ 영향을 받는 환경 · GNU glibc 2.9 이후 버전을 사용하는 시스템
■ 취약점 설명 · glibc DNS 클라이언트 단의 resolver에서 발생하는 스택 버퍼 오버플로우이며, 이는 getaddinfo() 라이브러리 함수가 사용 되었을 때 내부적으로 send_dg (UDP 쿼리의 경우) 및 send_vc (TCP 쿼리의 경우) 함수에서 발생한다. 해당 취약점은 MITM과 같은 중간자 공격을 통해 공격자가 제어하는 DNS 서버로의 접속 시 특수하게 조작된 DNS 응답을 만들어 libresolv를 중단하거나 library를 실행하는 사용자의 권한으로 잠재적으로 코드를 실행할 수 있다.
3. 취약점 분석
취약점을 다루기에 앞서 본문에서 반복적으로 언급되는 포인터 변수에 대한 설명은 다음과 같다.
포인트 변수
설명
ansp
첫 번째 응답 버퍼의 주소를 가리킨다.
anssizp
첫 번째 응답 버퍼의 사이즈를 가리킨다.
ansp2
두 번째 응답 버퍼의 주소를 가리킨다.
anssizp2
두 번째 응답 버퍼의 사이즈를 가리킨다.
thisansp
현재 진행 중인 응답 버퍼의 주소를 가리킨다.
thisanssizp
현재 진행 중인 응답 버퍼의 사이즈를 가리킨다.
thisresplenp
현재 진행 중인 응답 패킷의 길이를 가리킨다.
취약점은 클라이언트가 DNS 서버로의 질의를 하면서 시작된다. DNS query를 전송하기 전 클라이언트는 DNS 응답수신을 위해 stack에서 2048 byte의 메모리를 할당받는데 이 stack 주소는 send_dg() 함수 안에 반복적으로 사용된다.
클라이언트의 요청을 받은 DNS 서버(공격자가 제어)는 첫 번째 응답으로 DNS 응답패킷을 나타내는 헤더와 함께 “00”으로 이루어진 2048 Bytes의 패킷을 클라이언트로 전송한다.
첫 번째 응답을 수신하면 포인터 변수(thisanssizp)는 첫 번째 응답 버퍼의 사이즈를 가리키는 주소를 얻고 첫 번째 응답이 수신되었음을 체크하기 위해 변수(recvresp1)를 “1”로 설정한 후 goto 문에 의해 wait 로 돌아가 두 번째 응답을 수신하기 위한 준비를 한다.
DNS 서버는 첫 번째 전송 패킷과 동일한 패킷을 두 번째 응답으로 클라이언트에 다시 전송한다.
클라이언트에선 goto 문에 의해 wait 단계로 다시 돌아온 후 조건 분기를 하게 되는데 이미 첫 번째 응답을 받았고 buf2는 non-NULL 상태이기에 else 조건을 실행한다. 이 과정에서 orig_anssizp(2048) - resplen(2048) 연산에 의해 두 번째 응답 버퍼의 사이즈(anssizp2)의 값이 “0” 으로 설정된다.
변수
설명
orig_anssizp
첫 번째 응답 버퍼의 사이즈를 저장한다.
resplen
첫 번째 응답 패킷의 길이를 저장한다.
두 번째 응답 버퍼의 주소(ansp2)와 사이즈(anssizp2), 응답 길이(resplen2)는 각각의 포인터 변수들(thisansp, thisanssizp, thisresplenp)에게 저장이 되고 조건 분기를 하게 되는데 이때 3가지 And 조건을 모두 만족하므로 malloc() 함수를 통해 MAXPACKET(65535 bytes)의 동적 메모리를 생성한다. 이때 첫 번째 응답버퍼의 사이즈(anssizp)는 MAXPACKET(65535 bytes)으로 변경되는데 이는 버퍼 오버플로우가 발생하는 원인이 된다.
이후 응답 패킷의 길이를 확인하기 위해 recvfrom 함수를 사용하는데 이때 인수로 주어진 포인터 변수(*thisansp)는 새로 할당된 버퍼(new buffer)를 가리키지만 포인터 변수(*thisanssizp)는 두 번째 응답 버퍼의 사이즈(anssizp2)인 “0” 을 가리키므로 포인터 변수(*thisresplenp)의 값은 “0”이 설정된다. 포인터 변수(*thisresplenp)의 값은 그 다음 조건 분기에서 포인터 변수(thisresplenp)의 값이 “0” 이기 때문에 err_out 로 이동하게 되고 send_dg()함수는 종료된다.
여기까지가 최초 취약점이 발견된 시점(2015년 7월 13일)에 확인된 내용으로 단순 크래쉬 현상으로만 판단되었으나 이후 구글 온라인 시큐리티 연구팀에서 추가연구를 통해 클라이언트가 위 과정들로 발생한 에러로 인해 send_dg()가 종료되지만 __libc_res_nsend을 다시 순환하는 과정에서 이전에 사용된 버퍼가 재사용되고 이로 인해 버퍼 오버플로우가 발생함을 확인한다.
순환과정이 종료되기 전에 버퍼 오버플로우를 일으키기 위해서 DNS 서버는 세 번째 응답 패킷(2048byte 이상, 최대 65535 byte)을 전송한다.
이때 첫 번째 응답을 처리할 때처럼 포인터 변수(thisanssizp)는 첫 번째 응답 버퍼의 사이즈를 가리키는 주소를 얻게 되지만 이 주소가 가지고 있는 값은 처음과 같은 “2048”이 아닌 두 번째 응답 패킷을 처리하는 과정에서 할당된 MAXPACKET(65535 bytes)이다.
이와 같이 잘못된 사이즈를 참조한 상태에서 로직대로 흘러가다가 recvfrom() 함수를 처리하는 과정에서 스택을 덮어쓰게 되면서 버퍼 오버플로우가 발생한다.
이를 이용해 2048의 정상 범위를 제외하고 나머지 63487 bytes는 공격자가 제어할 수 있는 공격 코드로 사용될 수 있다.
이 후 점검하고자 하는 서버(또는 PC)의 DNS 설정을 변경한다. 필자는 VMWare에서 테스트한 관계로 VM 네트워크 설정을 변경하였다.
DSN 설정 완료 후 glibc 라이브러리를 사용하는 어플리케이션(ex. ssh)을 이용하여 임의의 사이트에 접속을 시도한다. 테스트 결과 아래 그림과 같이 “Segementation fault” 메시지가 발생할 경우 취약한 버전의 glibc 라이브러리를 사용하는 것으로 판단한다.
'(주)이글루시큐리티'는 (이하 '회사'는) 고객의 개인정보를 중요시하며, "정보통신망 이용촉진 및 정보보호 등에 관한 법률"을 준수하고 있습니다.
회사는 개인정보취급방침을 통하여 고객이 제공하는 개인정보가 어떠한 용도와 방식으로 이용되고 있으며, 개인정보보호를 위해 어떠한 조치가 취해지고 있는지 알려드립니다.
본 방침은 2016년 9월 23일부터 시행됩니다.
수집항목 : 이름, 회사명, 이메일, 연락처
개인정보의 수집 및 이용목적
회사는 수집한 개인정보를 다음의 목적을 위해 활용합니다.
- DEMO 요청 : 사용자와의 신원확인 및 처리사항 전달
개인정보의 보유 및 이용기간
회사는 개인정보 수집 및 이용목적이 달성된 후에는 예외 없이 해당 정보를 바로 파기합니다.
개인정보의 파기
회사는 원칙적으로 개인정보 수집 및 이용목적이 달성된 후에는 해당 정보를 바로 파기합니다. 방법은 다음과 같습니다.
- 파기방법 : 전자적 파일형태로 저장된 개인정보는 기록을 재생할 수 없는 기술적 방법을 사용하여 삭제합니다.
개인정보 제공
회사는 이용자의 개인정보를 원칙적으로 외부에 제공하지 않습니다. 다만, 아래의 경우에는 예외로 합니다.
- 고객이 사전에 동의한 경우
- 법령의 규정에 따르거나, 수사 목적으로 법령에 정해진 절차와 방법에 따라 수사기관의 요구가 있는 경우
수집한 개인정보의 위탁
회사는 고객님의 동의없이 고객님의 정보를 외부 업체에 위탁하지 않습니다.
이용자 및 법정대리인의 권리와 그 행사방법
이용자 및 법정 대리인은 언제든지 등록된 자신 혹은 당해 만 14세 미만 아동의 개인정보를 조회하거나 수정할 수 있으며 가입 해지를 요청할 수도 있습니다. 이용자 혹은 만 14세 미만 아동의 개인정보 조회ㆍ수정을 위해서는 ‘개인정보변경’(또는 ‘회원정보수정’ 등)을 가입해 지(동의철회)를 위해서는 “회원탈퇴”를 클릭하여 본인 확인 절차를 거치신 후 직접 열람, 정정 또는 탈퇴할 수 있습니다. 혹은 개인정보관리책임자에게 서면, 전화 또는 이메일로 연락하시면 바로 조치하겠습니다. 귀하가 개인정보의 오류에 대한 정정을 요청하신 경우에는 정정을 완료하기 전까지 당해 개인정보를 이용 또는 제공하지 않습니다. 또한, 잘못된 개인정보를 제3자에게 이미 제공한 경우에는 정정 처리결과를 제3자에게 바로 통지하여 정정이 이루어지도록 하겠습니다. 이용자 혹은 법정 대리인의 요청으로 해지 또는 삭제된 개인정보는 “회사가 수집하는 개인정보의 보유 및 이용 기간”에 명시된 바에 따라 처리하고 그 외의 용도로 열람 또는 이용할 수 없도록 처리하고 있습니다.
개인정보 자동수집 장치의 설치, 운영 및 그 거부에 관한 사항
쿠키 등 인터넷 서비스 이용 시 자동 생성되는 개인정보를 수집하는 장치를 운영하지 않습니다.
개인정보에 관한 민원서비스
회사는 고객의 개인정보를 보호하고 개인정보와 관련한 불만을 처리하기 위하여 아래와 같이 관련 부서 및 개인정보보호책임자를 지정하고 있습니다.
고지의 의무
정부의 정책 또는 보안기술의 변경, 개인정보 위탁업체 등의 변경에 따라 내용의 추가ㆍ삭제 및 수정이 있을 시에는 개정 전에 홈페이지 “소식” 게시판을 통해 고지합니다.
재화나 서비스의 홍보 및 판매 권유, 기타 이와 관련된 목적으로 개인정보를 이용하여 정보주체에게 연락할 수 있습니다.
고객서비스 담당부서 : 마케팅기획팀
전화번호 : 02-6715-2372
이메일 : mkt@igloosec.com
개인정보보호책임자 성명 : 이정원 (마케팅기획팀 팀장)
전화번호 : 02-6715-2372
이메일 : mkt@igloosec.com
귀하께서는 회사의 서비스를 이용하시며 발생하는 모든 개인정보보호 관련 민원을 개인정보관리책임자 혹은 담당 부서로 신고하실 수 있습니다.
회사는 이용자들의 신고사항에 대해 신속하게 충분한 답변을 드릴 것입니다.
기타 개인정보침해에 대한 신고나 상담이 필요하신 경우에는 아래 기관에 문의하시기 바랍니다.
원하시는 계정으로 로그인 후 댓글을 남겨 주세요.