abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-ovf-nat-tftp-prefix
クラス: ファイル読み取り 到達範囲: UI:R インポート後のローカル(ゲスト)
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
vbox:Machine OVF インポートは ExtraData、共有フォルダ、NVRAM パス、シリアル RawFile をサニタイズする。しかし NAT の enable-tftp や TFTP の @prefix には一切触れない。libslirp は tftp_prefix が NULL の場合にのみ TFTP を無効化する。DrvNAT の g_strdup("") は非 NULL のまま残る。ゲストがプレフィックス / または空で etc/passwd を RRQ すると /etc/passwd になる。ゲスト名内の ../ は依然として拒否される。
空または / プレフィックスでインポートされた NAT TFTP により、ゲストは VBox UID としてホストファイルを RRQ できる。 書き込みではない。ホストカーネルでもない。閉じられた ../ チェックの残骸でもない。
| ID | CVE 未割当 |
| クラス | ファイル読み取り(ホストパスに対するゲスト TFTP RRQ) |
| 到達範囲 | vbox:Machine OVF の UI:R インポート後、VM 起動後のローカル(ゲスト) |
| CWE | CWE-22 CVE-2022-21394 プレフィックスクラスの残骸 |
| CVSS | High: 7.7 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N |
| 製品 | Oracle VM VirtualBox OSS |
| 影響バージョン | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| 認証 | ゲスト内では不要。ホストユーザーがインポート後に起動する必要あり |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | ソースハーネス。ループバック compose。VirtualBox は起動しない |
NAT ブロブに enable-tftp と TFTP プレフィックス / または空を持つ vbox:Machine OVF/OVA を用意し、さらに NAT ゲートウェイ(10.0.2.2:69)へ TFTP RRQ を発行するゲストディスクを同梱する。ホストユーザーがインポート(File / Import または VBoxManage import)して VM を起動する。インポートは ExtraData、共有フォルダ、シリアル RawFile、NVRAM パスをクリアする。TFTP フィールドは残存する。起動時、ConsoleImplConfigCommon が EnableTFTP を挿入する。空のプレフィックスは CFGM から省略され、DrvNAT は TFTPPrefix を "" にデフォルト設定し、g_strdup する。libslirp はこれを有効とみなす。
これが特権の全範囲である。ここにはホストへの書き込み、VM プロセスのヒーププリミティブ、カーネルエスケープは存在しない。
| 手法 | シンク | 特権 |
|---|---|---|
インポートされたプレフィックス "" で oracle/VBOX-OVF-NAT-TFTP-PREFIX-WITNESS を TFTP RRQ | libslirp tftp_handle_rrq の後、プレフィックス + / + ゲスト名を RTFileOpen | ラボ実証済み。 空プレフィックスは非 NULL のまま。構築パスは /oracle/VBOX-OVF-NAT-TFTP-PREFIX-WITNESS。読み取り専用オープンがウィットネスバイトを返した。 |
インポートされたプレフィックス / で同名を TFTP RRQ | 同上 | ラボ実証済み。 構築パスは //oracle/... で、POSIX 上 /oracle/... と同一。ウィットネスバイトを返した。 |
空プレフィックスでゲスト RRQ etc/passwd のパスのみの類似ケース | "" + "/" + "etc/passwd" | ラボ実証済みのパス構築。 結果は /etc/passwd。ラボはホストの /etc を開かない。 |
VBox UID が開ける任意の相対名(ホームの鍵、VirtualBox.xml、ホストの /etc、Windows のカレントドライブルート)の TFTP RRQ | 同じ RTFileOpen | 推測。 同じ連結。プロセスが開けないファイルは閉じたまま(File not found)。 |
| 手法 | 特権 |
|---|---|
| TFTP WRQ | 不可。 この TFTP サーバーは RRQ 専用。書き込みハンドラはない。 |
| ホストファイルの上書き / 作成 | 不可。 読み取り専用の RTFILE_O_READ。 |
| VM プロセスのヒープ、VBoxSVC、他の VM、ホストカーネル | 不可。 この残骸は構築パスに対するファイルオープンである。 |
| TFTP DoS | 対象外。 |
fEnableTFTP を false に書き込みます(Settings.cpp の NATEngine コンストラクタ)。VBoxNetSlirpNAT は、ホームが存在する場合、常に tftp_path を <VirtualBox home>/TFTP に設定します。RRQ はそのプレフィックスの下に留まります。../ と末尾の / は依然として「Access violation」になります。これはクローズ済みの CVE-2022-21394 のウォークです。/work/tftp/boot.pxe)。このアプライアンスをインポートして VM を起動する実際のホストは、VBox UID が開ける任意のパスをゲストに読み取らせます。ラボはそのウォークのソースハーネスです。VirtualBox は起動されません。
私は VirtualBox/virtualbox v7.2.20(f2792cf44)を固定しました。NAT と OVF の調査です。7.2 では NAT がバンドルされた libslirp 4.9.3 に切り替わりました。.ova からの共有フォルダの尊重はすでに危険と見なされ、除去されています。TFTP はそのリストにありませんでした。
Settings.cpp は vbox:Machine のインポート時に NAT の enable-tftp と TFTP/@prefix を依然として読み取ります:
elmMode.getAttributeValue("enable-tftp", nic.nat.fEnableTFTP);
// ...
pelmTFTP->getAttributeValue("prefix", nic.nat.strTFTPPrefix);
ApplianceImplImport.cpp:6147 は、彼らが覚えていたすべてをサニタイズします:
config.sanitizeImportedSerialPorts();
config.sanitizeSharedFolderSettings();
config.sanitizeImportedNvramSettings();
if (!m->optListImport.contains(ImportOptions_KeepExtraData))
config.sanitizeImportedExtraData();
これらの4つの本体は strTFTPPrefix や fEnableTFTP を決して名指ししない。
起動時、ConsoleImplConfigCommon.cpp:2286-2292 は TFTPPrefix を空でない場合にのみ挿入し、EnableTFTP は常に挿入する。DrvNAT.cpp:1656-1665 は、キーを省略する古い VM に対して EnableTFTP をデフォルトで true に設定し、その後:
rc = pDrvIns->pHlpR3->pfnCFGMQueryStringAllocDef(pCfg, "TFTPPrefix", &pszTmp, "");
slirpCfg.tftp_path = pszTmp;
slirp.c:698 は g_strdup です。空の場合は非NULLのままです。tftp.c:353-357 はNULLの場合にのみ無効化します。364-370 はプレフィックス、/、ゲスト名を先頭に付加します。398-407 は ../ を拒否します。その後、構築されたパスに対して RTFileOpen を実行します。
すでに記録済みの誤った道筋:ゲストの ../ をこの残存問題として扱うこと(CVE-2022-21394、依然として拒否される);デフォルトの新規VMを影響を受けるものとして扱うこと;NAT Networkのhome/TFTPをこの残存問題として扱うこと;WRQ書き込みを主張すること;ホストカーネルを主張すること。見せかけ:ホストの /etc/passwd を開くこと。オラクルは /oracle 配下の証人ファイルです。
python3 vbox-ovf-nat-tftp-prefix-Abraxas-Labs.py
または
cd lab
./run.sh
pin サニタイザのソースハーネス、DrvNAT の空文字列デフォルト、g_strdup、および libslirp の tftp_handle_rrq。Docker compose プロジェクト vbox-ovf-nat-tftp-prefix。ループバックのみ。VirtualBox は起動していない。ウィットネス VBOX-OVF-NAT-TFTP-PREFIX-WITNESS は /oracle/... に配置されている。制御用 PXE ファイルは /work/tftp/boot.pxe。最終行:
SUCCESS vbox-ovf-nat-tftp-prefix sanitize-miss=yes null-disable=yes empty-prefix-read=yes slash-prefix-read=yes dotdot-reject=yes VBOX-OVF-NAT-TFTP-PREFIX-WITNESS
在导入 vbox:Machine 时,以与清除 ExtraData 和共享文件夹相同的方式清理 nat.fEnableTFTP 和 nat.strTFTPPrefix。除非前缀是受限目录,否则按失败关闭处理。将空字符串视为 NULL,以便 libslirp 禁用 TFTP。不要将 g_strdup("") 写入 tftp_prefix。
f2792cf44f663989818507e36d3db5f978523c5e)Settings.cpp NAT TFTP 读取(4873、4888-4894)和导入清理器(9654-9682)ApplianceImplImport.cpp i_importVBoxMachine(6147-6151)ConsoleImplConfigCommon.cpp(2286-2292)DrvNAT.cpp(1656-1665)slirp.c g_strdup(698)tftp.c(353-407)../;此遗留项是 OVF 植入的前缀