Christbowel/CVE-2026-56111
GitHub: Christbowel/CVE-2026-56111
Marlin 固件 M421 G-code 处理程序越界写入漏洞(CVE-2026-56111)的概念验证工具,通过串口或 TCP 发送恶意 G-code 触发固件内存越界写入。
Stars: 1 | Forks: 0
# CVE-2026-56111 - Marlin M421 越界写入
**CVE-2026-56111** 的概念验证,这是在使用 `MESH_BED_LEVELING` 编译时,[Marlin Firmware](https://github.com/MarlinFirmware/Marlin) 的 `M421` G-code 处理程序中存在的一个越界写入漏洞。
- 安全公告:https://www.vulncheck.com/advisories/marlin-firmware-out-of-bounds-write-via-m421-g-code-handler
- 受影响版本:Marlin <= 2.1.2.7,已在提交 `1f255d1` 中修复
- 严重程度:高 (CVSS 8.3)
## 漏洞原理
MBL 的 `M421` 处理程序仅检查了 I/J 索引是否为负数,而未
检查其上限。随后 `set_z()` 在写入 `z_values[ix][iy] = z` 时也没有进行边界
检查。超出网格范围的索引会将受控的 32 位浮点数写入到 `z_values`
数组之外,从而覆盖相邻的固件状态。
这种写入是**受限的,而非任意的**。写入目标为
`z_values + (ix*GRID_Y + iy)*4` 字节处,由于索引受限于 `int8_t` (最大值为 127),
因此可达窗口大约在 `z_values` 之后的 2 KB 范围内。你可以控制值 (Z
浮点数) 和偏移量 (索引),但无法控制绝对
地址。
该工具仅发送 G-code 命令行。越界写入发生在
固件内部。可观察到的影响包括拒绝服务、固件崩溃或运动
异常。确切的内存写入情况已在安全公告中说明,本工具不负责展示。
## 编译
```
gcc -O2 -o exp exploit.c
```
## 使用说明
选择一种通信通道:
- `--serial ` 用于 USB 连接,例如 `/dev/ttyUSB0` 或 `/dev/ttyACM0`
(如有需要可添加 `--baud N`;许多主板使用 `250000`)
- `--tcp ` 用于暴露了 telnet/网络 gcode 的打印机,例如 `192.168.1.50:23`
### write 模式
发送带有你指定的索引和值的 `M421` 指令:
```
./exp --serial /dev/ttyUSB0 write -i 3 -j 0 -z 99.0
./exp --tcp 192.168.1.50:23 write -i 5 -j 0 -z 99.0
```
在默认的 3x3 网格上 (有效索引为 0..2):
- `-i 3 -j 0` 写入偏移量为 36 字节的位置,即 `z_offset` (热床 Z 偏移量)
- `-i 5 -j 0` 写入偏移量为 60 字节的位置,即 parser 对象
### dos 模式
发送一个带 NaN Z 值的越界索引。NaN 会传播到运动计算逻辑中,
并必定会导致固件崩溃或挂起:
```
./exp --serial /dev/ttyUSB0 dos
./exp --tcp 192.168.1.50:23 dos
```
## 修复方案
更新至包含提交 `1f255d1` 的 Marlin 版本,该提交以与 ABL 和 UBL 处理程序相同的方式对索引进行了边界限制。
## 免责声明
仅供研究和授权测试使用。请仅在你拥有或获得明确
测试许可的设备上使用。发送这些命令可能会导致打印机崩溃或中断打印任务。
标签:3D打印机固件, 客户端加密, 嵌入式安全, 漏洞验证代码, 物联网安全