정보 · 테크
IIS 웹 서버 원격 코드 실행 취약점 발견

2021년 5월 MS 정기 보안 업데이트에서 Windows에서 사용되는 웹 서버인 IIS 취약점이 패치되었습니다. 이 취약점은 CVE-2021-31166으로 명명되었습니다. 취약점을 분석한 ZDI에 따르면, 공격자는 대상 IIS 서버로 악의적인 요청을 보내 대상 서버에 BSOD(Blue Screen Of Death)를 발생시키거나 최악의 경우 커널 권한에서 임의 코드를 실행할 수 있다고 합니다.

또한 IIS 서버 취약점에 대한 파급력을 감안하여 CVSS는 10.0점 만점 중, 9.8점을 받았습니다. 그리고 패치와 동시에 취약점을 악용(BSOD 발생)할 수 있는 PoC 코드가 공개되어 IIS 서버를 사용하는 사용자는 최신 보안 업데이트 적용을 우선적으로 고려해야 합니다.

IIS 소개

IIS는 Internet Information Service의 약자로 Microsoft Windows 계열에서 사용할 수 있는 웹 서버입니다. IIS 서버는 Windows 계열에서 기본적으로 비활성화 되어 있어 사용자가 직접 사용하도록 설정해야 합니다. 다음은 Windows 10에서 IIS 서버를 설정하는 방법입니다.

  • 시작 -> 실행 -> cmd.exe 입력 후, 명령 프롬프트에서 appwiz.cpl 입력.
    b6b2d41b-b180-4890-b25d-98c8f037ca8a.png

위와 같이 [World Wide Web 서비스] 항목에 체크하면 IIS 서버를 사용할 수 있습니다.


취약점 분석

IIS는 HTTP request를 http.sys 드라이버 파일에서 처리합니다. 즉, 커널 레벨에서 HTTP request을 검사 및 파싱하고 이에 대한 response을 생성합니다. 따라서, http.sys에서 예상하지 못한 invalid HTTP request 처리 중 memory corruption이 발생하면 커널 레벨에서 크래시가 발생하거나 커널 레벨의 코드 실행 권한을 허용하게 됩니다.

HTTP Request 중, CVE-2021-31166과 관련된 Header는 Accept-Encoding입니다. 이 Header는 HTTP 통신 시, 사용하고자 하는 웹 서버 압축 알고리즘을 서버에 전달합니다. 그리고 이 Accept-Encoding Header가 포함된 Request를 받은 웹 서버는 전달 받은 Encoding 목록 중 적절한 압축 알고리즘을 선택 후 Response Header에 Content-Encoding 를 사용하여 선택된 알고리즘 종류를 반환합니다.

다음은 HTTP Request를 전송할 때 사용되는 Accept-Encoding Header 예입니다.

Accept-Encoding: compress, gzip
Accept-Encoding:
Accept-Encoding: *
Accept-Encoding: compress;q=0.5, gzip;q=1.0
Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0

(출처 : https://datatracker.ietf.org/doc/html/rfc7231#section-5.3.4)

위 예에서 "gzip;q=1.0, identity; q=0.5, *;q=0"Field-Value에 해당합니다. http.sysHTTP!UlAcceptEncodingHeaderHandler, HTTP!UlpParseAcceptEncoding, HTTP!UlpParseContentCoding 함수를 사용해 Accept-Encoding Header를 분석합니다.

HTTP request에 Accept-Encoding Header가 존재하면 HTTP!UlAcceptEncodingHeaderHandler가 호출되고 이 함수안에서 HTTP!UlpParseAcceptEncoding이 호출됩니다. 그리고 HTTP!UlpParseContentCoding를 이용해 Field-Value를 분석합니다.

HTTP!UlpParseContentCoding는 요청 받은 Field-Value가 IIS에서 지원 가능한 올바른 content-coding인지, invalid content-coding 문자열인지를 나타냅니다. 이 때, HTTP!UlpParseAcceptEncoding 함수는 invalid content-coding 문자열 목록을 circle doubly linked list 구조체를 사용해 Stack에 보유합니다. 취약점은 이 구조체에 대한 설계 결함으로 인해 발생됩니다.

공격자는 다음과 같이 Accept-Encoding Header를 조작하여 취약점을 유발할 수 있습니다.

#...
'Accept-Encoding': 'doar-e, ftw, imo, ,'
#...

(출처 : https://github.com/0vercl0k/CVE-2021-31166/blob/main/cve-2021-31166.py)

위 PoC 코드 중 취약점을 발생시키는 부분은 content-coding 문자열 가장 뒷 부분의 ,(쉼표)입니다. 위 Header가 HTTP request에 포함되면 content-coding 문자열을 분석하는 HTTP!UlpParseContentCoding에서 오류 코드 0x0c0000225가 반환됩니다. 이 오류 코드가 반환되면 HTTP!UlpParseAcceptEncoding의 circle doubly linked list 구조체 필드가 잘못 설정되어 Use After Free가 발생하게 됩니다.

다음은 공개되어 있는 PoC 코드를 취약한 IIS 서버에 수행한 결과입니다.

07510837-69a3-434c-825c-b28bc1220f89.gif
(출처 : https://github.com/0vercl0k/CVE-2021-31166/raw/main/pics/trigger.gif)


결론

MS Windows OS를 대상으로 하는 0-Click 취약점에 대한 연구는 진행되고 있습니다. 0-Click 취약점의 경우, 1-Click 취약점보다 공격벡터가 적음에도 불구하고 매년 취약점이 발견되고 있습니다. 0-Click 취약점에 대한 성공적인 exploit이 가능할 경우, CVE-2021-31166과 같이 IP 주소만 필요로 하는 취약점의 경우, 불특정 다수의 PC를 감염시킬 수 있어 공격으로 인한 피해가 더 클 수 있습니다.

저희 티오리에서는 1-day 분석 서비스인 Fermium-252를 통해 최신 0-Click 취약점에 대한 분석 내용을 공유하고 있습니다. 이를 통해 공격자가 이용한 공격 벡터와 어떠한 실수로 인해 취약점이 발생했는지에 대한 상세한 정보를 공유하고 있습니다.

출처

#0-click #cve-2021-31166 #iis #httpsys #poc
작성자 정보