
CVE-2026-43499 (GhostLock) कर्नेल UAF पर vivo Y200i Android 14 के लिए शोध नोट्स और PoC विकास, जिसमें futex PI-chain stack-reclaim प्रिमिटिव्स और फ्रेम-लेआउट सीमाएँ शामिल हैं।
डिवाइस: vivo Y200i (PD2354C), Snapdragon 4 Gen 2 (SM4450), Android 14 / OriginOS 4 कर्नेल: 5.10.218-gki-g3a51ea9d5834 (39-bit VA, 4K pages, KASLR on, STACKLEAK=y, no SVE)
लक्ष्य: CVE-2026-43499 (GhostLock) के माध्यम से अस्थायी root।
अब तक काम कर रहा है:
अवरुद्ध: stack-reclaim primitive rt_mutex_waiter के rb_node तक नहीं पहुँच पाता।
मुख्य संख्याएँ (दो स्वतंत्र firmware packages में समान):
__arm64_sys_futex 0xe0
do_futex 0xc0 (inlined नहीं - एक bl do_futex मौजूद है)
futex_wait_requeue_pi 0x1b0 (waiter sp+0x20 पर)
=> futex chain depth T0-0x330
__arm64_sys_pselect6 0xa0 core_sys_select 0x1c0 (fd_set sp+0x50 पर) => pselect chain depth T0-0x210, नियंत्रणीय विंडो केवल 120 bytes => gap 0x120, architecturally non-overlapping
waiter layout (5.10 compact, PFEM10 से मेल खाता है): +0x18 pi_tree_entry.__rb_parent_color <- जिसे rt_mutex_adjust_prio_chain walk करता है +0x20 pi_tree_entry.rb_right +0x28 pi_tree_entry.rb_left +0x30 task +0x38 lock +0x40 prio +0x48 deadline
rt_mutex_adjust_prio_chain से साक्ष्य: ldr x8, [task, #0x888] ; task->pi_waiters.rb_leftmost sub x8, x8, #0x18 ; rb_entry(node, rt_mutex_waiter, pi_tree_entry)
चूँकि copy_from_user उच्च addresses की ओर लिखता है, pi_tree_entry को कवर करने के लिए copy base <= T0-0x318 होना चाहिए।
समाप्त किए गए रास्ते: pselect6/core_sys_select T0-0x210 -> 0x120 कम poll/do_sys_poll window T0-0x344 पर समाप्त, अधिकतम 0xf0B (N_STACK_PPS=30) -> 0x14 कम rt_sigreturn (fpsimd) T0-0x300 -> केवल waiter+0x30 तक पहुँचता है rt_sigreturn (SVE) T0-0x310 -> waiter+0x10 को कवर करेगा, लेकिन इस CPU में SVE नहीं है; कर्नेल SVE sigframe records को -EINVAL के साथ अस्वीकार करता है compat rt_sigreturn / vfp T0-0x2c0 -> और भी कम गहरा
सभी copy_from_user sites का पूर्ण-कर्नेल स्कैन: कुल 655, 118 reachable, अधिकतम गहराई 0x300 (bpf_prog_get_info_by_fd, CAP_BPF द्वारा भी gated)। 0x318 चाहिए।
निष्कर्ष: इस कर्नेल की stack geometry stack-based copy_from_user के लिए 0x300 पर सीमित है; pi_tree_entry को कवर करने के लिए 0x318 चाहिए। यह tuning का मुद्दा नहीं है - यह compile-time frame-layout का अंतर है। do_futex यहाँ inlined नहीं है, PFEM10 (5.10.236, Clang 12.0.5) के विपरीत, संभवतः भिन्न inlining cost model के कारण।
खोज रहे हैं: