Attack 보고서
버퍼 오버플로우
버퍼 오버플로우란 버퍼를 넘치게 하여 프로그램의 실행 흐름을 변경함으로써, 임의의 코드를 실행하게 하는 기술이다. 버퍼의 경계 값을 검사하지 않는 함수를 사용할 때, 이 함수가 사용자의 압력 값을 다룬다면, 공격자는 버퍼를 넘치는 값을 주입하여 프로그램의 실행 흐름을 변경할 수 있다. 버퍼 오버플로우는 보통 데이터를 저장하는 과정에서 그 데이터를 저장할 메모리 위치가 유효한지를 검사하지 않아 발생한다. 이러한 경우 데이터가 담긴 위치 근처에 있는 값이 손상되고 그 손상이 프로그램 실행에 영향을 미칠 수도 있다. 특히, 악의적인 공격으로 인해 프로그램에 취약점이 발생할 수도 있다. 흔히 버퍼 오버플로우와 관련되는 프로그래밍 언어는 C와 C++로 어떤 영역의 메모리에서도 내장된 데이터 접근 또는 덮어쓰기 보호 기능을 제공하지 않으며 어떤 배열에 씌여지는 데이터가 그 배열의 범위 안에 포함되는지 자동으로 검사하지 않는다.
버퍼 오버플로우의 역사
1973년 경에, c언어의 데이터 무결성 문제로 그 개념이 처음 알려졌으나, 1988년 인터넷을 통해 확산된 최초의 Worm인 Morris Worm에 의해 버퍼 오버플로우 문제의 심각성이 널리 알려지게 되었다. 1996년 Aleph1의 "Smashing the stack(For fun and Profit) 이라는 기사가 Phrack 49호에 발표되면서 "버퍼 오버플로우 시대" 라고 불릴 정도로 많은 공격 코드들이 발표되게 된다.
버퍼 오버플로우 공격 기법
Return Into Libc
이 공격 방식은 스택에 코드를 두는 것이 아니라 공유 라이브러리에 존재하는 System과 같은 함수를 가리키게 하여, 함수 실행에 필요한 매개 변수를 전달하여 실행하는 공격법이다. 이를 막기 위해서, 공유 라이브러리들의 기본 주소를 mmap() 함수를 사용하여 0을 포함하는 주소로 변경하였다. 일반적으로 공격 코드는 아스키 문자열의 형태로 전달되므로, 0을 문장의 끝으로 인식하기 때문에, 이 방법을 무력화할 수 있다.
Heap Overflow
스택에 집중된 오버플로우 공격과 달리, Heap 메모리에서도 가능하다는 것을 보여줌
Windows 버퍼 오버플로우
CDC (Cult of Dead Cow)의 멤버인 Dildog가 1998년 4월에 리눅스에 집중된 버퍼 오버플로우 공격 방법이 아닌 윈도우즈에서의 버퍼오버플로우 방식을 발표함. 소스가 공개되어 있지 않더라도 안전하지 않다는 것을 세상에 알림
Frame Pointer Overwrite
Saved Frame Pointer (SFP)의 단지 1바이트 조작만으로도 프로그램의 실행 흐름을 바꾸는 것이 가능하다는 것이다. 이 기술은 SFP의 마지막 1바이트를 덮어써서 eip가 버퍼에 주입된 Shellcode를 가리키는 주소가 되도록 조작한다.
포맷 스트링
이 기술은 전형적인 C 라이브러리들의 취약점 이용하며 printf() 계열의 함수들을 공격 대상으로 한다. printf() 계열 함수들은 출력 시 포맷 스트링 지정자라고 불리는 인자들을 받아서 데이터의 출력되는 형태를 가공하며 이 포맷 스트링 지정자들은 "%d", "%s", "%l" 등 여러 종류가 있다. 포맷 함수의 인자들은 모두 스택에 저장된다. 입력 값으로 '%x' 가 들어가게 되면 printf() 함수는 스택의 메모리를 출력하게 된다. 이런 스택을 조작할 수 있는 포맷 스트링을 이용하여 RET 값을 수정할 수 있고 원하는 shellcode를 실행할 수 있다.
버퍼 오버플로우 대응 기법
Stack Overflow
스 택의 특성을 이용하는 공격으로서, 스택을 넘치게 하여, Return 어드레스를 수정하여 임의의 코드를 수행할 수 있도록 하는 방식. 이를 막기 위해서, 스택에서는 어떤 코드도 실행하지 못하도록 막아서 Stack overflow 공격을 막았는데 이를 Non-executable Stack이라고 한다.
Stack Guard
컴파일러를 이용하는 방식으로서, 프로그램의 함수 프롤로그 시에 RET 앞에 Canary 값을 주입하고 에필로그 시에 Canary 값이 변조되었는지의 여부를 확인하여 버퍼 오버플로우 공격을 탐지하게 된다.
Random Stack
공격자가 RET를 변조하기 위해서는 오버 플로우 되는 버퍼의 주소를 알아내는 것이 필요하다는데 착안을 두어, 프로그램이 실행될 때마다 스택이 서로 다른 주소에 위치하도록 하여 버퍼의 주소를 알아내기 힘들게 한다.
Stack Shield
RET를 보호하는 것을 주목적으로 한다. Stack Shield는 함수의 프롤로그 때, RET를 Global RET Stack이라는 특수 스택에 저장하고, 함수의 에필로그 시에 Global RET Stack에 저장된 RET 값과 비교하여 일치하지 않으면 프로그램을 종료시킨다.
Static Source Code Analysis
정적 소스 코드 검사를 기반으로 하는 버퍼 오버플로우 공격 자동탐지 기술이다.
LibSafe
이 기술은 취약하다고 알려진 모든 함수의 Call을 가로채어 안전한 다른 함수로 전환한 뒤에 그 결과를 반환하는 방식이다.
PaX
grsecurity team에서 X86에서 Non-executable page를 구현한 리눅스 패치를 발표하는데 이것이 바로 PaX이다. 스택과 Heap 모두를 보호한다. Non-executable이 구현된 page에 대해 violate가 일어나지 않는 상태들을 취합하여 읽고 쓸 수는 있지만 실행은 불가능한 페이지를 구현함으로써 프로세스에 주입한 임의의 shellcode를 실행하는 것이 불가능하도록 하였다.
FormatGuard
포맷 스트링 공격을 막기 위한 대응책으로서, 포맷 스트링에 의해 호출된 인자의 개수와 printf()에 제시된 실제 인자의 개수를 비교하는데 만약 실제 인자의 개수가 포맷 스트링 호출에 의한 인자의 개수보다 작다면 FormatGuard는 이를 공격으로 탐지하고 syslog에 공격 시도를 기록한 후 프로그램을 종료한다.
Control Flow Attack 피해 사례
코드레드 (2001년 07월 13일)
마이크로소프트 IIS 서버의 버퍼 오버플로우 취약점을 이용하여 미국 백악관 등 몇몇 IP로 DOS 공격을 하게 만들었음. 시스템 복구 비용 12억 9천만달러, 생산성 저하 비용, 7억 16백만 달러, 총 피해 비용 20억 달러.
님다 (2001년 09월)
미국, 유럽, 라틴 아메리카에서 동시에 발생하였고, 단 22분만에 인터넷에 가장 넓게 확산된 악성 바이러스로 막대한 경제적 손실을 발생시켰다. IIS 서버의 오버플로우 취약점을 이용하였음. E-mail을 통해서 무차별적으로 널리 전파되었음. 월드트레이드 센터, 펜타곤을 공격하는 코드가 삽입되었음. 6억 3천만달러에 이르는 피해비용
MSBlaster (2003년)
Microsft RPC의 오버플로우 취약점을 이용한 웜. MSBlaster에 감염된 경우에는 윈도우즈업데이트 사이트를 공격한다. 800만대에 이르는 PC를 공격하였음.
Sasser (2004년)
윈도우즈의 LSASS RPC의 오버플로우 취약점을 이용한 웜. 방화벽을 비활성화시키고, 윈도우즈 업데이트에서 다운로드 기능을 막아버리는 코드가 삽입되어 있음. 이 웜 때문에, 델타항공에서는 몇 시간 동안 비행기가 결항되었으며, 핀란드의 노르딕 보험은 130개의 이르는 지점이 몇 시간 동안 정상 업무를 하지 못하였음. 피해비용은 140억 달러에서 180억 달러에 이름.
Moriss (1988년)
세계 최초의 웜. Fingerd 서비스의 오버플로우 취약점을 이용하여 인터넷으로 확산됨. 전세계적으로 6000 대를 감염시켰다. (그 당시 6만대가 인터넷에 연결된 컴퓨터의 수). 천만달러에서 1억 달러에 이르는 피해비용.
Slapper (2002년)
아파치 웹 서버에 설치된 Open-SSL의 오버플로우 취약점을 이용하여 해당 서버의 시스템의 권한을 획득하고 다른 곳으로 전파를 함.
L10n (2001)
Bind DNS 서버의 버퍼 오버플로우 취약점을 이용한 웜. 해당 서버의 시스템 권한을 획득하고 다른 곳으로 전파를 함.
Ramen (2000)
ftp, lprng, rpc.statd의 버퍼 오버플로우 취약점일 용한 웜. 먼저 버퍼 오버플로우로 해당 시스템에 침입한 한 이후에 패치를 스스로 하고 추후 침입을 차단함. 그리고 루트킷을 설치하여 시스템 권한을 획득하고 크래커에게 메일을 보냄.
MSN 메신저 PNG 이미지 처리 오버플로우 취약점 (2005년 02월)
전세계적으로 가장 많이 사용되고 있는 메신저인 MSN 메신저에서 발생한 취약점으로서, 공개사진, 이모티콘을 PNG 이미지로 변경하게 될 경우에, 상대방의 동의없이 자동으로 표시되는데, MSN 메신저에서는 오버플로우를 일으켜, 악성 코드를 원격으로 실행하여, 상대방의 PC를 제어할 수 있는 취약점이 발견되었고, 하루만에 이를 이용하는 공격이 발견되어, 한국, 중국, 일본 등 아시아 지역에 많은 피해를 입혔음.
MSN_MSN_메신져_PNG_이미지_처리_오버플로우_취약점_분석.pdf
Adobe Flash Player 다중 취약점 보안업데이트 (2008년 04월)
"Declare Function (V7)" 태그를 처리하는 과정에서 특별하게 조작된 플래그에 의해힙 오버플로우가 발생하는 취약점
멀티미디어 파일을 처리하는 과정에서 정수형 오버플로우로 인한 버퍼 오버플로우가 발생하여 임의의 코드를 실행할 수 있는 취약점
크로스 도메인 정책 파일의 사용과 해석의 제한이 충분하지 않아서, 원격에서 크로스 도메인 또는 크로스 사이트 스크립트 공격이 가능한 취약점
flash_player_with_AVM2_vulnerability_analysis.pdf
http://www.boho.or.kr/dataroom/data_05_dtl.jsp?u_id=48&page=1&TempNum=7&page_id=6
1.25 인터넷 대란 (2003년 01월 25일)
SQL 서버의 버퍼 오버플로우 취약점을 이용하여 해당하는 SQL 서버 7만 5천여대를 감염시켰다. 감염된 PC들이 KT 혜화전화국에 있는 DNS 서버에 트래픽을 집중시키자, 전국적인 인터넷 트래픽이 다른 백본망으로 우회하기 시작했고, 다른 DNS 서버도 순차적으로 마비되어 전국적으로 약 24시간 정도 전국적으로 인터넷이 마비되었음. 피해액은 1675억.
1.25_인터넷대란.pdf
7.7 DDOS 공격 (2009년 07월 07일)
한국와 미국의 주요 정부기관 그리고 포털 사이트, 은행 사이트 등을 분산 서비스 거부 공격하여 일시적으로 마비시킨 사건. 대략 10만대에서 20만대에 이르는 좀비PC가 공격PC로 사용되었으며, 해당 사이트들은 24시간에서 72시간에 이르는 시간 또한 아무런 서비스를 제공하지 못하였음. 좀비PC들은 버퍼 오버플로우 취약점에 노출이 되었거나, 사회공학기법을 이용하여 악성 코드를 감염시킨 것으로 보임. 피해액은 363억 ~ 544억.
July_DDoS.pdf
Conficker Worm (2009년 01월)
전세계적으로 190만대를 감염시킨 Worm임. 취약한 암호를 공격하거나 USB 장치로 전파되거나, 공유 폴더를 이용하여 전파, 그리고 MS08-067 취약점을 이용하여 전파되었음. 이 취약점은 서버 서비스에서 RPC 요청을 제대로 처리하지 못하여 원격 코드를 실행가능하게 함으로서 원격지의 공격자가 해당 컴퓨터를 컨트롤할 수 있음.
최근악성코드동향.pdf
그외 참고 자료
History_of_Buffer_Overflow.pdf
2008_IBM_report.pdf
2008_Trend_Micro_Threat_Report.pdf
2009_IBM_report.pdf
History
Last edited on 02/11/2010 11:17 by selnip
Comments (0)