
CVE-2026-43499 प्रति-बूट रूट एक्सप्लॉइट — मुख्य लॉजिक (arm64 Android GKI 6.6)
CVE-2026-43499 (Futex PI UAF) कर्नेल आर्बिट्ररी एड्रेस राइट एक्सप्लॉइट का मुख्य लॉजिक कोड, जिसका उपयोग SELinux को बायपास करके root प्राप्त करने के लिए किया जाता है।
इस रिपॉजिटरी में केवल मुख्य एक्सप्लॉइट लॉजिक सोर्स कोड (
src/) और सिंगल-बाइनरी पैकेजर (wrapper/) शामिल है।src/target.hएक टेम्पलेट है, इसे चलाने के लिए आपको अपने डिवाइस के पैरामीटर भरने होंगे (नीचे "डिवाइस अनुकूलन" देखें)।
# 环境要求: Android NDK r29+ (API 35, aarch64)
export ANDROID_NDK_ROOT=/path/to/android-ndk
# 构建纯逻辑产物
make
# → build/unplus (exploit 二进制)
# → build/unplus_preload.so (preload 库)
आउटपुट दो ELF फाइलें हैं, जिनमें कोई बाहरी बाइनरी एम्बेड नहीं होती।
एक्सप्लॉइट और बाहरी पेलोड (magiskpolicy / ksud / kernelsu.ko) को एक-क्लिक चलाने योग्य सिंगल बाइनरी में पैकेज करने के लिए, आपको ये बाहरी पेलोड स्वयं तैयार रखने होंगे और फिर wrapper/ से पैकेज करना होगा:
# 1. 先构建 src/ 产物(见上)
# 2. 生成 payload 数据(payload_data.h 不在仓库,由用户自生成,含外部二进制字节流)
cd wrapper
python3 embed_payloads.py \
--unplus ../build/unplus \
--preload ../build/unplus_preload.so \
--magiskpolicy <path> \
--ksud <path> \
--kernelsu <path> \
--out payload/
# 3. 编译单二进制
make # → wrapper/build/unplus
src/
├── target.h 设备参数模板(◆ FILL IN 标记处需填你的设备值)
├── offset.h target.h 的路由胶水(经 -DTARGET_CONFIG_H 注入)
├── unplus.h 编排头 + 共享声明(含 P0 alias / data_addr 等派生宏)
├── main.c 入口编排
├── stage1.c Write 1/2:SELinux 关闭 + cred 覆写
├── root.c Android root 落地(SELinux golden 修复 + sepolicy + KSU allowlist)
├── slide.c KASLR leak
├── fops.c configfs/fops 路由 + 内核基址推导
├── route.c PI futex 路由线程
├── direct_write.c direct read 原语
├── pipe_direct.c direct pselect write
├── pipe_physrw.c pipe physrw 原语
├── util.c 工具函数
├── utils.h 通用工具(日志、procfs 路径)
├── kernelsnitch.h 架构层(ARM64/x86 identity-map)
├── futex_hash.h 内核 jhash 移植(通用)
└── timeutils.h 架构层计时(ARM/x86/AMD)
src/target.h में दो प्रकार के कॉन्स्टेंट होते हैं:
◆ FILL IN चिह्नित: डिवाइस/कर्नेल से संबंधित, आपको अपने स्वयं के मान भरने ही होंगे। टेम्पलेट में 0xDEADBEEF... प्लेसहोल्डर दिया गया है, यह कंपाइल हो सकता है लेकिन चलाने पर क्रैश हो जाएगा।डिवाइस बदलना = ◆ FILL IN भाग भरना। प्रत्येक फ़ील्ड क्या है और इसे कैसे प्राप्त करें, इसके लिए नीचे परिशिष्ट: फ़ील्ड विवरण देखें।
target.h में ◆ FILL IN फ़ील्ड उपयोग के अनुसार समूहीकृत हैं:
सामान्य अनुभव: सभी *_OFF प्रकार के ऑफ़सेट root डिवाइस पर kallsyms_lookup_name से सिंबल एड्रेस लेकर KIMAGE_TEXT_BASE घटाने से प्राप्त किए जा सकते हैं। TARGET_PCPU_* और TARGET_SELINUX_GOLDEN रनटाइम/dump मान हैं, इन्हें स्टैटिक इमेज से प्राप्त नहीं किया जा सकता।
WTFPL — Do What The Fuck You Want To Public License.
| समूह | फ़ील्ड (उदाहरण) | अर्थ / प्राप्त करने का तरीका |
|---|
| Build identity | BUILD_VARIANT_LABEL、BUILD_FINGERPRINT | कोई भी पहचान स्ट्रिंग, लॉग के लिए। अपने डिवाइस का build fingerprint भरें |
| Memory layout | KIMAGE_TEXT_BASE、P0_PHYS_OFFSET、VMEMMAP_START आदि | कर्नेल वर्चुअल/फिजिकल एड्रेस लेआउट। arm64 VA39 के लिए आमतौर पर डिफ़ॉल्ट मान दिए गए हैं; IKCONFIG / kallsyms / /proc/iomem से पुष्टि करें |
| ASHMEM | ASHMEM_IOCTL_OFF ... ASHMEM_MISC_FOPS_OFF | ashmem ड्राइवर के fops सदस्यों + misc के सिंबल ऑफ़सेट। kallsyms_lookup_name("ashmem_fops") आदि |
| CONFIGFS / PIPE / VFS | CONFIGFS_READ_ITER_OFF、ANON_PIPE_BUF_OPS_OFF、KMALLOC_CACHES_OFF आदि | configfs रीड/राइट, splice, pipe_buf_ops, kmalloc_caches ऑफ़सेट। kallsyms से देखें |
| SELinux | SELINUX_ENFORCING_OFF、SELINUX_BLOB_SIZES_OFF、SECURITY_HOOK_HEADS_OFF | selinux_state / selinux_blob_sizes / security_hook_heads ऑफ़सेट। SELINUX_ENFORCING_OFF कर्नेल build मिलान का एंकर पॉइंट है, यह सटीक होना चाहिए |
| Core kernel symbols | INIT_TASK_OFF、INIT_CRED_OFF、ENTRY_TASK_PERCPU_OFF आदि | init_task / init_cred / entry_task / __per_cpu_offset / root_task_group ऑफ़सेट। kallsyms से देखें; ENTRY_TASK_PERCPU_OFF percpu सेक्शन के भीतर __entry_task का ऑफ़सेट है |
| Per-CPU runtime | TARGET_PCPU_BASE_ADDR、TARGET_PCPU_UNIT_SIZE | per-CPU chunk का रनटाइम एड्रेस (KASLR के बाद), हर बूट पर बदलता है। रनटाइम dump आवश्यक है; UNIT_SIZE CPU की संख्या पर निर्भर करता है |
| SLIDE (KASLR leak) | SLIDE_NFULNL_LOGGER_OFF、SLIDE_RANDOM_BOOT_ID_DATA_OFF आदि | KASLR लीक के लिए उपयोग किए जाने वाले कर्नेल डेटा सिंबल ऑफ़सेट (nfulnl_logger / boot_id data आदि)। kallsyms से देखें |
| SELinux golden | TARGET_SELINUX_GOLDEN | selinux_state के पहले 16 बाइट्स का boolean टेम्पलेट, रीबूट के बीच स्थिर लेकिन हर डिवाइस पर अलग। आपके डिवाइस के selinux_state dump से लेना होगा। byte0 enforcing बिट है, कॉलर permissive दर्शाने के लिए 0x00 लिखता है |
| pipe inode info | PIPE_INODE_INFO_*、PIPE_HEAD_OFF आदि | pipe_inode_info संरचना का लेआउट, समान GKI family के भीतर आमतौर पर स्थिर, कर्नेल build बदलने पर सत्यापन आवश्यक है |