虚拟化安全:VirtualBox TFTP Server漏洞分析
字数 1532 2025-08-27 12:33:42
VirtualBox TFTP服务器漏洞分析与利用教学文档
0x00 漏洞概述
本教学文档详细分析VirtualBox TFTP服务器中存在的两个安全漏洞:
- CVE-2019-2553 - 目录遍历漏洞
- CVE-2019-2552 - 由于TFTP OptionBlkSize的错误验证引发的堆溢出漏洞
这两个漏洞在VirtualBox默认配置下即可触发,无需特权用户操作,也无需安装Guest Additions。
0x01 漏洞环境
受影响版本
- VirtualBox 6.0.4及之前版本
默认配置
- NAT网络模式
- TFTP服务器运行在10.0.2.4(默认PXE引导地址)
- TFTP根目录:
C:\Users\<username>\.VirtualBox\TFTP(Windows)或~/.config/VirtualBox/TFTP(Linux)
0x02 CVE-2019-2553 - 目录遍历漏洞分析
漏洞位置
- 源代码位于:
src/VBox/Devices/Network/slirp/tftp.c - 验证函数:
tftpSecurityFilenameCheck()
漏洞代码分析
DECLINLINE(int) tftpSecurityFilenameCheck(PNATState pData, PCTFTPSESSION pcTftpSession) {
size_t cbSessionFilename = 0;
int rc = VINF_SUCCESS;
AssertPtrReturn(pcTftpSession, VERR_INVALID_PARAMETER);
cbSessionFilename = RTStrNLen((const char *)pcTftpSession->pszFilename, TFTP_FILENAME_MAX);
if (!RTStrNCmp((const char *)pcTftpSession->pszFilename, "../", 3) ||
(pcTftpSession->pszFilename[cbSessionFilename - 1] == '/') ||
RTStrStr((const char *)pcTftpSession->pszFilename, "/../"))
rc = VERR_FILE_NOT_FOUND;
/* only allow exported prefixes */
if (RT_SUCCESS(rc) && !tftp_prefix)
rc = VERR_INTERNAL_ERROR;
LogFlowFuncLeaveRC(rc);
return rc;
}
漏洞原理
- 该验证代码源自QEMU的TFTP实现,原本设计用于Linux系统
- Windows系统中使用反斜杠
\作为路径分隔符,而验证只检查了正斜杠/ - 攻击者可以使用
..\或\..\绕过路径检查 - 结合TFTP读取功能,可以访问VirtualBox进程权限下的任意文件
利用方法
- 构造包含
..\的路径请求 - 示例:
tftp> get ..\..\Windows\win.ini
0x03 CVE-2019-2552 - 堆溢出漏洞分析
漏洞位置
- 相关函数:
tftpSessionOptionParse()- 解析TFTP选项tftpReadDataBlock()- 读取数据块
漏洞代码分析
选项解析部分
else if (fWithArg) {
if (!RTStrICmp("blksize", g_TftpDesc[idxOptionArg].pszName)) {
rc = tftpSessionParseAndMarkOption(pszTftpRRQRaw, &pTftpSession->OptionBlkSize);
if (pTftpSession->OptionBlkSize.u64Value > UINT16_MAX)
rc = VERR_INVALID_PARAMETER;
}
...
}
数据读取部分
DECLINLINE(int) tftpReadDataBlock(PNATState pData, PTFTPSESSION pcTftpSession, uint8_t *pu8Data, int *pcbReadData) {
RTFILE hSessionFile;
int rc = VINF_SUCCESS;
uint16_t u16BlkSize = 0;
AssertReturn(pcTftpSession->OptionBlkSize.u64Value < UINT16_MAX, VERR_INVALID_PARAMETER);
u16BlkSize = (uint16_t)pcTftpSession->OptionBlkSize.u64Value;
rc = RTFileRead(hSessionFile, pu8Data, u16BlkSize, &cbRead);
...
}
漏洞原理
tftpSessionOptionParse()中对blksize选项进行了验证,但验证不充分tftpReadDataBlock()中虽然使用AssertReturn检查,但断言在生产版本中可能被禁用- 攻击者可指定大于
UINT16_MAX(65535)的blksize值 - 当读取大文件时,会导致堆缓冲区溢出
利用方法
- 结合目录遍历漏洞创建或定位一个大文件
- 使用特制的blksize值请求文件:
atftp --trace --verbose --option "blksize 65535" --get -r payload -l payload 10.0.2.4 - 精心构造文件内容可控制溢出数据
0x04 漏洞组合利用
这两个漏洞可以组合利用实现更强大的攻击:
- 使用目录遍历漏洞在共享文件夹中创建恶意文件
- 使用堆溢出漏洞通过特制文件触发内存破坏
- 可能实现远程代码执行
0x05 漏洞验证与调试
调试环境搭建
- 在Linux主机上安装VirtualBox
- 在TFTP根目录创建大文件:
dd if=/dev/zero of=~/.config/VirtualBox/TFTP/payload bs=1 count=65535 - 使用gdb附加到VirtualBox进程
触发崩溃
- 从guest虚拟机执行:
atftp --trace --verbose --option "blksize 65535" --get -r payload -l payload 10.0.2.4 - 观察崩溃现场,寄存器被可控数据覆盖
0x06 漏洞修复
Oracle在后续版本中修复了这两个漏洞:
- 加强路径验证,同时检查
/和\ - 严格验证blksize选项值
- 添加额外的边界检查
0x07 防护建议
- 升级到最新版VirtualBox
- 如不需要PXE引导,禁用TFTP服务:
- 修改VirtualBox全局配置
- 或使用其他网络模式(如桥接模式)
- 限制VirtualBox进程权限
- 监控对TFTP目录的异常访问
0x08 总结
这两个漏洞展示了默认配置下VirtualBox的安全风险,特别是:
- 跨平台代码重用带来的安全问题
- 输入验证不充分导致的漏洞
- 服务默认开启的风险
通过深入分析这些漏洞,可以帮助安全研究人员更好地理解虚拟化安全威胁,并提高安全开发意识。