2025 年 2 月 6 日,Jonas Rudloff 介绍 NVIDIA/Mellanox 的 ConnectX 系列智能网络接口卡(SmartNICs/NICs),主要用于服务器和数据中心,本文将对其固件进行逆向工程以尝试破解 iRISC 处理器的指令集。ConnectX 系列也是 BlueField 系列 NIC 的基础,后者是带有用户可控嵌入式 ARM 系统(运行 Linux)和部分交换技术的 ConnectX。
- ConnectX 系列 NIC 功能复杂,包括 SR-IOV 可使单个物理 NIC 模拟多个 PCIe 设备以加速虚拟机的网络访问;多种卸载能力,可实时处理数据包报头和校验和实现 VLAN 隔离等;较新的 ConnectX 卡有加密能力如 IPSEC 或 TLS 加速;Infiniband 技术可实现多机器间紧密耦合的并行应用;使用 RSA 公钥加密进行固件签名更新。
- 攻击 NIC 很有趣,因其可直接访问网络且能访问 PCIe 进而对主机内存有 DMA 访问权限。
分析的固件为
fw-ConnectX5-rel-16_35_4030-MCX566M-GDA_Ax_Bx-UEFI-14.29.15-FlexBoot-3.6.902.bin
,NVIDIA 发布了与这些 SmartNIC 交互的开源驱动和工具mstflint
,mstflint
的verify [showitoc]
命令可解析固件图像并转储部分内容,通过dd
或字节切片可提取固件部分内容,如提取IRON_PREP_CODE
。- 对
IRON_PREP_CODE
的初步观察发现一些规律,如开头 32 字节中6c 20
重复,且与后续类似序列存在关联,推测这些是函数的序言和尾声,类似函数 prologue 和 epilogue。
- 对
- 根据一些文档、内核驱动错误消息和用户空间工具源代码,这些 NIC 包含名为 iRISC 的嵌入式处理器,推测其指令集布局类似 MIPS 架构,据此制作了一个原始的反汇编器,输出结果进一步证实了之前的推测,得出
opcode=0x1b
是存储指令,opcode=0x19
是加载指令,r1
是栈指针,r19 - r20
是被调用者保存的寄存器等结论,并对一些操作码的功能进行了猜测和细化。 - 结论:ConnectX-5 的固件是逆向工程的可行目标,但仍有很多工作要做,目前了解到 iRISC 指令集的一些特性,如大端处理器、类似 MIPS 架构的指令布局、加载和存储指令的偏移编码不同、低偏移位有异常、
r1
是栈指针、r19 - r20
是被调用者保存寄存器等。 - 参考文献:[1]https://network.nvidia.com/fi...;[2]https://www.nvidia.com/conten...;[3]https://people.freebsd.org/~g...;[4]https://github.com/torvalds/l...;[5]https://github.com/Mellanox/m...。同时介绍了iRISC research syndicate及其 Github(https://github.com/irisc-rese...和 Pwnies(http://pwnies.dk/)。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。