KOROMOON

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

12/07/2021

[CVE-2021-40438] Apache HTTP Server mod_proxy SSRF Vulnerability


( 1 ) 취약점 설명


CVE-2021-40438 취약점은 아파치 HTTP 서버 2.4.48 이전 버전의 mod_proxy 와 관련이 있으며 원격에 인증되지 않은 공격자가 취약한 아파치 HTTP 서버에 악의적인 요청을 보낼 시 임의의 서버에 강제적으로 전달하도록 하여 사용할 수 없는 리소스를 얻거나 조작할 수 있는 취약점임


CVSS 9.0 으로 심각한 취약점으로 12월 1일자로 미국 CISA 기관에서 제공하는 알려진 악용 취약점 카탈로그 페이지에 기재됨.

특정 취약점이 주요하게 악용될 경우 미국 공인된 기관에서 공지하는 페이지로 민감하게 보안 대응이 필요함.

< 알려진 악용 취약점 카탈로그 페이지에 공지된 CVE-2021-40438 취약점 >




( 2 ) 취약점 분석


버그 수정 커밋 링크는 아래와 같음.

링크 : 

https://github.com/apache/httpd/commit/520dcd80a45ce237e9a46ee28697e1b8af3fcd7e


< 버그 수정 커밋 >


취약한 2.4.48 버전과 패치된 2.4.49 버전의 modules/proxy/proxy_util.c->fix_uds_filename 기능을 비교함.


먼저 패치된 버전에 관련된 두 가지 함수를 보면 ap_strcasestr 함수는 s1 에서 s2 문자열을 검색하고 s2 에서 시작하는 포인터를 반환함.

그리고 ap_cstr_casecmp 함수는 입력 길이에 따라 문자열을 비교하고 s2 와 s1 이 같으면 0을 반환함.


http://target:port/proxytest 형식으로 예를 들 경우 mod_proxy 를 처리할 때 r->filename=proxy:http://127.0.0.1:8080/proxytest 를 사용함.


취약한 2.4.48 버전 : ap_strcasestr 함수를 사용하여 URL  에 unix: 를 입력하면 ptr2가 unix 의 시작 위치 포인터를 가리킴.

패치된 2.4.49 버전 : ap_cstr_casecmp (r->filename+6,"unix:",5) 함수를 사용하여 찾음. r->filename+6 시작 문자열은 unix: 여야 하고 그 다음에는 ptr+2 여야 함.

unix 뒤의 문자열 위치를 가리킴.


버그 수정 커밋 정보에 따르면 r->filename 이 [proxy:] unix:path|url 형식을 만족하는 경우 취약한 2.4.48 버전에서는 해당 URL 을 UDS(Unix Domain Socket) 으로 취급함.

실제 r->filename 형식은 UDS의 경우 "[proxy:]unix:path|url" 이며 문자열의 시작 부분에 있으므로 strstr(,"unix:") 이 필요하지 않음.




다음으로 UDS 요청 경로는 ap_runtime_dir_relative 처리 결과인 /opt/httpd-2.4.48/log/proxytest 로 설정됨.


error_log 로그에 "has defined UDS as 문자열을 검색하고 UDS 생성 위치를 "ap_proxy_determine_connection" 으로 찾음.

정상적인 요청에서는 uds_path 가 비어 있지 않고 UDS 판단이 수행됨.


그러나 값이 비어 있으면 else 분기가 수행되고 포워딩 프로세스는 계속 수행될 수 있음.




다음은 uds_path = (*worker->s->uds_path ? worker->s->uds_path : apr_table_get (r->notes,"uds_path")); 문에 중점을 둠.

apr_table_get 함수의 정의이지만 의미상 단순히 r->notes 에서 값을 검색해야 함.

그러나 fix_uds_finename 에 uds_path 가 설정되는 경우가 있는데 socketpath 가 비어 있을 때 apr_table_setn 으로 설정된 uds_path 도 비어 있고 apt_table_get 값도 비어 있어야 함.


ap_runtime_dir_relative(호출에 의해 sockpath 생성)에 이어 함수는 내부적으로 apr_filepath_merge 를 호출하여 경로를 생성함.




다음으로 apr_filepath_merge 로 후속조치를 취함.

filepath.c 에 apr_filepath_merge 관련 코드가 있으며 아래 링크를 참조 바람.

링크 : https://github.com/apache/apr/blob/e01c226ea72119b63e392837c303d472c90f9a5f/file_io/unix/filepath.c#L81


문제의 원인은 길이 연산 APR_PATH_MAX 를 입력할 때 직접 오류를 반환하고 ap_proxy_determine_connection 에서 오류 검사를 우회하기 때문임.

APR_PATH_MAX 길이가 8192일 수 있지만 실제로는 더 작을 수 있음.

(참고로 PoC 에 사용된 A 문자열 갯수는 7701 개임)


CVE-2021-40438 취약점의 핵심 원리는 mod_proxy 모듈이 UDS(Unix Domain Socket) 포워딩을 지원하기 위해 보안상의 문제가 있으며 아래와 같이 취약점 발생 전체 조건이 필요함.


1. mod_proxy 구성을 열어야 함.

2. VirtualHost 의 ProxyPass 가 지정한 URL 항목을 알아야 함.

3. GET 방식을 사용하여 매우 긴 문자열을 요청하여 대상 Apache 설정을 초과함.




( 3 ) 취약점 방어


현재 공개된 PoC 는 아래와 같음.

< PoC 코드 >

< PoC 테스트 화면 >


취약점을 방어할려면 최신 버전으로 패치해야 함.

현재 아파치 HTTP 서버의 최신 버전은 2.4.51 버전임.

홈페이지 : https://httpd.apache.org/


추가적으로 보안 장비에 Snort 패턴을 입력하여 모니터링도 필요함.

alert tcp any any -> any any (msg:"KOROMOON_Apache HTTP Server SSRF_Detected"; flow:established,from_client; urilen:>200; content:"GET"; http_method; content:"/?unix|3a|"; http_uri; nocase; fast_pattern; content:"|7c|http"; http_uri;)




참고 사이트 : 

https://httpd.apache.org/security/vulnerabilities_24.html#2.4.49

https://github.com/apache/httpd/commit/520dcd80a45ce237e9a46ee28697e1b8af3fcd7e

https://svn.apache.org/viewvc?view=revision&revision=1892814

https://github.com/apache/httpd/blob/e8228ba4e6f22f2445fdce4f916c622ea41b025b/modules/proxy/proxy_util.c#L2590

https://github.com/apache/apr/blob/e01c226ea72119b63e392837c303d472c90f9a5f/file_io/unix/filepath.c#L81

https://github.com/apache/httpd/blob/e8228ba4e6f22f2445fdce4f916c622ea41b025b/server/config.c

https://httpd.apache.org/docs/2.4/mod/mod_proxy.html

https://nvd.nist.gov/vuln/detail/CVE-2021-40438

https://firzen.de/building-a-poc-for-cve-2021-40438

https://www.wangan.com/p/7fygfy122c313bee

https://cydrill.com/owasp/apache-ssrf-an-all-you-can-eat-reverse-proxy/

https://www.rapid7.com/blog/post/2021/11/30/active-exploitation-of-apache-http-server-cve-2021-40438/

https://securityaffairs.co/wordpress/125107/hacking/cve-2021-40438-apache-http-server-attacks.html

https://github.com/CHYbeta/OddProxyDemo/tree/master/mod_proxy/demo2




============================================================

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


댓글 없음:

댓글 쓰기