Use the DFRoot instead. It is the active upstream project with newer fixes and improvements.
DFRoot repository: https://github.com/diabl0w/DFRoot
DirtyFrag Android Root is an Android app and helper module chain based on DirtyFrag (CVE-2026-43284). Tested on iQOO Z9 5G.
It is an independent DFRoot fork and device-port. The core DirtyFrag exploit chain is inherited and credited to DFRoot, LSPromise, DFReroot, and DirtyInit. This project adds a manual standalone flow, manager-neutral ksud loading, KMI/module selection, vendor-target fallbacks, diagnostics, and a redesigned Android interface.
Built with the help of Codex.
The bundled helper modules cover 8 Android KMI/kernel-version combinations
(android12-5.10, android13-5.10, android13-5.15, android14-5.15,
android14-6.1, android15-6.6, android16-6.12, and android17-6.18). That
is a list of module build targets, not eight confirmed devices. A matching
KMI is only an initial compatibility check. Kernel configuration, exported
symbols and symbol versions, SELinux behavior, and the device paths used by
the exploit also matter.
Download the latest APK from the repository's Releases page.
Install a compatible manager before launching the app. The automatic loader
checks the installed manager's ksud in this order: KernelSU, ReSukiSU, then
the system ksud path.
- Install the APK and open DirtyFrag Android Root.
- Review the device profile and detected KMI in Settings.
- Leave automatic
ksudselection on for KernelSU or ReSukiSU, or choose a compatible custom loader. - Tap Launch root and review the run log.
For a device whose vendor library layout differs, open Settings → Advanced
patch #2 targets and enter one existing /vendor/ or /system/vendor/ library path per line. The
app tries the saved paths in order during patch #2. Restore the defaults when
finished testing; changing this list does not change patch #1, build a kernel
module, or prove compatibility.
The target is only a file carrier for the helper module. Its name can differ between vendors and Android releases. You can try the following using an ADB shell:
adb shell 'for d in /vendor/lib64 /vendor/lib /system/vendor/lib64 /system/vendor/lib; do
[ -d "$d" ] && find "$d" -maxdepth 1 -type f -name "*.so" -size +16k 2>/dev/null
done'For a candidate, inspect its size and SELinux label:
adb shell 'ls -lZ /vendor/lib64/example.so; stat -c "%s %n" /vendor/lib64/example.so'Choose a regular library large enough for the selected .ko, normally with a
vendor_file-type label. Avoid libc, the linker, and other critical runtime
libraries. Enter the path under Settings → Advanced patch #2 targets, one
path per line. A shell may still receive permission denied; in that case the
app cannot prove the candidate before rooting, so use the run log and submit
the failing path and log for a device profile.
Patch #1 is a separate stage. It injects splicehelper into
/apex/com.android.runtime/bin/crash_dump64 and depends on that file's ABI,
page-cache behavior, and SELinux transition. Replacing the filename alone is
not enough. A different firmware needs a tested patch profile or a new
backend; changing the patch #2 target list cannot repair a patch #1 failure.
Use the run log to locate the failing stage:
patch #1 failedorpatch #1 verify FAILED: thecrash_dump64page was not modified or cannot be executed on that firmware. Check its SELinux label, APEX/verity state, and page-cache behavior. Vendor-library fallback paths do not fix this stage; the carrier or patch method needs a firmware-specific port.read_vendor ... exit 1/3: the helper ran but could not open the selected vendor file or its pipe was sanitized. Checkls -lZfor the candidate libraries and choose an existingvendor_filecarrier.read_vendor ... signal 6for every candidate: collect logcat and the crash/tombstone entry forcrash_dump64. This usually means the helper was not the code that executed, or the firmware's crash handler aborted before vendor access.libc++: mutex acquired, loading custom modulefollowed by***FAILED***: check logs: patch #1, the vendor carrier, and the trigger worked, but the kernel rejecteddirtyfrag.koor the module did not create its result marker. Check the kernel log withdmesgorlogcatforinvalid module format,module_layout,vermagic,Unknown symbol, orCFI/UBSANerrors. In that case the problem is the.ko, not the vendor library and notksudyet.Unknown symbol register_kprobe,Unknown symbol unregister_kprobe, orno symbol version for module_layout: the bundled helper was built for a different kernel configuration or symbol table. Builddirtyfrag-lkm/dirtyfrag.koagainst the device's exact kernel source, headers, configuration, compiler settings, and architecture. Matching only Android/KMI and5.15or6.1is not sufficient; if the kernel does not expose kprobes, the helper needs a different implementation.***FAILED***: ksud exited with errorafter a module-load marker: the module did initialize, but the staged loader could not find or run a compatible arm64ksud. Select the matching KernelSU/ReSukiSU loader or a compatible custom file.- Patch #2 succeeds but
ksudfails: use a compatible arm64ksudfrom the installed KernelSU/ReSukiSU manager, or select a custom loader in Settings.
The exploit uses crafted ESP traffic and a page-cache write primitive to place
helper code into mapped system files, trigger a privileged hook, and stage the
DirtyFrag helper module. The helper invokes the staged ksud loader. The app
restores its temporary library patches during cleanup.
This project builds on work from:
- DirtyFrag PoC and related code: https://github.com/lsposed/lspromise
- SELinux helper module work: https://github.com/polygraphene/DFReroot
- Unprivileged XFRM socket method: https://github.com/combeng6th/DirtyInit