一名用户在其 TP-Link EAP770 v1 Wi-Fi 7 接入点中发现了一个严重的硬件级漏洞,该漏洞在传输大文件时会导致数据损坏。该问题表现为在 HTTPS 下载过程中出现“bad record mac”错误,以及 `rsync` 传输失败,尽管 TCP 校验和看起来是有效的。通过数据包分析和驱动程序检查,用户确定罪魁祸首是 Qualcomm 的 `qca-nss-dp` 驱动程序中的 DMA 缓存一致性漏洞。具体而言,该驱动程序的快速传输路径在将接收缓冲区重新交给网络接口卡(NIC)之前,未能同步整个接收缓冲区的 CPU 缓存。这允许来自先前操作的“脏”缓存行被写回 DRAM,从而覆盖新数据包的 64 字节块。

该损坏情况因设备的 SFE/PPE(交换机架构引擎 / 数据包处理引擎)卸载功能而变得更加严重。这些功能通过在数据已在内存中损坏后重新计算 TCP 校验和来加速桥接流量。由于校验和是在损坏的有效负载上重新计算的,TCP 层会将这些分段视为有效,导致端到端的完整性检查(如 TLS 和 SSH)才能够捕捉到错误。用户确定修复需要禁用两个特定的 sysfs 设置:`l2_feature` 和 `ppe_rfs_feature`。然而,TP-Link 将 v1 硬件归类为“停止维护”,并拒绝提供固件更新,且设备的默认 SSH shell 不提供修改这些设置的权限。

为了绕过这些限制,用户开发了一个内核漏洞利用程序以获取 root 权限。该漏洞利用了 CVE-2022-0185,这是 Linux 内核 `legacy_parse_param()` 函数中的一个整数下溢漏洞,允许非特权用户触发 4 KiB slab 对象的写入溢出。通过对内核内存进行堆整备(grooming)并操纵管道缓冲区,用户能够实现任意写入,最终覆盖 `modprobe_path` 以执行具有全局 root 权限的 shell。这使他们能够手动禁用有缺陷的卸载功能,在无需制造商提供的补丁的情况下成功停止数据损坏。用户指出,虽然系统针对常见漏洞进行了良好的加固,但由于旧硬件缺乏维护,迫使他们必须使用内核级原语来解决根本性的驱动缺陷。

一个人正在电脑上工作以排查 TP-Link 接入点故障
用户从识别硬件漏洞到为 TP-Link EAP770 开发内核漏洞利用程序的历程。blog.dfb.sh

用户识别 DMA 缓存一致性漏洞并最终开发内核漏洞利用程序以绕过硬件限制的过程。