
CVE-2026-43499 exploit di root per avvio — logica principale (arm64 Android GKI 6.6)
Codice sorgente della logica principale di un exploit di scrittura arbitraria nel kernel per CVE-2026-43499 (Futex PI UAF), utilizzato per ottenere root aggirando SELinux.
Questo repository contiene solo il codice sorgente della logica principale dell'exploit (
src/) e il packager per il singolo binario (wrapper/).src/target.hè un template: devi inserire i parametri del tuo dispositivo per poterlo eseguire (vedi "Adattamento del dispositivo" più sotto).
# 环境要求: Android NDK r29+ (API 35, aarch64)
export ANDROID_NDK_ROOT=/path/to/android-ndk
# 构建纯逻辑产物
make
# → build/unplus (exploit 二进制)
# → build/unplus_preload.so (preload 库)
Gli artefatti prodotti sono due ELF e non includono alcun binario esterno.
Per impacchettare l'exploit e i payload esterni (magiskpolicy / ksud / kernelsu.ko) in un singolo binario eseguibile con un comando, procurati questi payload esterni e poi impacchettali con 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 contiene due tipi di costanti:
◆ FILL IN: relative al dispositivo/kernel, devi inserire i tuoi valori. Il template usa 0xDEADBEEF... come segnaposto: compila, ma al momento dell'esecuzione andrà in crash.Cambiare dispositivo = compilare correttamente la parte ◆ FILL IN. Per il dettaglio su cosa sia ogni campo e come ottenerlo, vedi Appendice: descrizione dei campi più sotto.
I campi ◆ FILL IN in target.h sono raggruppati per scopo:
Esperienza generale: tutti gli offset del tipo *_OFF si ottengono prendendo l'indirizzo del simbolo con kallsyms_lookup_name su un dispositivo con root e sottraendo KIMAGE_TEXT_BASE. TARGET_PCPU_* e TARGET_SELINUX_GOLDEN sono valori runtime/da dump e non possono essere ricavati dall'immagine statica.
WTFPL — Do What The Fuck You Want To Public License.
| Gruppo | Campi (esempio) | Significato / Come ottenerli |
|---|
| Build identity | BUILD_VARIANT_LABEL, BUILD_FINGERPRINT | Stringa identificativa arbitraria usata per i log. Inserisci il build fingerprint del tuo dispositivo |
| Memory layout | KIMAGE_TEXT_BASE, P0_PHYS_OFFSET, VMEMMAP_START, ecc. | Layout degli indirizzi virtuali/fisici del kernel. Su arm64 VA39 di norma ci sono già valori predefiniti; verifica tramite IKCONFIG / kallsyms / /proc/iomem |
| ASHMEM | ASHMEM_IOCTL_OFF ... ASHMEM_MISC_FOPS_OFF | Offset dei membri fops del driver ashmem e dei simboli misc, es. kallsyms_lookup_name("ashmem_fops") |
| CONFIGFS / PIPE / VFS | CONFIGFS_READ_ITER_OFF, ANON_PIPE_BUF_OPS_OFF, KMALLOC_CACHES_OFF, ecc. | Offset di read/write di configfs, splice, pipe_buf_ops, kmalloc_caches. Reperibili tramite kallsyms |
| SELinux | SELINUX_ENFORCING_OFF, SELINUX_BLOB_SIZES_OFF, SECURITY_HOOK_HEADS_OFF | Offset di selinux_state / selinux_blob_sizes / security_hook_heads. SELINUX_ENFORCING_OFF è l'ancora di corrispondenza della build del kernel: deve essere preciso |
| Core kernel symbols | INIT_TASK_OFF, INIT_CRED_OFF, ENTRY_TASK_PERCPU_OFF, ecc. | Offset di init_task / init_cred / entry_task / __per_cpu_offset / root_task_group. Reperibili tramite kallsyms; ENTRY_TASK_PERCPU_OFF è l'offset di __entry_task all'interno della sezione percpu |
| Per-CPU runtime | TARGET_PCPU_BASE_ADDR, TARGET_PCPU_UNIT_SIZE | Indirizzo runtime del chunk per-CPU (dopo KASLR): cambia a ogni avvio. Serve un dump a runtime; UNIT_SIZE dipende dal numero di CPU |
| SLIDE (KASLR leak) | SLIDE_NFULNL_LOGGER_OFF, SLIDE_RANDOM_BOOT_ID_DATA_OFF, ecc. | Offset dei simboli dati del kernel usati per il leak di KASLR (nfulnl_logger / boot_id data, ecc.). Reperibili tramite kallsyms |
| SELinux golden | TARGET_SELINUX_GOLDEN | Template boolean dei primi 16 byte di selinux_state, stabile tra i riavvii ma diverso per ogni dispositivo. Va ricavato da un dump di selinux_state del tuo dispositivo. byte0 è il bit enforcing: scrivere 0x00 indica permissive |
| pipe inode info | PIPE_INODE_INFO_*, PIPE_HEAD_OFF, ecc. | Layout della struct pipe_inode_info; di solito stabile all'interno della stessa famiglia GKI. Se cambi build del kernel va ricontrollato |