[하루한줄] CVE-2021-30481: Steam 게임 초대를 통한 원격 코드 실행 취약점
URL
CVE-2021-30481: Source engine remote code execution via game invites
Target
- Valve Steam through 2021-04-10
Explain
Valve의 PC 게임 런처 Steam에서 Steamworks API를 사용하여 원격 코드 실행을 할 수 있는 취약점이 발견되었습니다. Steamworks API는 게임 개발자들이 interface set을 통해 게임 내에서 다양한 Steam 기능에 접근할 수 있게 해주는 API입니다.
취약점이 존재하는 함수는 InviteUserToGame
함수입니다.
bool InviteUserToGame(CSteamID steamIDFriend, const char *pchConnectString);
해당 함수는 친구가 게임을 시작하지 않은 경우 게임 프로세스에서 친구를 매개 변수로 지정하여 Command line 끝에 추가됩니다. 게임 내 콘솔이 존재하는 경우 게임 내 콘솔에서 실행이 되지만 Source Engine 게임의 경우 콘솔 command를 지정할 때 제한이 없습니다. 따라서 원하는 게임 명령을 임의로 실행할 수 있습니다.
많은 source engine 게임에는 Source RCON Protocol이 존재합니다. 이 프로토콜을 사용하여 서버 소유자가 게임 클라이언트에서 수행하는 것과 동일한 방식으로 게임 서버 context에서 콘솔 명령을 실행할 수 있습니다. 게임 서버에 연결하기 위해서는 rcon_address
와 rcon_password
명령을 통해 연결을 인증해야 합니다. 해커가 InviteUserToGame
의 두 번째 파라미터를 +rcon_address ip:port +rcon"
으로 설정하여 초대를 보내면 해당 초대를 수락한 사용자는 어떠한 알림도 없이 해당 주소로 연결이 됩니다. 악의적인 RCON 서버를 호스팅 하는 해커는 SERVERDATA_SCREENSHOT_RESPONSE
패킷을 통해 RCON 서버에 연결된 사용자에게 임의의 ZIP archive 파일(screenshot.jpg
)을 업로드할 수 있습니다.
아카이브 내의 screanshot.jpg
파일 정보를 검색하는 CRConClient::SaveRemoteScreenshot
함수가 호출되면 FindZipItem
이 호출됩니다. FindZipItem
에서 lufseek
을 사용할 때 내부 파일 포인터인 s->cur_file_info_internal.offset_curfile
부분을 수정하여 스택을 조작할 수 있습니다. 파일 스트림이 0xFFFFFFFE
을 가리키면 lufread
에서 언더플로우가 발생하게 되어 offset을 손상시킨 후 ROP chain을 구성할 수 있습니다. 해당 취약점의 POC는 github에서 확인하실 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.