No-22-Github/UnPlus
GitHub: No-22-Github/UnPlus
UnPlus 是一个基于 CVE-2026-43499 Futex PI UAF 漏洞的 arm64 Android GKI 6.6 内核提权 exploit,通过任意地址写入绕过 SELinux 获取 root 权限。
Stars: 0 | Forks: 0
# unplus
\
--ksud \
--kernelsu \
--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...` 占位,能编译但跑起来会崩。
- **无标记的**:GKI 6.6 不变量(struct 字段偏移),通常不用改。
换设备 = 填好 `◆ FILL IN` 部分。具体每个字段是什么、怎么获取,见下文 [附录:字段说明](#附录字段说明)。
## 附录:字段说明
`target.h` 里 `◆ FILL IN` 的字段按用途分组:
| 分组 | 字段(示例) | 含义 / 获取方式 |
|------|------------|----------------|
| **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` 是 `__entry_task` 在 percpu section 内的偏移 |
| **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 位,调用方写 0x00 表示 permissive |
| **pipe inode info** | `PIPE_INODE_INFO_*`、`PIPE_HEAD_OFF` 等 | pipe_inode_info 结构布局,同 GKI family 内通常稳定,换内核 build 需核验 |
**通用经验**:所有 `*_OFF` 类偏移都可用 root 设备的 `kallsyms_lookup_name` 拿到符号地址后减去 `KIMAGE_TEXT_BASE` 得到。`TARGET_PCPU_*` 和 `TARGET_SELINUX_GOLDEN` 是运行时/dump 值,无法从静态镜像获取。
## 许可证
[WTFPL](LICENSE) — Do What The Fuck You Want To Public License.
## 致谢
- CyberMeowfia 团队 — pipe physrw 提权框架
- 社区设备适配参考
标签:Web报告查看器, 内核漏洞, 安全渗透, 安卓安全, 客户端加密, 提权, 逆向工具