安全研究人员 Yannick Dixken 发现了一系列 Prusa 3D 打印机固件中的缺陷,攻击者可利用这些缺陷在打印机的主控制器上实现完全远程代码执行 (RCE)。最严重的漏洞被标识为 PFB-008,源于 Prusa Connect 服务中的堆栈溢出,可通过精心构造的网络命令触发。

此截图展示了研究人员成功实现远程代码执行的漏洞证明。
方法与发现
Dixken 花了一周时间分析 MK4S 打印机的固件,结合了自动模糊测试和手动逆向工程。该过程包括使用 AddressSanitizer 编译固件的解析器代码以识别崩溃,并使用 Cortex-M 模拟器在尝试利用物理硬件之前证明控制流。
研究人员对 G-code 解析路径和 Prusa Connect HTTP 请求运行了数百万次变异迭代。这种系统性的方法导致发现了 14 个发现,以及跨越固件网络、USB 和内存管理系统的约 23 个独立缺陷。
“过长的 SEND_FILE_INFO 路径会溢出 Connect 任务的堆栈,并从受控或拦截的 Connect 端点运行攻击者代码”
— Never gonna print you up!
Prusa Connect 堆栈溢出
最关键的发现 PFB-008 涉及通过 Prusa Connect 发送的 `SEND_FILE_INFO` 命令。控制器的处理器将命令的路径复制到共享的 512 字节缓冲区中。虽然代码根据缓冲区大小限制了此复制操作,但它假设路径字符串不会超过 104 字节。
在发布版本中,强制执行此 104 字节限制的 `assert()` 被编译掉了。超过此限制的路径会将文件名槽推到缓冲区末尾,并进入命令规划器使用的指针。由于固件缺乏堆栈金丝雀或 `_FORTIFY_SOURCE` 保护,这允许攻击者覆盖指针并将打印机的执行流重定向到他们自己的代码。

这张图片显示了漏洞在打印机硬件显示屏上运行的视觉结果。
其他漏洞及其影响
除了 RCE,Dixken 还发现了其他几个问题,包括基于 USB 的堆栈溢出 (PFB-007) 和加密 G-code 标头中的堆缓冲区溢出 (PFB-013)。后者允许攻击者在打印机从 USB 闪存盘扫描打印预览时,选择溢出的长度和内容。
其他发现包括基于网络的拒绝服务 (PFB-012),其中未经身份验证的主机可以锁定以太网接收池,导致 PrusaLink 和 mDNS 等所有网络服务停滞。这些漏洞影响到使用 Prusa Connect 进行远程管理或使用 USB 闪存盘进行文件传输的用户。
修复与状态
Prusa 已与研究人员协调,在发布官方安全公告的同时发布这些发现。所有已识别的缺陷均已在 Buddy 固件版本 7.0.0 中修复。研究人员已要求为这些发现分配 CVE,目前正在等待中。