abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-lsilogic-sas-config
类别: 类型混淆 / 任意读写 可达性: 本地(客户机)
Oracle VM VirtualBox OSS 7.2.20(f2792cf44f663989818507e36d3db5f978523c5e)
SAS1068 MPT CONFIG 将 SCSI-SPI Port 0 视为一个 12 字节的页。在 SAS 上,该页是一个联合体的另一半:pManufacturingPage7 加上 cbManufacturingPage7。客户机 CONFIG READ 通过 DMA 泄漏堆指针。CONFIG WRITE 植入指针和大小。随后 manufacturing page 7 通过植入的指针进行复制。
在已挂载的 SAS1068(PDM LsiLogicSas,PCI 1000:0054)上的客户机 ring3 可在 VM 进程中实现任意读/写。 这是 VirtualBoxVM / VBoxHeadless 堆,而非宿主内核逃逸。
| ID | 暂无 CVE |
| 类别 | 类型混淆 / 任意读写 |
| 可达性 | 本地(客户机) |
| CWE | CWE-843、CWE-822 |
| CVSS | 严重:8.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| 产品 | VirtualBox OSS |
| 受影响版本 | 7.2.20(f2792cf44) |
| 前提条件 | 已挂载的 SAS1068(PDM LsiLogicSas,PCI 1000:0054) |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 回环源码测试框架 |
方法:客户机 ring3 使用 MPT_MESSAGE_HDR_FUNCTION_CONFIG(0x04)、页类型 SCSI-SPI Port 0(0x03)来编程 SAS1068 MMIO doorbell 或请求 FIFO。分发逻辑始终调用 SPI getter。只有 EXTENDED 受 SAS 门控。页属性 getter 被注释掉了,因此 Readonly Port 0 页仍然可写。SPI Port 0 按 12 字节打包,并覆盖 SasPages.pManufacturingPage7(8 字节)加上 cbManufacturingPage7(4 字节)。
| 权限 | 类型 | 状态 | 授予的能力 |
|---|---|---|---|
| CONFIG SCSI-SPI Port 0 READ | 侦察 | 实验验证 | 将 VM 进程堆指针 pManufacturingPage7 及其大小通过 DMA 写入客户机 RAM。为 ASLR 提供输入。 |
| CONFIG SCSI-SPI Port 0 WRITE | 完整性 | 实验验证 | 用客户机选择的指针 + 大小覆盖那些 SAS 字段 |
| manufacturing page 7 CONFIG READ | 完整性 | 实验验证 | 从植入的地址将宿主字节复制到客户机 GPA(VBOX-LSILOGIC-SAS-CONFIG-WITNESS) |
| manufacturing page 7 CONFIG WRITE | 完整性 | 由同一 getter 推断 | 将客户机字节复制到植入的地址(VirtualBoxVM 中的任意写) |
| Port 1 / Device 0 SPI 页 | 侦察 / 完整性 | 推断的覆盖 | Port 1 泄漏/植入 pSASIOUnitPage0;Device 0 page 0 命中 paPHYs;Device 0 page 1 命中 pSASDeviceHead |
| 任意植入指针 | 可用性 | 推断 | 在下一次 SAS 页访问或 lsilogicR3ConfigurationPagesFree 时使 VM 进程崩溃 |
已排除的相邻范围:
SpiPages 是真实布局;此类型混淆需要 SAS1068)VERR_NOT_FOUND)这是 VM 进程任意读写,而非宿主内核逃逸。完整的宿主用户权限仍需一个加固遗留问题。我没有将其与剩余的 3D 写配对:VMSVGA DX11 UAF(d691aa68)在此版本上已修复。
无需 Guest Additions。无需 3D。无需 VRDP。非 PUEL。恶意客户机 ring3 已足够;不需要内置的 mpt/mptsas 驱动。
我在 2026 年 9 月的 CPU 之后停留在 OSS 7.2.20 上,并走查了 LsiLogic MPT CONFIG。2026 年那个静默的 reply-stack 泄漏已经被修复:122c6880 在 SCSI I/O 错误时对 MptReplyUnion 执行 RT_ZERO。我当时在寻找这一类问题的残留,而不是那个 sink。
残留是一个 union,而不是栈上的 reply:
union {
MptConfigurationPagesSpi SpiPages;
MptConfigurationPagesSas SasPages;
} u; /* DevLsiLogicSCSI.h:3323 */
SAS alloc 会填充 SasPages 主机指针,并且从不运行 SPI 页初始化。位于 DevLsiLogicSCSI.cpp:2795 的 SPI Port getter 没有 enmCtrlType 检查。CONFIG 分派中的 SPI 分支没有门控。页属性 getter 在 cpp:3159 处被注释掉。位于 cpp:2701 的制造页 7 受 SAS 门控,这是预期路径,并且在没有 NULL 检查的情况下解引用 pManufacturingPage7。这就是 SPI 类型的 Port 0 READ/WRITE 如何变成 SAS 指针泄漏和植入。已记录的误入歧途:重新提交 122c6880;将默认的 LSI53C1030 当作此 bug;将野指针崩溃夸大为宿主内核逃逸;在打包覆盖层已足够时使用实时 VM。作秀:反向 shell。判定标准是 CONTROL 虚拟页数据,然后对 VBOX-LSILOGIC-SAS-CONFIG-WITNESS 进行泄漏/植入/任意读取。
cd lab
./run.sh
或运行 python3 vbox-lsilogic-sas-config-Abraxas-Labs.py。pin 结构体的源 harness。VirtualBox 未启动。Compose 项目 vbox-lsilogic-sas-config,network_mode: none。不绑定任何内容。
CONTROL:SPI 类型的 Port 0 overlay-read 是 dummy 页数据,而非 manufacturing-page-7 堆指针。
SAS 混淆:Port 0 READ 泄漏的 pManufacturingPage7 与 calloc 匹配。Port 0 WRITE 植入第二个 witness 缓冲区指针+大小。Manufacturing page 7 getter 加上 CONFIG READ 将 witness 复制到 guest GPA 数组中。
SUCCESS vbox-lsilogic-sas-config leak=yes plant=yes arb-read=yes VBOX-LSILOGIC-SAS-CONFIG-WITNESS
基于 enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI 对 SCSI-SPI 页类型进行门控。恢复页属性检查,使只读端口 0 保持只读。在解引用之前对 pManufacturingPage7(以及其他 SAS 指针)进行 NULL 检查。停止在一个联合体中叠加 SpiPages 和 SasPages。
f2792cf44f663989818507e36d3db5f978523c5e)DevLsiLogicSCSI.h 第 3323 行的联合体;第 2251 行的 SPI 端口 0 大小 12DevLsiLogicSCSI.cpp 第 619 行的 SAS 分配;第 2701 行的 manufacturing getter;第 2795 行的 SPI 端口 getter;第 3159 行被注释掉的页属性;第 3293 行的 CONFIG READ/WRITE122c6880(MptReplyUnion SCSI I/O 错误栈)