Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
f_hid-4.14-backports — 三个已发布 f_hid 修复(含 CVE-2026-31721、CVE-2026-31606)对已停止维护的 Linux 4.14.190 Android 厂商内核的回移,并附设备端验证记录。 | Kitploit
工具/GitHubGitHub/jakestone594/f_hid-4.14-backports
Android安全嵌入式系统安全漏洞分析硬件与物联网安全
GitHubjakestone594/f_hid-4.14-backports

f_hid-4.14-backports

三个已发布 f_hid 修复(含 CVE-2026-31721、CVE-2026-31606)对已停止维护的 Linux 4.14.190 Android 厂商内核的回移,并附设备端验证记录。

查看仓库
512个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

适用于 Linux 4.14.190 的 f_hid 向后移植(SM-A525F)

对 drivers/usb/gadget/function/f_hid.c 的三处修复,手工移植到 4.14.190 Android 厂商内核,并在其运行的设备上进行了验证。

4.14 已停止维护(EOL)。 这些修复均不存在稳定的向后移植版本,也不会有。这正是本仓库存在的全部原因:设备是我的,而其中一个缺陷正在导致它重启。

准确说明维护归属:本仓库所基于的 NetHunter 树(AzeAstro/samsung_kernel_sm7125,分支 OneUI-6)确实在积极维护,那部分工作在此并无争议。但那是设备与 NetHunter 的启用工作——基础版本仍固定在三星的 4.14.190 厂商版本上。没有人将 4.14.y 的稳定安全修复向下移植进去,三星也没有发布这些修复——4.14.y 本身已于 2024 年 1 月 10 日在 4.14.336 终止,该系列已不再列于 kernel.org 的支持版本之中。这三个补丁正位于这一空白之中。

我做了什么,以及我没有做什么

我没有发现这些漏洞。三者均已公开,上游补丁由他人编写,致谢见下文。我所做的是:

  1. 确认此代码树处于受影响范围内。
  2. 将每个修复移植到一个无厂商支持的代码库中,上游补丁无法干净应用,且周边原语存在差异。
  3. 在硬件能够观测到的情况下,通过运行硬件上的实际效果验证每个修复——在无法观测时则如实说明。

第 3 点是我希望读者权衡的部分。其中两个通过与基线对比测量得到确认。第三个在本设备上无法确认,也不可能确认。这一区别贯穿全文,而非被抹平。

三处修复

#补丁上游作者硬件状态
1f_hidg 生命周期与 cdev(释放后使用)John Keeping,2022-11-22✅ 已测量有效性
2CVE-2026-31721 — hidg_bind 中重新初始化对象生命周期状态Michael Zimmermann,2026-03-31✅ 已测量有效性
3CVE-2026-31606 — 对使用中的 cdev 调用 cdev_initMichael Zimmermann(81ebd43cc0d6d),2026-03-27;-ENOMEM 后续修复由 Ethan Tidmore,2026-04-02⛔ 本设备上不可观测

1 — f_hidg 生命周期与 cdev

f_hidg_open 存储了 f_hidg * 且未获取引用。f_hidg_poll 在嵌入 kzalloc 分配的 f_hidg 中的等待队列上注册轮询等待者。hidg_unbind 调用 cdev_del(),而该函数不会使已打开的文件描述符失效,随后 hidg_free 对对象执行 kfree。没有任何机制针对已打开文件对其进行引用计数——对整个文件执行 refcount|kref|atomic_|open_count 的 grep 仅找到 opts->lock。

因此,在 Android 重新组合 gadget 后仍存活的 /dev/hidg0 上的 select()/poll() 循环,会对已释放的 slab 调用 remove_wait_queue(),对垃圾 ticket 字执行 spin_lock_irqsave,并在 IRQ 屏蔽状态下永久自旋。本地定时器停止,看门狗喂狗线程永远不会被唤醒,非安全看门狗约 11 秒后触发。实际表现:手机硬重启。Android 的 UsbDeviceManager 会自行重新组合——实测两次约 550 ms——无需用户操作,因此这不需要任何特殊触发条件。

上游修复:"usb: gadget: f_hid: fix f_hidg lifetime vs cdev",John Keeping,2022-11-22,Fixes: 71adf1189469。向后移植很干净——所有原语在 4.14.190 中均存在——除了补丁中的 kfree(hidg->set_report_buf),该字段在此版本中不存在,故被丢弃。

2 — CVE-2026-31721

CVSS 3.1 5.5,向量 AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H。hidg_bind 重新初始化了属于对象生命周期而非绑定过程的状态:两个自旋锁、两个等待队列头和一个链表头,这些均未出现在 hidg_alloc 中。init_waitqueue_head 将链表头重置为自指向,因此在重新绑定之前注册的 poll/select 等待者会被静默孤立,其 poll_freewait → remove_wait_queue 随后会发现 prev->next 错误。

上游将九个初始化操作移出 hidg_bind;在 4.14.190 中只有其中五个存在。

⚠ 多家厂商公告将此标题定为“权限提升”。其向量为 C:N/I:N/A:H —— 仅影响可用性,即本地拒绝服务。 我之所以指出这一点,是因为更吓人的解读本会 证明一个该向量并不支持的优先级,而没有人会要求厂商页面自证其说。

此补丁还比上游多走了一步。将初始化移出 hidg_bind 会留下两处对受锁保护字段的 未加锁写入,目前之所以被掩盖,仅仅是因为锁就在它们上方被重新初始化。一旦锁变为 持久存在,竞态就是真实的:一个阻塞在 f_hidg_write 等待循环中的写入者,持有一个 在解绑后仍存活的 fd,可以获取锁、通过检查并在 bind 于锁外存储 NULL 时读取 hidg->req —— 重新检查发生在解引用之后。因此该补丁在两处存储周围都加上了 write_spinlock。

值得说明其一般形式:将初始化移出 bind 可能制造出重新初始化原本掩盖的竞态。 要问一问被移除的初始化在无意中保护了什么。

3 — CVE-2026-31606

CVSS 5.5,同一向量。struct cdev cdev 内嵌于 struct f_hidg,而 hidg_bind 对其调用了 cdev_init() —— 即 memset(cdev, 0, sizeof *cdev) 加上 kobject_init —— 紧接着 cdev_device_add。一个打开的 fd 通过 chrdev_open → cdev_get → kobject_get_unless_zero 持有对该同一 kobject 的引用。在 fd 打开的情况下 解绑→重新绑定时,bind 会清除一个被引用对象上的活跃引用状态。

修复方式是结构体变更而非防护:内嵌的 struct cdev 变为 struct cdev *, 并在每次绑定时调用 cdev_alloc()。此后 cdev_init 在文件中出现零次 —— 不再有 使用中的对象可供重新初始化。

⛔ 此设备无法检测到此缺陷,无论修复前后。 参见 verification/03-cve-2026-31606.md。这是关于该设备插桩能力的一个肯定性论断,而非 含糊其辞。

验证

方法与逐缺陷记录见 verification/。简而言之:修复 1 和 2 通过针对紧邻前一构建的单变量回归并配合阳性对照得以关闭,且修复 2 从不同的日志来源 第二次得到确认。修复 3 仅以源码阅读为证据。

应用

补丁是针对 4.14.190 三星厂商树的 git format-patch 输出,按顺序如下:

git am patches/0001-*.patch patches/0002-*.patch patches/0003-*.patch

它们是累积性的,需要按顺序应用——3 假定结构体已按 1 处理后的状态。

许可证

GPL-2.0,作为 Linux 内核的衍生作品。参见 LICENSE。原始修复的上游作者归属已在上面注明;向后移植、补丁 2 中新增的锁定以及验证工作由我完成。

此处不分发任何编译产物——没有内核镜像、没有模块、没有可刷写的软件包。本仓库仅包含源代码和证据。

下载工具