
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-ovf-href-dest-escape
クラス: ファイル書き込み 到達範囲: ローカル (ホスト) UI:R
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
悪意ある OVF/OVA をインポートしたホストユーザーは、新しい VM フォルダの外にディスクイメージのバイト列を書き込んでしまいます。ovf:href が書き込み先のファイル名になります。RTPathAbsExCxx は RTPATHABS_F_STOP_AT_BASE を指定していません。一意なパスを生成するヘルパーはサフィックスの前に _%i を挿入し、ベース名の除去 (basename-strip) を行いません。
| ID | CVE 未割り当て |
| クラス | ファイル書き込み (OVF/OVA の書き込み先パス) |
| 到達範囲 | ローカル (ホスト) UI:R (被害者が悪意あるアプライアンスをインポートする) |
| CWE | CWE-22 |
| CVSS | High: 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| 製品 | Oracle VM VirtualBox OSS |
| 影響を受けるバージョン | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| 認証 | VirtualBox 上では不要。ホストユーザーが File/Import を開くか、VBoxManage import を実行します。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ。ソースハーネス。VirtualBox は起動しません。 |
OVF ディレクトリまたは OVA を送り込みます。ovf:href に ../somewhere/disk.vmdk や絶対パス /path/disk.iso を設定します。これをインポートしたオペレーターは、インポートを実行している UID として、それらのディスクイメージのバイト列を CREATE_REPLACE で書き込みます。存在しなかった親ディレクトリも含まれます。サフィックスが必要です (vmdk / iso / その他の MediumFormat 拡張子)。これはサフィックス不要な authorized_keys のドロップではありません。
| 権限 | 手法 + シンク | 得られるもの | 検証状況 |
|---|---|---|---|
| 完全性 | IAppliance::read が File/href をベース名除去なしでコピーします (ovfreader.cpp)。Appliance::interpret() が dest = di.strHref を設定します (ApplianceImplImport.cpp 802-851)。 | 書き込み先ファイル名は攻撃者が選択でき、../ や絶対パスも含まれます。 | ラボで実証済み (相対および絶対 href) |
| 完全性 | i_ensureUniqueImageFilePath (ApplianceImpl.cpp 1126-1160) が RTPATHABS_F_STOP_AT_BASE なしで RTPathAbsExCxx(strAbsName, aMachineFolder, aName) を呼び出します。衝突時は aName のベース名ではなくサフィックスの前に _%i を挿入します。 | 一意化された書き込み先でもマシンフォルダの外に出てしまいます。../oracle/WITNESS.vmdk は ../oracle/WITNESS_1.vmdk になります。 | ラボで実証済み (unique-keeps-dotdot=yes) |
| 完全性 | インポート時に i_importOneDiskImage が再び AbsEx を呼び出します (ApplianceImplImport.cpp 4169-4171)。i_importCreateAndWriteDestinationFile (1043-1053) が親ディレクトリを mkdir した後、RTFILE_O_CREATE_REPLACE を実行します。 | ディスクイメージのバイト列が VM フォルダの外に書き込まれます。絶対 href はマシンフォルダを無視します。対照の disk.vmdk はフォルダ内に留まります。 | ラボで実証済み (relative-escape=yes absolute-href=yes control-in-folder=yes) |
| 偵察 | インポートウィザード / VBoxManage import --dry-run が書き込み先を表示します。 | パスが可視化されます。それ自体は秘密情報の漏洩ではありません。 | 推測 |
| 可用性 | 別の VM のディスクに着地する相対パスの書き込み先。 | インポートを実行している UID としてそのファイルを上書きします。 | 推測 (同じ CREATE_REPLACE 書き込み) |
| 対象外 | MediumFormat サフィックスのない書き込み先 | インポート時に has no extension がスローされます。サフィックス不要な authorized_keys / crontab 書き込みではありません。 | 対象外 |
| 対象外 | NVRAM の書き込み先 | マシンフォルダ配下の {vmname}.nvram に強制されます。 | 対象外 |
| 対象外 | VM 名 .. | sanitiseMachineFilename が無害化します。 | 対象外 |
| 対象外 | 共有フォルダ / ExtraData / シリアル RawFile | vbox:Machine パス上でサニタイズされます。 | 対象外 |
| 対象外 | ホストカーネル、ゲストからホスト | この残存問題ではありません。VM の起動は不要です。インポーターと同じ UID です。 | 対象外 |
OVA はクリーンな経路です。tar メンバーがバイト列を供給し、href がエスケープされた dest を供給します。3D なし、Guest Additions なし、VRDP なし、PUEL なし。
2026年9月の CPU の後、タグ v7.2.20(f2792cf44)に留まり、OVF インポートを読みました。ExtraData、共有フォルダ、NVRAM の dest、シリアルの RawFile はすでに除去されています。ディスクの dest は除去されていません。interpret() は di.strHref をそのまま HardDiskImage の VBox 値にコピーします:
Utf8Str strFilename = di.strHref;
/* ... */
i_ensureUniqueImageFilePath(strMachineFolder, devType, strFilename);
pNewDesc->i_addEntry(VirtualSystemDescriptionType_HardDiskImage,
hd.strDiskId,
di.strHref,
strFilename,
di.ulSuggestedSizeMB,
strExtraConfig);
ApplianceImpl.cpp の 1126-1160 行は、RTPATHABS_F_STOP_AT_BASE を使わずにその名前をマシンフォルダに対して補完し、その後 aName をその場で変更します:
int vrc = RTPathAbsExCxx(strAbsName, aMachineFolder, aName);
/* ... */
const char *pszSuffix = RTPathSuffix(aName.c_str());
offDashNum = pszSuffix ? (size_t)(pszSuffix - aName.c_str()) : aName.length();
aName.replace(offDashNum, cchDashNum, szTmp, cchTmp);
Import は、まだ相対的な dest に対して AbsEx を繰り返し (ApplianceImplImport.cpp 4169-4171)、CREATE_REPLACE で書き込みます。IPRT のテストも同じ結合を記録しています。絶対パスの第 2 引数が優先され、/VirtualBox/Machines に ../VirtualBox.xml を加えると /VirtualBox/VirtualBox.xml になります。
すでに記録済みの誤った方向性: サフィックスのない authorized_keys 書き込みを残留物として扱うこと (import がスローする)、NVRAM の dest (フォルダ内に強制)、VM 名 .. (サニタイザー)、共有フォルダ / ExtraData / シリアル RawFile (すでにサニタイズ済み)。見せかけ: ホストカーネル、ゲストからホストへ。オラクルは、マシンフォルダ外の目撃行と、その場に留まった対照用の disk.vmdk です。
python3 vbox-ovf-href-dest-escape-Abraxas-Labs.py
または
cd lab
./run.sh
dest-join の解釈、unique-path、および import CREATE_REPLACE 書き込みのソースハーネス。Docker compose、ループバック、VirtualBox バイナリなし。マシンフォルダ /work/Machines/ImportedVM。Oracle /work/oracle。
SUCCESS vbox-ovf-href-dest-escape relative-escape=yes unique-keeps-dotdot=yes absolute-href=yes control-in-folder=yes VBOX-OVF-HREF-DEST-ESCAPE-WITNESS
ovf:href が dest になる前にベース名を除去するか、RTPATHABS_F_STOP_AT_BASE を渡す(そして絶対名を拒否する)。RTPATH_PROP_DOTDOT_REFS を拒否する。ユニークパスは相対文字列ではなくベース名を変更すべきである。
f2792cf44f663989818507e36d3db5f978523c5e)ApplianceImplImport.cpp 802-851, 1043-1053, 4169-4171ApplianceImpl.cpp 1126-1160GNU Affero GPL v3.0。LICENSE を参照。ループバックラボ専用。保証なし。