
CVE-2017-0037에 대한 기술적 분석: Microsoft 브라우저의 메모리 손상 취약점으로, CSS/JS 처리 과정에서 타입 혼동을 통해 원격 코드 실행이 가능하며, PoC 익스플로잇 상세 정보 및 완화 전략을 제공합니다.
CVE-2017-0037 (Microsoft 브라우저 메모리 손상 취약점)
이 문서는 CVE-2017-0037 - Microsoft 브라우저 메모리 손상 취약점에 관한 것입니다. 먼저 **원격 코드 실행(RCE)**이 무엇인지 소개한 후, 기술적인 세부 사항을 다룰 것입니다.
원격 코드 실행이란?
공격자가 다른 컴퓨터에서 원격으로 명령을 실행할 수 있는 사이버 공격을 원격 코드 실행이라고 합니다. 원격 코드 실행(RCE)은 대부분 호스트가 다운로드한 유해 소프트웨어로 인해 발생하며, 시스템의 위치와 관계없이 발생할 수 있습니다.
RCE를 달성하기 위해 다음과 같은 방법을 사용할 수 있습니다.
인젝션 공격: 여기서 공격자는 입력의 일부가 명령의 일부로 처리되도록 의도하여 잘못된 입력을 제공합니다.
역직렬화 공격: 역직렬화 프로그램은 직렬화된 데이터 내의 신중하게 구성된 사용자 입력을 실행 가능한 코드로 읽을 수 있습니다.
범위를 벗어난 쓰기: 메모리 할당이 제대로 이루어지지 않으면 공격자가 할당된 버퍼를 초과하는 입력을 구성할 수 있습니다. 실행 가능한 코드도 메모리에 저장되므로, 올바른 위치에 쓰여지면 프로그램이 사용자 제공 데이터를 실행할 수 있습니다.
타입 혼동 공격: 소스 코드가 전달된 엔터티의 진위 여부를 확인하기 위한 조치를 취하지 않을 때 타입 혼동의 위협이 존재합니다. 타입 혼동은 해커가 객체 유형의 불일치를 유발하여 임의의 명령을 실행할 수 있는 코드를 밀반입할 수 있게 하므로 위험합니다.
RCE 공격 실행
RCE 공격 시퀀스는 실행하기 간단합니다. 먼저, 위협 행위자는 효과적인 공격에 악용될 수 있는 일반적인 취약점을 인터넷에서 검색합니다. 특정 취약점을 식별한 후, 해커는 익스플로잇을 사용하여 액세스 권한을 얻습니다. 이제 액세스 권한을 얻었으므로, 악성 스크립트를 사용하여 데이터 유출, 자금 세탁, 종합적인 감시, 서비스 중단 등의 목표를 달성할 수 있습니다.
코드 인젝션은 일반적으로 대상 애플리케이션의 언어를 사용하여 수행됩니다. 그런 다음 서버 측 프로세서가 해당 언어를 실행합니다. Python, Java, Perl, Ruby, PHP가 일반적인 프로그래밍 언어입니다. 코드 인젝션은 검증되지 않은 입력을 즉시 분석하는 플랫폼에서 흔히 발생합니다. 실제로 공개 웹 애플리케이션은 해커의 주요 표적입니다.
악성 스크립트는 일반적으로 bash 스크립트로 실행됩니다. bash 스크립트는 일반적으로 명령 프롬프트에 입력되는 명령을 포함하는 텍스트 문서입니다. bash 스크립트는 포함된 명령이 올바르게 작동하도록 합니다. 일반적으로 ".sh" 확장자를 붙이지만 필수는 아닙니다. 패키징 후 해커는 코드를 취약한 애플리케이션에 넣고 실행합니다. 애플리케이션은 커널에 결정을 내려 실행하도록 할 수도 있습니다.
공격 메트릭
다음 이미지는 CVE-2017-0037의 기본 점수 메트릭에 초점을 맞춥니다.

여기서 CVSS 등급 점수는 **8.1(높음)**입니다.
공격 벡터 - 취약한 구성 요소는 네트워크 스택에 연결되어 있으며, 잠재적인 해커의 범위는 명시된 다른 대안부터 전체 인터넷까지 포함합니다.
이 취약점의 공격 복잡성은 높습니다. 즉, 공격의 성공은 공격자의 통제 범위를 벗어난 상황에 달려 있습니다. 따라서 공격은 마음대로 완료될 수 없으며, 공격자가 취약한 요소에 대해 계획 또는 구현에 상당한 수준의 노력을 기울여야 효과적일 것으로 예상됩니다.
기밀성 값은 높습니다. 이는 기밀성이 완전히 손실되어 공격자가 손상된 구성 요소 내의 모든 리소스에 액세스할 수 있음을 의미합니다.
무결성은 높습니다. 이는 무결성과 보호 기능이 심각하게 손실되었음을 의미합니다.
가용성은 높습니다. 이는 가용성이 완전히 손실되어 공격자가 영향을 받는 구성 요소의 리소스에 대한 액세스를 완전히 차단할 수 있음을 의미합니다.
공격 세부 사항
CVE-2017-0037 취약점은 Microsoft Edge 및 Internet Explorer 10, 11에 존재하는 타입 혼동 결함이었습니다. 사용자가 악성 웹사이트를 방문할 때 공격자가 대상 시스템에서 원격으로 코드를 실행할 수 있게 했습니다.
이 결함은 Google 연구원 Ivan Fratric이 지적했으며, Microsoft가 90일 공개 기간 내에 수정하지 못했기 때문에 Google이 취약점 세부 정보를 공개했습니다.

연구원이 게시한 개념 증명(PoC) 익스플로잇은 Edge와 IE를 충돌시켜 공격자가 원격으로 코드를 실행하고 손상된 시스템의 관리자 권한을 얻을 수 있음을 보여줍니다. 또한 Windows Server 2012 R2에서 64비트 버전의 Internet Explorer에서 공격이 작동했으며, 32비트 IE 11과 Microsoft Edge에도 영향을 미친다고 확인했습니다.
타입 혼동은 mshtml.dll의
Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement 함수에 있습니다. Cascading Style Sheets (CSS) 토큰 시퀀스와 TH 요소에서 작동하는 조작된 JavaScript 코드를 포함하는 벡터를 통해 원격으로 임의 코드를 실행하여 공격이 발생할 수 있습니다.
Google Project Zero의 Ivan Fratric의 PoC

연구원 Ivan Fratric이 밝힌 바와 같이, PoC는
MSHTML!Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement에서
주소 0000007800000070을 읽을 때 충돌이 발생합니다.


충돌 지점 주변의 코드를 분석해 보면, 메모리 주소 00007ffe`8f330a51에서 레지스터 rbp의 내용이 레지스터 rcx로 읽혀지는 것을 관찰할 수 있습니다. 그런 다음
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable 호출은 rax(함수에서 반환 값을 저장하도록 지정된 레지스터)에 값을 할당합니다.
rcx는 다른 객체 유형을 가리켜야 하지만, 위 PoC에서 보듯이 Array<Math::SLayoutMeasure>::Create에 할당된 32비트 정수 배열을 가리킵니다. 테이블 열의 오프셋이 해당 배열에 저장되며, 공격자가 이를 제어할 수 있습니다. 충돌은 00007ffe`8f330a59에서 발생하는데, rax가 초기화되지 않은 메모리를 가리키기 때문입니다. rax는 함수
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable의 반환 값을 저장하는데, 이는 초기화되지 않은 메모리 주소입니다. 공격자는 rax를 자신이 제어할 수 있는 일부 메모리 위치로 지정할 수 있습니다. 공격자는 테이블 속성(예: border-spacing 및 첫 번째 TH 요소의 너비)을 수정하여 rax를 제어할 수 있습니다.

공격자가 라인 00007ffe`8f330a59에서 rax를 제어할 수 있게 되면, 함수
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable이 동일한 인수로 라인 00007ffe`8f330a5d 743d에서 다시 호출되고 더 높은 주소로 점프합니다. 그 후, rax에서 시작하는 일련의 차이를 통해 함수 포인터를 얻어 rdi에 저장할 수 있습니다. 공격자가 해당 함수 포인터에 대한 CFG 검사를 통과하면, 공격자가 제어하는 함수 포인터가 라인 00007ffe`8f330a80에서 호출됩니다.
버그의 예상 패치
Ivan Fratric이 제안한 대로, 먼저 타입 혼동이 발생한 이유를 감지해야 합니다. 그의 가설에 따르면, DOM에는 HTML 테이블 열과 CSS 열의 두 가지 유형의 열이 존재하며, IE/Edge가 이 둘 사이에서 혼동을 일으켰습니다. 따라서 취약한 함수 어딘가에 유형 검사를 추가하면 문제가 해결될 수 있었을 것입니다.
유용한 링크
RCE 공격의 영향
초기 액세스: 공격자는 이를 사용하여 장치에 대한 통제권을 확보하고 악성 코드를 설치하거나 다른 목표를 달성할 수 있습니다.
정보 유출: RCE 공격은 정보 탈취 악성 코드를 설치하거나 영향을 받는 장치에서 데이터를 수집하고 도용하는 명령을 실행하는 데 도움이 됩니다.
서비스 거부: RCE 결함을 통해 해커는 영향을 받는 앱을 호스팅하는 시스템에서 코드를 실행할 수 있으며, 따라서 해당 앱과 시스템의 다른 프로그램의 작동을 방해할 수 있습니다.
암호화폐 채굴: 암호화폐 채굴 악성 코드는 취약한 장치에 자주 배포 및 실행됩니다.
랜섬웨어: 랜섬웨어는 사용자가 돈을 지불하지 않으면 파일에 액세스하지 못하도록 차단하는 소프트웨어 유형입니다.
RCE 공격 완화 방법
버퍼 오버플로 제어를 사용하여 RCE 공격을 완화할 수 있습니다.
액세스 제어 목록은 사용자 권한을 제한하고, 공격자가 사용자 계정을 장악할 경우 공격자의 능력을 제한하는 데 유용합니다.
엔드포인트 모니터링 외에도 네트워크 트래픽을 잠재적으로 악의적인 콘텐츠에 대해 모니터링해야 합니다.
입력 검증(Sanitization) 사용: 사용자의 입력을 정리하고 스크러빙하여 보안 결함을 악용하는 데 사용되지 않도록 보호하는 프로세스입니다.
참고 자료
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2017-0037
https://www.bugcrowd.com/glossary/remote-code-execution-rce/
https://bugs.chromium.org/p/project-zero/issues/detail?id=1011
https://blog.0patch.com/2017/03/0patching-another-0-day-internet.html
https://www.cs.uaf.edu/2017/fall/cs301/lecture/09_11_registers.html
https://reverseengineering.stackexchange.com/questions/10746/what-does-mov-qword-ptr-dsrax18-r8-mean