| Firmware | `qti/atoll/atoll:12/SKQ1.230401.001/101.000470.45.20:user/release-keys` |
| Kernel | `4.14.190-perf`, built `Mon Nov 4 18:37:23 PST 2024` |
| Kernel Image SHA-256 | `d4f4e0deb20871fce207f1f095ba1934162081c2f10afaccbb2e6a1e938719fb` |
| Release-candidate replay | Pending final clean-boot replay |
Slot `_a`, developer firmware, nearby firmware versions, and other Qualcomm
`atoll` products are rejected. See [compatibility details](docs/COMPATIBILITY.md).
- a user-owned Pin already authorized for ADB;
- a stable USB data connection and external power;
- `adb`, Python 3.10 or newer, `make`, and a C compiler;
- Android NDK `28.2.13676358` (r28c) to build the payload.
This repository does not contain an ADB private key, firmware image, boot
image, bugreport, device log, or prebuilt payload.
Install the pinned NDK with Android's command-line tools:
Confirm that ADB already sees the Pin as `device`:
Clone the repository, then use the same explicit serial for every command:
git clone
`check` is read-only. It prints the detected firmware, kernel, slot, shell
boundary, SELinux state, battery, power source, and NDK revision.
`run` performs one guarded attempt. It asks you to type
`ROOT YOUR_SERIAL`, builds from source, verifies the payload hash after
pushing it, captures a current-boot bugreport to derive KASLR, deletes that raw
bugreport by default, and starts the exploit only after a second complete
`verify` independently asks the boot-scoped root broker to run `id` and
A successful verification looks like this:
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
The exact SELinux context is kernel and firmware specific. The acceptance
condition is UID/GID 0 through the broker with SELinux permissive on the same
1. replaces the exploit process's credential pointers with `init_cred`;
2. clears SELinux enforcing and reloads the current policy;
3. writes a small command client to `/data/local/tmp/su`;
4. starts a Unix-socket broker that accepts only kernel-authenticated UID 0 or
It does not write a partition, unlock the bootloader, install a module, modify
verified boot, create reboot persistence, a network service, or upload
Run a root command from another ADB shell with:
adb -s YOUR_SERIAL shell '/data/local/tmp/su -c id'
The runner permits one attempt per kernel boot. If it reports a miss, timeout,
disconnect, uncertain state, panic, or reboot, do not retry on that boot.
If the Pin is hard-hung and ADB does not respond, disconnect all external
power. The tested retail hardware has no dependable user-accessible forced
restart, so recovery may require waiting for the battery to drain before
After a normal reboot, root is gone. The staged files may remain inert under
`/data/local/tmp`; a clean shell can remove them:
adb -s YOUR_SERIAL shell + 'rm -f /data/local/tmp/ghostlock-aipin.so /data/local/tmp/su + /data/local/tmp/.ghostlock-su.sock + /data/local/tmp/.ghostlock-aipin-attempt'
Read [SAFETY.md](docs/SAFETY.md) before using the PoC and
[TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) before retrying a failed run.
Run records are written to a mode-0700 temporary directory. They contain a
device serial, boot identity, kernel addresses, and exploit telemetry. Never
attach that directory or a raw Android bugreport to an issue.
./ghostlock report /private/tmp/ghostlock-aipin-TIMESTAMP + --output ghostlock-report.json
Review the JSON before sharing it. The redactor omits serials, boot IDs, host
paths, raw command output, and kernel addresses. See [PRIVACY.md](docs/PRIVACY.md).
Run all host tests and two independent builds:
source/build/humane-aipin-45.20/bin/preload.so
Build products are ignored by Git. Release assets should be verified against
the checksums attached to the corresponding GitHub release.
The exploit uses the CVE's dangling stack-resident `rt_mutex_waiter` to
route a controlled red-black-tree update. KernelSnitch first leaks an
`mm_struct` address through futex-hash timing. A same-PFN perf-event gate
then proves that the released order-3 slab page was reclaimed by controlled
socket-buffer data before the corruption trigger can proceed. A boot-bound
KASLR base is derived from at least two agreeing current-boot WARN anchors.
The resulting read/write route resolves the current task and performs the
The target profile contains only the offsets and symbols consumed by this
route. The kernel Image and full symbol table are not distributed.
[TECHNICAL.md](docs/TECHNICAL.md) describes the stages and fail-closed gates.
This is an experimental research release for an unsupported consumer device.
It is not a general Android rooting tool and is not affiliated with Humane,
The code is licensed under Apache-2.0. The implementation starts from
NebuSec's Apache-2.0 CyberMeowfia work; the AI Pin port and release tooling are
documented in [PROVENANCE.md](docs/PROVENANCE.md) and
[THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
Please read [SECURITY.md](SECURITY.md) before reporting a vulnerability or
The full story
This article is one source in a clustered incident — the cluster page carries the summary, timeline and every other outlet covering it.
