2013년 11월 26일 화요일

'Chunked Encoding' 취약점을 이용한 아파치 웜 이해하기

자료출처: 안철수연구소  

'Chunked Encoding' 취약점을 이용한 아파치 웜(FreeBSD/Scalper.worm.51626)이 2002년 6월 28일 최초 보고되었다.

이 웜은 현재까지 FreeBSD 운영체제 시스템에 한정되어 공격하므로 고객의 큰 피해는 보고되고 있지 않지만, 웜의 소스코드가 공개되어 있기 때문에 다른 운영체제 시스템까지 감염시킬 수 있는 변형이 제작될 가능성이 있다.

1. 개요

아파치 웹 서버는 전세계적으로 가장 많이 이용되고 있는 웹 서버중의 하나로, 전체 웹 서버 시장의 약 60%에 상회하는 마켓쉐어를 형성하고 있다.

이번에 보고된 취약점은 HTTP 1.1 프로토콜의 기능인 'Chunked Encoding'을 이용하여 잘못된 요청을 처리하는 경우에 발생한다. 이 취약점은 아파치의 거의 모든 버전에 해당되며, 이 취약점을 이용한 웹 문서의 수정, 임의의 코드 실행 및 서비스거부(Denial Of Service)가 가능하다.

이 웜(FreeBSD/Scalper.worm.51626)은 FreeBSD 운영체제 시스템에 한하여 공격하므로 크게 확산되고 있지는 않다. 그러나 국내에서도 웹 서버로 아파치를 많이 사용하고 있으며, 웜의 소스코드가 공개되어 있어 얼마든지 변형이 가능하므로 여러 운영체제에서 감염되는 변형이 출몰할 가능성이 높다.

따라서 이 취약점을 이용한 웜의 공격을 예방하기 위해서는 아파치 그룹에서 배포하는 최신 버전으로 업그레이드를 하거나 패치를 적용해야 한다.

2. 내용

'Chunked Encoding'은 HTTP 프로토콜의 한 부분으로 웹 상에서 데이터를 받아 들이는 기능 등에 사용되는데, 이 'Chunked Encoding'의 사이즈를 계산하는 메카니즘에 취약점이 존재한다.

데이타가 서버로 전송될 때, 웹 서버는 데이타를 받아들일 사이즈만큼 메모리 버퍼를 할당하는 작업이 이루어지는데, 이 과정에서 사이즈를 모를 경우 클라이언트의 웹 브라우저와 통신하여 'Chunk' 데이타의 사이즈를 결정한다. 이때 입력되는 데이타 'Chunk'를 잘못 처리하게 되는 경우 'heap overflow'나 임의의 코드 실행 등이 가능해지는 것이다.

이번에 공개된 웜은 이 취약점을 이용하여 공격하며, 지정된 IP 대역에서 취약점을 가지고 있는 웹 서버를 찾아 감염시켜 확산시킨다.

예를 들어, IP 주소가 A.B.C.D 와 같다고 가정하자. 이때 A 는 테이블에서 고정된 것이 되며, B는 랜덤하게 선택되며, C와 D는 순차적으로 증가한다. C와 D의 값이 '0.0' 으로 시작하여 '255.255' 까지 도달하게 되면, 웜은 A 의 새로운 주소를 찾아 공격하는 것이다.

웜의 특성을 살펴보면, 우선 웹 서버의 포트인 80 번에 접속하게 되어 'GET / HTTP' 요청을 하여 아파치 서버를 찾는다. 그 후 'Chunked Encoding' 취약점을 이용한 버퍼 오버플로우를 일으켜 원격에서 쉘 명령어의 실행을 시도한다.

이 웜은 자기 자신을 UUEncode 하여 원격지 컴퓨터에 '/tmp/.uua' 로 전송한 후, 이것을 다시 UUDecode 하여 /tmp/.a 를 실행한다. 실행되는 명령어를 살펴보면 다음과 같다 :

/usr/bin/uudecode -p /tmp/.uua > /tmp/.a;killall -9 .a;chmod +x /tmp/.a;killall -9 .a;/tmp/.a LOCAL_ADDRESS

웜이 감염되면 UDP 포트 2001 번을 오픈하며, 이를 이용하여 공격에 성공한 컴퓨터에서 이메일 주소 수집, 메일 발송, TCP/UDP Flooding 또는 다른 서비스거부 기능 등을 수행하게 된다.



3. 취약점 예방법

이 웜의 영향을 받는 해당 시스템은 다음과 같다.

     - 아파치 1.2.2 이상의 버전
     - 아파치 1.3.24 를 포함한 이하의 모든 버전
     - 아파치 2.0.36 을 포함한 이하의 모든 버전

아파치를 사용하고 있는 사용자는 아파치그룹(www.apache.org)에서 배포하는 최신 버전으로 업그레이드 해야 한다. 만약 최신 버전으로의 업그레이드가 불가능할 경우에는 패치를 적용해야 한다. 적용방법은 아래의 내용 중에 해당하는 것을 선택하여 진행한다.

3-1. 아파치 최신 버전으로 업그레이드

1) 아래의 링크 중에서 업그레이드 하고자 하는 아파치 서버 버전의 파일을 다운로드한다.

http://www.apache.org/dist/httpd/ apache_1.3.26.tar.gz [유닉스용 아파치 1.3.X 사용자]
http://www.apache.org/dist/httpd/httpd-2.0.39.tar.gz [유닉스용 아파치 2.0.X 사용자]
http://www.apache.org/dist/httpd/binaries/win32/ apache_1.3.26-win32-x86-no_src.exe [윈도우용 아파치 1.3.X 사용자]
http://www.apache.org/dist/httpd/binaries/win32/apache_2.0.39-win32-x86-no_ssl.exe [윈도우용 아파치 2.0.X 사용자]

2) 1)에서 다운로드 받은 파일의 압축을 해제한다.
예를 들어, 다운로드 받은 파일이 apache_1.3.26.tar.gz 인 경우에는 아래와 같이 해제한다. 이때, 파일의 이름은 다운로드 받은 파일의 이름을 적는다.

     $ gzip -d apache_1.3.26.tar.gz
     $ tar -xvf apache_1.3.26.tar

3) 업그레이드 버전의 아파치 서버를 설치한다.
아파치 웹 서버의 일반적인 설치방법은 다음과 같이 몇 단계의 과정으로 나뉘어 진다. 그러나 설치 방법은 설치하고자 하는 방법이나 시스템에 따라 다를 수 있으므로, 각자의 시스템 환경에 따라 설치한다.

     $ ./configure --prefix=PREFIX
     $ make
     $ make install
     $ PREFIX/bin/apachectl start

여기서 'PREFIX' 는 아파치가 설치되어질 경로를 말하는 것이므로, 설치할 경로에 따라 변경하여 입력한다.

아파치 설치나 기타 자세한 정보는'http://httpd.apache.org' 의 문서를 참고하기를 바란다.

3-2. 아파치 패치

최신버전의 업그레이드가 어려울 경우, 기존의 아파치 소스파일에서 'main/http_protocol.c' 의 특정부분을 패치한다.

1) 아래의 주소에서 제공되는 패치파일의 내용 중에서 패치파일에 해당하는 부분을 저장한다.

http://www.apache.org/dist/httpd/patches/ apply_to_1.3.22/SECURITY_chunk_size_patch.txt

1.3.23에서 1.3.25 버전까지는, 제공되는 패치파일을 통하여 패치하는데 문제가 있으므로 최신버전으로 업그레이드 하기를 권장한다.

2) 패치된 내용을 'chunk_patched.diff' 로 저장하여 아파치 소스가 있는 상위디렉토리에 위치한다. 예를들어, /home/apache_1.3.22 에 아파치 소스가 존재한다면, 'chunk_patched.diff' 를 /home/apache_1.3.22 에 저장한 후, 'patch -p1 < chunk_patched.diff' 명령어를 사용하여 패치를 적용한다.

* 3-2 의 패치방법 보다는 아파치의 가장 최신버전으로 업그레이드하여 사용하는 방법을 권장한다.

4. 참고자료

Apache Sofware Foundation: http://httpd.apache.org/info/ security_bulletin_20020620.txt
CERT: http://www.cert.org/advisories/CA-2002-17.html
FreeBSD/Scalper.worm. 51626 : http://home.ahnlab.com/smart2u/ virus_detail_999.html

댓글 없음:

댓글 쓰기