Turning the Valve - Exploiting RCE and LPE in the Steam Platform
Valve의 문을 열다: Steam 플랫폼의 원격 코드 실행과 권한 상승 취약점
Steam의 Windows 서비스와 IPC 구조를 분석해 로컬 권한 상승 취약점 4건과 원격 코드 실행 취약점 2건을 찾아낸 연구입니다. 원격 취약점은 Steam 계정에 연결된 다른 클라이언트가 보낸 메시지의 스택 버퍼 오버플로와 정보 유출을 결합해 RCE로 이어집니다.
- 주제
에디터 노트
원격 코드 실행의 설득력은 스택 오버플로 두 건만이 아니라, 초기화하지 않은 메모리 유출로 ASLR을 우회하는 과정까지 연결해 보인 데 있습니다. 다만 공격 경로는 임의의 인터넷 사용자가 Steam 이용자에게 메시지를 보내는 형태가 아니라, 같은 계정으로 인증된 클라이언트 간 연결을 전제로 합니다. 로컬 권한 상승 사례도 각각 조건이 다릅니다. VDF 허용 목록과 사용자 쓰기 가능 경로의 결합, 보안 데스크톱 입력 공유 메모리의 접근 권한, 드라이버 파일 검증과 실행 사이의 시간차가 원인입니다. Valve에 제보됐고 패치됐거나 공개 시한이 지났다는 설명은 있지만, 글에는 수정 버전이나 각 취약점의 현재 배포 상태가 제시되지 않습니다. Reddit 댓글은 연구 보상에 대한 기대를 말할 뿐, 기술적 주장이나 패치 상태를 검증하지는 않습니다.
AI 요약
Steam의 Windows 클라이언트와 SYSTEM 권한 서비스 사이에 놓인 IPC, 그리고 로그인한 계정의 여러 클라이언트가 주고받는 메시지를 분석한 보안 연구입니다. 연구진은 로컬 권한 상승 취약점 4건과 원격 코드 실행 취약점 2건을 발견했으며, 일부 권한 상승 건은 중복 제보이거나 다른 연구자가 먼저 공개했습니다. 취약점은 Valve에 HackerOne으로 제보됐고, 글에서는 패치됐거나 공개 시한이 지났다고 설명합니다. PoC와 발표 자료도 공개했습니다.
서비스 IPC 구조
Steam은 일반 권한의 steam.exe와 SYSTEM 권한의 steamservice.exe를 이름 있는 파이프(named pipe)로 연결합니다. 서비스는 공유 메모리와 이벤트 객체를 만들어 클라이언트 연결을 중개한 뒤 파이프 핸들을 전달합니다. 공유 메모리의 DACL 때문에 무결성 수준(Integrity Level)이 다른 프로세스도 연결을 요청할 수 있습니다. 연구진은 steamclient64.dll의 전역 객체와 vtable을 이용해 Steam이 제공하는 연결 절차를 재사용하고, IPC로 노출된 여섯 인터페이스의 약 90개 핸들러를 조사했습니다.
로컬 권한 상승
첫 번째 취약점은 게임 설치에 쓰이는 Valve Data File(VDF) 처리에서 나옵니다. SteamService는 서명된 VDF의 실행 파일 경로를 메모리 내 허용 목록에 넣지만, 허용 목록에 추가한 뒤 대상 파일을 다시 검증하지 않습니다. 공격자는 사용자가 쓸 수 있는 경로를 설치 디렉터리로 지정해 서명된 VDF로 해당 경로를 허용 목록에 추가한 다음, 같은 경로에 실행 파일을 심고 별도의 VDF를 실행하도록 요청합니다. 서비스가 SYSTEM 권한으로 그 파일을 실행합니다.
두 번째는 IClientModuleManager의 CallFunctionAsync입니다. LoadModule로 DLL 데이터를 등록하고 CallFunctionAsync에 특정 플래그를 설정하면 RSA 서명 검사를 우회하는 경로를 탑니다. 자식 프로세스 실행 경로는 Steam 설치 디렉터리의 legacycompat 폴더에서 steamservice.exe를 실행하는데, 연구진은 이 경로를 이용해 임의 실행 파일을 SYSTEM 권한으로 구동했습니다.
세 번째 취약점은 Remote Play 등의 보안 데스크톱 입력 처리입니다. SYSTEM 권한으로 실행되는 secure_desktop_capture.exe는 프레임 버퍼와 입력용 공유 메모리를 만듭니다. 해당 메모리에는 Steam을 실행한 사용자의 SID에도 전체 접근 권한이 부여되며, 입력 데이터의 플래그를 평문 모드로 설정하면 RSA 암호화를 건너뜁니다. InputEnabled 레지스트리 값이 켜져 있고 승인 시점부터 90일 안이라면, 일반 권한 사용자가 UAC 보안 데스크톱에 키보드와 마우스 입력을 보낼 수 있습니다. 연구진은 관리자 권한 실행 파일을 띄운 뒤 UAC 확인 키를 입력하는 방식으로 권한 상승을 시연했습니다.
마지막 권한 상승 취약점은 Steam Frame용 무선 동글 드라이버 설치 함수에 있습니다. 함수는 카탈로그 서명과 파일 해시를 확인하지만, 검증한 드라이버 정보 파일이 기대한 드라이버인지 확인하지 않습니다. 검증이 끝난 뒤 pnputil을 실행하기까지 파일 핸들을 놓으므로, 그 사이 파일을 바꾸는 TOCTOU 공격도 가능합니다. pnputil은 winlogon 프로세스의 토큰을 사용해 드라이버를 설치합니다.
원격 코드 실행
Steam에 같은 계정으로 로그인한 클라이언트들은 별도 페어링 없이 Valve의 Connection Manager를 통해 서로 상태 메시지를 주고받습니다. 연구진은 활성 Steam 프로세스의 객체와 암호화 기능을 활용해 원격 클라이언트에 메시지를 보냈습니다. EMsg 9526의 다운로드 일정 메시지는 반복 필드가 200개를 넘으면 고정 크기 스택 버퍼를 넘쳐 반환 주소를 덮어씁니다. EMsg 9502의 앱 상태 메시지도 업데이트 단계 배열에 7개를 초과하는 항목을 담으면 스택 배열을 넘칩니다.
연구진은 추가 정보 유출도 찾아냈습니다. 다운로드 일정 메시지를 만들 때 스택 버퍼에는 일정 항목을 최대 32개 복사하지만, 실제 항목 수와 관계없이 32개를 전송합니다. 초기화하지 않은 버퍼 값이 함께 나가며, 이 값으로 steamclient64.dll의 주소를 계산할 수 있습니다. 공격자는 이 정보로 주소 무작위화(ASLR)를 우회하고 스택 오버플로와 ROP 페이로드를 결합해 원격 코드 실행을 구성했습니다. 공격 대상에는 같은 계정으로 인증된 클라이언트 연결이 필요합니다.
Reddit 반응
- @ekdaemon — 누군가 이 생태계의 보안을 돕고 있어 정말 기쁩니다. Valve가 적절한 보상을 제공하기를 바랍니다.
원문: ATREDIS / 번역·요약: Trawling