
VirtualBox 7.2.20 - 높음 - 로컬 - 파일 읽기 - OVF NAT TFTP 빈 접두사
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 | CVE-2022-21394 접두사 클래스의 잔재인 CWE-22 |
| CVSS | 높음: 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이다. 읽기 전용 열기가 witness 바이트를 반환했다. |
가져온 접두사 /로 같은 이름을 TFTP RRQ | 동일 | 실험실에서 입증됨. 구성된 경로는 //oracle/...이며, POSIX상 /oracle/...과 동일하다. witness 바이트가 반환되었다. |
빈 접두사로 게스트 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는 home이 존재할 때 항상 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();
이 네 본문은 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입니다. 빈 값은 non-NULL로 유지됩니다. tftp.c:353-357은 NULL일 때만 비활성화합니다. 364-370은 prefix, /, guest 이름을 앞에 붙입니다. 398-407은 ../를 거부합니다. 그런 다음 빌드된 경로에 대해 RTFileOpen을 수행합니다.
이미 기록된 잘못된 접근: guest ../를 잔여물로 취급(CVE-2022-21394, 여전히 거부됨); 기본 신규 VM을 영향받는 것으로 취급; NAT Network home/TFTP를 이 잔여물로 취급; WRQ 쓰기를 주장; 호스트 커널을 주장. 극적 과장: 호스트 /etc/passwd 열기. 오라클은 /oracle 아래의 witness 파일입니다.
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는 부팅되지 않음. Witness 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를 비활성화하도록 하십시오. tftp_prefix에 g_strdup("")를 사용하지 마십시오.
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로 심어진 접두사입니다