[하루한줄] 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_addressrcon_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에서 확인하실 수 있습니다.