kernel/locking/rtmutex.c 中的 remove_waiter() 被慢速锁路径使用,同时也在 futex_requeue() 调用 rt_mutex_start_proxy_lock() 时用于代理锁回滚。
在代理锁场景下,waiter::task 并不是 current,但 remove_waiter() 错误地对 current 进行操作。这会导致三个问题:
waiter::task::pi_lock。pi_blocked_on 未被清除,留下一个悬垂指针,可直接导致释放后使用。rt_mutex_adjust_prio_chain() 对错误的进程进行了操作。CWE-416(释放后使用)。CVSS 3.1:7.8 高危(本地,低复杂度,需要低权限)。
受影响版本:Linux 2.6.39 至 6.18.x;已在 6.1.175、6.6.140、6.12.86、6.18.27、7.0.4 中修复。
前提条件: Android NDK 27、CMake ≥ 3.22、adb。
cmake -B build -G Ninja
cmake --build build
adb push build/trigger /data/local/tmp/trigger
adb shell chmod +x /data/local/tmp/trigger
adb shell /data/local/tmp/trigger
在存在漏洞的设备上,预期输出以内核 panic 结束:
Unable to handle kernel write to read-only memory
报告人:
修复作者: Keenan Dong
修复提交者: Thomas Gleixner
提交: 3bfdc63 — rtmutex:在 remove_waiter() 中使用 waiter::task 替代 current