MSI Center에서 SYSTEM 권한 탈취가 가능한 취약점 발견
MSI 노트북과 사제 PC에 기본 설치된 'MSI Center' 소프트웨어에서 일반 사용자 계정으로도 시스템 최고 권한(SYSTEM)을 탈취할 수 있는 심각한 취약점이 발견되었습니다. 악의적인 사용자가 이 취약점을 악용하면 윈도우 디펜더를 비활성화하거나 시스템 설정을 마음대로 조작할 수 있어, 사전 설치된 소프트웨어(OEM)의 보안 취약성이 매우 위험함을 다시 한번 입증합니다.
MSI Center - 수 초 내에 SYSTEM 권한을 얻는 방법
AMD와 ASUS의 OEM 소프트웨어에서 심각한 취약점을 찾은 후, 저는 더 많은 게임 제품에서 문제를 찾아 시야를 넓히고 싶었습니다. 저는 결국 MSI Center를 선택했습니다. 이 소프트웨어는 그들의 모든 노트북과 조립 PC에 기본 설치되어 있는 것으로 보였기 때문에, 취약점을 찾을 경우 광범위한 영향을 미칠 가능성이 높았기 때문입니다.
다운로드 및 추출 이 과정의 첫 번째 단계는 항상 오프라인 설치 프로그램을 다운로드하는 것입니다. 이러한 회사들 중 상당수는 지원하지 않는 하드웨어에서 설치 프로그램이 실행되는 것을 차단하거나, 자사의 일부 소프트웨어만 설치할 수 있도록 허용합니다. 오프라인 설치 프로그램의 복사본을 구했으면, 이를 Detect-It-Easy에 통과시키고 기도해야 합니다. 운이 좋다면 MSI Center를 패키징하는 데 사용된 소프트웨어가 무엇인지 알려줄 것입니다. 우리의 경우 운이 좋았고, 이 프로그램이 'Inno Setup'이라는 것을 사용하여 패키징되어 있다는 것을 알 수 있었습니다. 이러한 상황에 특화된 'innoextract'라는 도구가 있습니다. 설치 프로그램과 그 안에 포함된 .appxbundle(그냥 .zip 파일임)의 압축을 푼 후, 실행 파일들을 디컴파일할 차례였습니다.
디컴파일(Decompilation) 총 170개의 실행 파일(DLL 포함)이 있었으며, 그중 대부분은 C#으로 작성되어 있었습니다. 이들을 위해 저는 ilspycmd를 사용하여 모두 디컴파일하는 배쉬 스크립트를 만들었습니다.
find . ( -name ".exe" -o -name ".dll" ) -exec file {} + | grep Mono | wc -l find . ( -name ".exe" -o -name ".dll" ) -exec file {} + | grep -v Mono | wc -l
C++로 작성된 나머지 파일들의 경우, 가장 흥미로운 상위 10개 파일 정도를 선택하여 IDA에 던져 넣은 다음, 완전히 디컴파일된 내용을 .c 파일로 내보냈습니다. 이 모든 작업을 마친 후, 저는 각 파일을 일일이 살펴보기에는 파일이 너무 많다는 결론에 도달했습니다. 대신 일반적인 취약점을 검색하고 뭔가를 찾을 수 있기를 바라야만 했습니다. 제가 검색한 단어 중 하나는 'CreateNamedPipe'였습니다. (명명된 파이프(named pipe)는 컴퓨터의 다른 프로세스가 서로 통신할 수 있게 해주는 방법입니다.)
취약점 MSI의 'Notebook Foundation' 서비스는 부팅 시 인증된 모든 사용자가 상호 작용할 수 있는 명명된 파이프를 생성합니다.
CreateNativePipeSecurity("D:(A;OICI;GRGW;;;AU)(A;OICI;GA;;;BA)"); CreateNamedPipe("\.\pipe\MSI_SERVICE_2", PIPE_ACCESS_DUPLEX);
이 파이프는 다음과 같이 트리거할 수 있는 명령들을 제공합니다:
- Handshake(핸드셰이크): 다음 명령들을 호출하거나 상호 작용하려면 애플리케이션을 "등록"해야 합니다. 임의의 클라이언트 이름만 제공하면 되며, 이 이름은 다른 명령을 호출할 때 인수로 사용됩니다.
- Registry(레지스트리): LocalSystem(최고 권한)으로 모든 레지스트리 키를 읽고, 쓰고, 삭제할 수 있습니다.
- WMI(Windows Management Instrumentation): 시스템 하드웨어를 모니터링하고 시스템 설정(예: Windows Defender 설정 및 제외 항목)을 변경할 수 있습니다.
- PC REXE: LocalSystem으로 모든 인수를 사용하여 모든 실행 파일을 실행합니다.
- KEXE: 시스템의 모든 실행 파일을 강제 종료합니다 (이것 역시 LocalSystem으로 실행됩니다).
짐작할 수 있듯이, 이러한 기능들은 모든 인증된 사용자(로컬 관리자 권한이 없는 사용자 포함)에게 노출되기에는 믿을 수 없을 정도로 위험한 도구들입니다. 이들은 맬웨어에 의해 악용되어 Windows Defender를 비활성화하거나 시스템 수준의 권한을 얻는 데 사용될 수 있습니다.
개념 증명(PoC, Proof of Concept) 과거에 MSI는 주로 '보안 대비 은폐(security by obscurity, 소스 코드나 알고리즘을 숨기는 방식)'에 의존하여 악용을 방지했습니다. 그들은 파이프와 통신하기 위한 사용자 정의 프로토콜을 만들었고, 모든 메시지가 3DES(오늘날 기준으로는 오래되고 안전하지 않은 암호)를 사용하여 암호화되도록 요구했습니다.
- MSI_SERVICE_2 명명된 파이프에 대한 연결을 엽니다.
- 임의의 문자열(예: ABCD123)을 사용하여 애플리케이션을 등록합니다.
- 3DES를 사용하여 PC:REXE 명령을 암호화하고 클라이언트 이름을 키로 사용합니다.
- Notebook Foundation 서비스는 제대로 작동하는 이름을 찾을 때까지 등록된 모든 클라이언트 이름을 시도하며 복호화를 무차별 대입(brute-force)하려고 시도합니다.
- 복호화가 성공하면, 해당 명령을 실행합니다.