KOROMOON

착한 사마리아인이 되고 싶습니다.

3/31/2020

[CVE-2014-0050] Apache Commons FileUpload & Apache Tomcat DoS


( 1 ) 취약점 정보

Apache Tomcat 파일 업로드 모듈인 FildUpload 의 MultipartStream 클래스 코드 취약점으로 특정 조건으로 인한 무한 루프가 발생하여 서비스 거부 공격이 가능함.
HTTP 헤더의 Content-Type 필드에 값을 변조할 경우 MultipartStream 클래스 코드의 무한 루프가 발생하여 서버측에서 DoS 가 발생됨.



( 2 ) Content-Type 필드

Content-Type 이란 말 그대로 사용자 요청과 응답 메시지 타입을 뜻하며 크게 Discete-Type 과Composite-Type 으로 나뉨.

문법은 다음과 같은 형태로 가짐.
형식
Content-Type : text/plain;         charset=us-ascii
설명
[필드명]     : [타입]/[서브타입] ; [파라미터]

Discrete-Type : 그 자체로 어떤 의미를 가지고 있는 Content-Type 를 나타냄.
ex. "text" / "image" / "audio" / "video" / "application"

Composite-Type : Discrete-Type 혹은 Composite-Type 의 개체 여러 개가 복합되어 만들어진 타입을 나타냄.
ex. "message" / "multipart"

MIME Type 참고 사이트 : http://www.iana.org/assignments/media-types/index.html



( 3 ) 취약한 MultipartStream 클래스 코드

MultipartStream 클래스 위치는 아래와 같으며 Java Decompiler 툴(JD-GUI)로 이용하여MultipartStream 클래스 코드를 확인할 수 있음.
위치 : tomcat 폴더 -> lib 폴더 -> tomcat-coyote.jar 파일 -> org.apache -> tomcat -> util -> http -> fileupload -> util -> MultipartStream 클래스
JD-GUI 툴 다운로드 : http://jd.benow.ca/

< 취약한 MultipartStream 클래스 일부 코드(Apache Tomcat 7.0.42 버전에서 발췌) >


< 패치된 MultipartStream 클래스 일부 코드(Apache Tomcat 7.0.53 버전에서 발췌) >


< for문 코드 - 특정 상황에 대한 검사 코드(취약한 코드와 패치된 코드에서 공동으로 존재) >

첫 번째 그림은 취약한 MultipartStream 클래스 일부 코드이고 두 번째 그림은 패치된MultipartStream 클래스 일부 코드이며 세 번째 그림의 for문 코드는 특정 상황에 대한 검사 코드(취약한 코드와 패치된 코드에서 공동으로 존재)임.

Content-Type 필드의 boundary 파라미터는 전달할 인자들을 구분하기 위한 경계값으로 위 취약한 코드에서는 boundary 파라미터의 길이에 대한 검사가 이루어지지 않아 for 문 코드에서 if 문 중 하나라도 선택되지 않아 무한 루프가 발생됨.
정확히 말하면 boundary 파라미터의 길이가 4091 바이트보다 크고 HTTP Body 헤더가 4096 바이트보다 클 경우 if 문 중 하나라도 선택되지 않아 무한 루프가 발생됨.

boundary 파라미터 최대값은 4091 임.
boundary.length > bufSize - 1 - BOUNDARY_PREFIX.length = 4096 - 1 - 4 = 4091

위 패치된 코드에서 boundary 파라미터의 길이에 대한 검사 조건(버퍼 사이즈보다 클 경우 예외처리)가 추가됨.



( 4 ) 공격 시연

< POC 테스트 전 >

< POC 테스트 후 >

< POC 패킷 덤프 >

< POC 테스트 후 Apache 웹서버 CPU 상태 >

< POC 테스트 후 Apache 웹서버 네트워킹 상태 >

< POC 테스트 후 웹페이지 상태 >

boundary 파라미터 값에 4091 바이트 이상 값을 넣어 공격 시도함.
참고로 위 POC 옵션 중에 -n 은 Request 수 옵션으로 디폴트로는 효과가 없으며 좀더 큰 값을 넣어 공격 시도해야 효과가 있음.
POC 다운로드 : http://www.exploit-db.com/exploits/31615/

공격당한 Apache 웹서버는 CPU 가 최대 상승 후 비교적 큰 일정한 CPU 를 유지되는 것으로 확인되며 웹서버가 제 기능을 발휘되지 않아 행이 걸리는 것으로 조사됨.



( 5 ) 해결책

FileUpload 1.3.0 이하 버전은 1.3.1 버전으로 업그레이드
Apache Tomcat 7.0-7.0.50 버전은 7.0.51 버전으로 업그레이드
Apache Tomcat 8.0-8.0.1 버번은 8.0.2 버전으로 업그레이드



참고 사이트 :
http://tools.ietf.org/html/rfc2388
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0050
http://svn.apache.org/viewvc?view=revision&revision=1565169
http://svn.apache.org/viewvc/commons/proper/fileupload/trunk/src/main/java/org/apache/commons/fileupload/MultipartStream.java?r1=1564788&r2=1565143&diff_format=h
http://www.ehackingnews.com/2014/02/cve-2014-0050-apache-tomcat-vulnerable.html
http://blog.spiderlabs.com/2014/02/cve-2014-0050-exploit-with-boundaries-loops-without-boundaries.html
http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.42/bin/



============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.

댓글 없음:

댓글 쓰기