Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
Tools/GitHubGitHub/addxemmm/cve-2026-98260-pudding-android
Android SecurityPrivilege EscalationMemory ForensicsExploitationPost-ExploitationMobile SecurityBinary Exploitation
GitHubaddxemmm/cve-2026-98260-pudding-android

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-98260-pudding-android

Target-specific Android CVE-2026-98260 research port for Xiaomi 17 (pudding)

View Repository
512 days agoNot yet reviewed

CVE-2026-98260 · Android 17 / pudding Local Privilege Escalation Port

An Android AArch64 exploit chain targeting a precise kernel build of the Xiaomi 17 (codename pudding): starting from an ordinary ADB shell, it sequentially sets SELinux to Permissive, zeroes the UID/GID of the current process, fills in full Linux capabilities, and provides a root service within the current boot cycle.

References and Sources

This project references and ports from CVE-2026-98260-popsicle-android (Xiaomi 17 Pro Max / popsicle), and is not independent research implemented from scratch.

  • Vulnerability discovery, public analysis, and PoC targeting Ubuntu: InfinityCore
  • Full three-stage chain on Android GKI, object layout, and page reuse design: the aforementioned popsicle repository
  • This repository only performs target adaptation for pudding (two link addresses, one inlined probe symbol, scan scale); the rest of the code and ideas belong to the original authors

Vulnerability Overview

A non-main-thread execve() first executes de_thread() to swap thread identities. If exec fails after this point (for example, exec_mmap() is interrupted by SIGKILL and returns -EINTR), the task exits before cleaning up POSIX timers: the k_itimer is freed, but its timerqueue node remains in the tree of a live task. When the parent process later reaps that task, cleanup_timerqueue() operates on this already-freed node again, forming a use-after-free.

The exploit turns this UAF into a constrained eight-byte zero write, then proceeds in three steps: SELinux → UID/GID → full capabilities. For a complete beginner-oriented explanation, see docs/VULNERABILITY.md.

Verified Target and Results

ItemMeasured Value
DeviceXiaomi 17, model 25113PN0EC, codename pudding
SystemXiaomi HyperOS 4 OS4.0.5.0.XPCCNXM, Android 17
Kernel6.12.69-android16-6-g43b5ab7e247d-abogki561813157-4k
Page size4 KiB
Starting pointAuthorized ordinary ADB shell, UID 2000, SELinux Enforcing, bootloader locked
Successful resultUID/GID 0, SELinux Permissive, CapPrm/CapEff/CapBnd=000001ffffffffff
LifecycleThe root service is available to new ADB shells for the remainder of this boot; it must be run again after a reboot

Independent verification after success (newly opened ADB shell):

uid=0(root) gid=0(root)
CapInh: 000001ffffffffff
CapPrm: 000001ffffffffff
CapEff: 000001ffffffffff
CapBnd: 000001ffffffffff
getenforce: Permissive

这不是持久 root。 没有写入 boot/init_boot 或任何分区,bootloader 保持锁定;重启后 SELinux 回到 Enforcing,root 服务消失。

Success Rate

No success rate is promised. In actual testing, a complete A→B→C sequence was achieved once across 9 boots. The pass conditions for the three stages are independent of one another:

StageOn-device programPass condition
1. SELinuxexploit-android-perfgetenforce is Permissive, and the remaining fields of the status word remain as expected
2. Identityexploit-android-perf-chainThe UID/GID of the same process becomes 0, followed by exec of fullcap
3. Full privilegesexploit-android-key-ptr + pc98260_rootd.cFull capabilities, and the root service can be accessed by a new shell

If any step fails to hit, [PARKED] is output and the dangerous state is retained; a reboot is required, and forced retries within the same boot are not allowed.

--aio 16384 is the tuned value for this machine (the successful run hit at the 3903rd perf metadata page).

Differences from the popsicle version

Locationpopsiclepudding
LINK_SELINUX_STATE0xffffffc08289aba00xffffffc0827f9ba0
LINK_GETPID0xffffffc080074eac0xffffffc080102e10
timer address leakalloc_posix_timer returns the probeThis symbol is inlined; instead use the posix_cpu_timer_create entry $arg1
PERF_MAX819216384 (increases the chance of page hits)

For the rationale and evidence, see docs/ADAPTATION.md.

Building from source

An Android NDK is required. The bin/ in the repository is built with NDK 26.3.11579264 / API 34:

powershell -NoProfile -ExecutionPolicy Bypass -File .\build.ps1 -NdkHome "$env:LOCALAPPDATA\Android\Sdk\ndk\26.3.11579264" -ApiLevel 34

-VerifyReference compares the SHA-256 of each new artifact against bin/ one by one; only when using the same toolchain as bin/ will the output be byte-for-byte identical. Switching NDK versions will still run, but the hashes will differ.

Artifacts:

ArtifactInput source
exploit-android-perfsrc/exploit-android-perf.c
exploit-android-perf-chainsrc/exploit-android-perf-chain.c
exploit-android-key-ptrsrc/exploit-android-key-ptr.c + src/pc98260_rootd.c
pc98260-susrc/pc98260_su.c

The build does not connect to a phone and does not write to the device.

Running on an authorized target

Connect a device with USB debugging enabled and authorized, and add platform-tools to PATH:

.\开始98260临时ROOT.bat

Or explicitly specify the device:

powershell -NoProfile -ExecutionPolicy Bypass -File .\run_98260.ps1 -Serial <ADB序列号> -Reboot

The host script verifies the device model, system incremental version, full kernel string, boot ID, and the hashes of the four binaries; it also sets /sys/kernel/tracing/tracing_on to 0 before starting each stage (miuibpf in some HyperOS builds keeps it at 1, which causes the exploit chain to refuse to run). When [PARKED] appears, the script stops and prompts for a reboot.

After success, root can be used as follows:

adb shell -t /data/local/tmp/pc98260-su
adb shell /data/local/tmp/pc98260-su -c "id"

Why It Stops on Failure

The exploit chain requires precisely reclaiming "the page where the target timer resides." If the same target page cannot be observed, or if verification after the pointer write is inconsistent, the program retains the relevant zombie/mapping and stops, avoiding blind reclamation while dangling nodes are still referenced by the kernel. In this case, a fresh phone boot should serve as the boundary for the next attempt.

Repository Boundaries

This repository does not contain: device backups, boot/init_boot images, partition images, payload.bin, kernels/ELFs extracted from firmware, raw runtime logs, ADB serial numbers, or boot IDs. logs/ and build/ are ignored by Git. bin/ contains only the four temporary privilege-escalation chain binaries.

Security Notice

  • After success, SELinux is in Permissive mode, and the root daemon listens on /data/local/tmp/pc98260-root.sock with full capabilities; the entire device is fully exposed for the duration of this boot.
  • Reboot immediately when not in use; do not remain in this state for extended periods.
  • The exploitation process may trigger a kernel crash/reboot; do not operate on a primary device holding important data that has not been backed up.
  • For use only on your own devices and for authorized security research.

Documentation

Download Tool