DirtyFrag:利用 CVE-2026-43284 页面缓存漏洞获取临时 root 权限
DirtyFrag(CVE-2026-43284)
DirtyFrag 是diabl0w/DFRoot 的一个强化版分支 。它利用 CVE-2026-43284(DirtyFrag)漏洞(内核页面缓存写入原语),无需解锁引导加载程序和自定义内核即可加载内核模块。该分支针对三星手机(One UI、RKP 和 KDP 强化),并保留了上游与 SU 管理器无关的设计。
[!important] Important
Root权限是 短暂的 。内核模块su以及所有已加载的模块会在设备重启后立即消失。重启总是会将手机恢复到干净的、未root的状态——如果root操作失败,这也是恢复路径。
安装
- 从Releases 安装 DirtyFrag APK 。
- 安装一个自带
libksud.so的 SU 管理器 :- 三星 – 必需 :
- 打开 DirtyFrag,在 SU 管理器 卡中选择你的管理器,然后按 运行漏洞利用程序 。
[!warning] Warning
自 1.10 版本(上游版本 3.2)起,DirtyFrag 不再打包ksud,而是从所选管理器的自身版本中部署libksud.so。如果管理器没有提供该库,则无法授予您 root 权限。之前建议安装管理器的 CI/Actions 构建版本的做法已不再适用。
DirtyFrag 的全新安装会获得一个新的 Android UID,因此每次重新安装后都必须在管理器中重新授予权限。

特征
- 在应用内选择您的学生管理员
- 自动运行 (开机启动),需在专家模式下启用,并带有失败运行互锁机制,失败后会自动禁用,以防止因运行错误导致无限重启。
- 自动重启 (软重启)——自 1.11 版本(上游 4.1 版本)起,此功能适用于所有 KernelSU 衍生版本:
dfroot.ko在延迟加载后卸载,并soft-reboot运行ksud 自身的重启命令。 - KernelSU 模块 开启/关闭 – 无需 root 权限即可工作,由内核模块在 ksud 启动前应用。
- RO分区保护
- 高级日志功能,一键保存到下载文件夹
- 工具栏中的Odin 图标:图标上的圆点表示此固件是否允许设备进入下载模式,点击该圆点会显示做出此决定的三个依据。
- 当发布新版本时,标题本身会变成一个醒目的 更新 提示——只需轻点一下即可查看版本更新。
- 不需要雫
常问问题
问:日志显示补丁安装失败,但我的设备并不存在漏洞。
A:抱歉,没有解决办法。要么:
- 您的设备内核版本过新。
- 您的设备制造商已将官方缓解措施向后移植。
- 意外缓解 (通常见于内核 6.1)
问:日志显示“SUCCESS”或“ksud exited with error”,但我没有root权限。
答:如果启用了自动运行卡的 自动重启功能 ,请将其关闭——如果管理器无法完成软重启,则已加载的模块将再次卸载。否则,请参阅 上游讨论 69 。
问:我安装了一个模块,现在我无法启动root,总是崩溃。
答:将 KernelSU 模块 卡设置为“禁用”并重新获取 root 权限。此方法无需 root 权限即可工作,这正是关键所在——当某个模块导致系统崩溃时,它是一种应急方案。
问:我启用了模块+自动运行,现在陷入了无限重启循环。
答:Android 通常会检测到启动循环并提供安全模式;否则,请在启动时按住 音量减键 。在安全模式下,关闭自动运行功能并将 KernelSU 模块设置为禁用,或者卸载 DirtyFrag 直到系统稳定。如果无法进入系统深处, adb uninstall df.root 可以使用任何 PC 来启动系统,但前提是系统版本必须没有 root 权限。
问:进度条显示为 0%。
答:那是应用程序的日志标记映射,不是漏洞利用程序。运行窗口为 70 秒——不要重复运行“慢速”运行,守护进程可能仍在运行。
问:如何彻底移除root权限?
答:在取消root权限之前,请使用root权限通过文件管理器删除/data/adb/KernelSU和KSUD残留文件(不是ADB文件夹本身)。
建筑
JAVA_HOME="<Android Studio jbr>" ./gradlew assembleRelease
APK 已写入 app/build/outputs/apk/release/dirtyfrag.apk 。
发布版本使用 签名 app/keystore.jks ,该签名已被.gitignore 忽略(签名配置需要别名 dirtyfrag 和 dirtyfrag 分别对应两个密码)。构建前请自行生成 :
keytool -genkeypair -v -keystore app/keystore.jks -alias dirtyfrag \
-keyalg RSA -keysize 2048 -validity 10000 \
-storepass dirtyfrag -keypass dirtyfrag
八个预编译的内核模块已提交到 ` <up> / <up>/ < app/src/main/jni/ko/ kmi …Build LKMs / <kmi> lkm/dfroot.c df-lkm-<kmi> make
工作原理
Android 内核直接将 AES-CBC ESP 数据包解密到已打开文件的页面缓存中 splice() 。通过构造 IV = AES_ECB_DEC(key, current_content) XOR desired_content ,映射共享库中的任何 16 字节对齐的数据块都可以在没有写入权限和写时复制的情况下被覆盖。
该漏洞利用程序利用此原语将 shellcode 修补到 libc++.so 内核的页面缓存中。下一次对被钩住函数的特权调用会运行该 shellcode,该 shellcode 会通过加载内核模块 insmod 。
漏洞利用链
- IPsec 转换 – 该应用程序分配一个
UdpEncapsulationSocketSPI,并通过 SPI 构建 AES-CBC/HMAC-SHA256 ESP 转换IpSecManager。 - splicehelper -> crash_dump64
crash_dump64– splicehelper使用 CBC 原语 进行拼接。它crash_dump64在crash_dumpSELinux 域中运行,可以打开无法读取vendor_file的带标签文件untrusted_app——这正是我们需要的桥梁。 - dfroot.ko -> vendor_file – 内核模块通过该桥接器写入到
vendor_file带有 – 标签的文件中。 - libc++ hook (在 init 中触发,uid=0,tid=1)- shellcode 已修补
std::ostream::sentry::sentry()。它检查 uid 和 tid,创建/dev/df一个一次性互斥锁,使其无法重新进入,然后insmod在vendor_modprobe域中执行。 - dfroot.ko init – 设置 SELinux 为宽容模式,绕过 DEFEX(如果存在),然后用于
call_usermodehelper运行引导程序。 - bootstrap – 读取应用程序的设备保护设置,采用 zygote 环境,将分区设置为只读,可以选择禁用所有模块,最后从已安装的 SU 管理器启动 SU 守护程序。
鸣谢
- 上游项目和漏洞利用链: https://github.com/diabl0w/DFRoot
- 原始概念验证和各种代码: https://github.com/lsposed/lspromise
- SELinux 宽容内核模块和各种代码: https://github.com/polygraphene/DFReroot
- 非特权 XFRM 套接字方法: https://github.com/combeng6th/DirtyInit