虚拟化安全:VirtualBox TFTP Server漏洞分析
字数 1532 2025-08-27 12:33:42

VirtualBox TFTP服务器漏洞分析与利用教学文档

0x00 漏洞概述

本教学文档详细分析VirtualBox TFTP服务器中存在的两个安全漏洞:

  1. CVE-2019-2553 - 目录遍历漏洞
  2. 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;
}

漏洞原理

  1. 该验证代码源自QEMU的TFTP实现,原本设计用于Linux系统
  2. Windows系统中使用反斜杠\作为路径分隔符,而验证只检查了正斜杠/
  3. 攻击者可以使用..\\..\绕过路径检查
  4. 结合TFTP读取功能,可以访问VirtualBox进程权限下的任意文件

利用方法

  1. 构造包含..\的路径请求
  2. 示例:
    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);
    ...
}

漏洞原理

  1. tftpSessionOptionParse()中对blksize选项进行了验证,但验证不充分
  2. tftpReadDataBlock()中虽然使用AssertReturn检查,但断言在生产版本中可能被禁用
  3. 攻击者可指定大于UINT16_MAX(65535)的blksize值
  4. 当读取大文件时,会导致堆缓冲区溢出

利用方法

  1. 结合目录遍历漏洞创建或定位一个大文件
  2. 使用特制的blksize值请求文件:
    atftp --trace --verbose --option "blksize 65535" --get -r payload -l payload 10.0.2.4
    
  3. 精心构造文件内容可控制溢出数据

0x04 漏洞组合利用

这两个漏洞可以组合利用实现更强大的攻击:

  1. 使用目录遍历漏洞在共享文件夹中创建恶意文件
  2. 使用堆溢出漏洞通过特制文件触发内存破坏
  3. 可能实现远程代码执行

0x05 漏洞验证与调试

调试环境搭建

  1. 在Linux主机上安装VirtualBox
  2. 在TFTP根目录创建大文件:
    dd if=/dev/zero of=~/.config/VirtualBox/TFTP/payload bs=1 count=65535
    
  3. 使用gdb附加到VirtualBox进程

触发崩溃

  1. 从guest虚拟机执行:
    atftp --trace --verbose --option "blksize 65535" --get -r payload -l payload 10.0.2.4
    
  2. 观察崩溃现场,寄存器被可控数据覆盖

0x06 漏洞修复

Oracle在后续版本中修复了这两个漏洞:

  1. 加强路径验证,同时检查/\
  2. 严格验证blksize选项值
  3. 添加额外的边界检查

0x07 防护建议

  1. 升级到最新版VirtualBox
  2. 如不需要PXE引导,禁用TFTP服务:
    • 修改VirtualBox全局配置
    • 或使用其他网络模式(如桥接模式)
  3. 限制VirtualBox进程权限
  4. 监控对TFTP目录的异常访问

0x08 总结

这两个漏洞展示了默认配置下VirtualBox的安全风险,特别是:

  • 跨平台代码重用带来的安全问题
  • 输入验证不充分导致的漏洞
  • 服务默认开启的风险

通过深入分析这些漏洞,可以帮助安全研究人员更好地理解虚拟化安全威胁,并提高安全开发意识。

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() 漏洞代码分析 漏洞原理 该验证代码源自QEMU的TFTP实现,原本设计用于Linux系统 Windows系统中使用反斜杠 \ 作为路径分隔符,而验证只检查了正斜杠 / 攻击者可以使用 ..\ 或 \..\ 绕过路径检查 结合TFTP读取功能,可以访问VirtualBox进程权限下的任意文件 利用方法 构造包含 ..\ 的路径请求 示例: 0x03 CVE-2019-2552 - 堆溢出漏洞分析 漏洞位置 相关函数: tftpSessionOptionParse() - 解析TFTP选项 tftpReadDataBlock() - 读取数据块 漏洞代码分析 选项解析部分 数据读取部分 漏洞原理 tftpSessionOptionParse() 中对blksize选项进行了验证,但验证不充分 tftpReadDataBlock() 中虽然使用 AssertReturn 检查,但断言在生产版本中可能被禁用 攻击者可指定大于 UINT16_MAX (65535)的blksize值 当读取大文件时,会导致堆缓冲区溢出 利用方法 结合目录遍历漏洞创建或定位一个大文件 使用特制的blksize值请求文件: 精心构造文件内容可控制溢出数据 0x04 漏洞组合利用 这两个漏洞可以组合利用实现更强大的攻击: 使用目录遍历漏洞在共享文件夹中创建恶意文件 使用堆溢出漏洞通过特制文件触发内存破坏 可能实现远程代码执行 0x05 漏洞验证与调试 调试环境搭建 在Linux主机上安装VirtualBox 在TFTP根目录创建大文件: 使用gdb附加到VirtualBox进程 触发崩溃 从guest虚拟机执行: 观察崩溃现场,寄存器被可控数据覆盖 0x06 漏洞修复 Oracle在后续版本中修复了这两个漏洞: 加强路径验证,同时检查 / 和 \ 严格验证blksize选项值 添加额外的边界检查 0x07 防护建议 升级到最新版VirtualBox 如不需要PXE引导,禁用TFTP服务: 修改VirtualBox全局配置 或使用其他网络模式(如桥接模式) 限制VirtualBox进程权限 监控对TFTP目录的异常访问 0x08 总结 这两个漏洞展示了默认配置下VirtualBox的安全风险,特别是: 跨平台代码重用带来的安全问题 输入验证不充分导致的漏洞 服务默认开启的风险 通过深入分析这些漏洞,可以帮助安全研究人员更好地理解虚拟化安全威胁,并提高安全开发意识。