Skip to content
KitploitKITPLOIT
工具博客
Log in
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
DIRTYFAIL — 针对Linux页缓存写入漏洞的检测器+概念验证代码:Copy Fail(CVE-2026-31431)和Dirty Frag(CVE-2026-43284/43500)。仅限授权的安全研究。 | Kitploit
工具/GitHubGitHub/karazajac/dirtyfail
权限提升漏洞分析漏洞利用渗透测试论文与研究学习与教育红队容器逃逸二进制利用实验室与实践
GitHubkarazajac/dirtyfail

DIRTYFAIL

2612184个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

针对Linux页缓存写入漏洞的检测器+概念验证代码:Copy Fail(CVE-2026-31431)和Dirty Frag(CVE-2026-43284/43500)。仅限授权的安全研究。

查看仓库

DIRTYFAIL

针对 Copy Fail 和 Dirty Frag Linux 页缓存写入漏洞家族的 统一检测器与 PoC 框架。``` ██████╗ ██╗██████╗ ████████╗██╗ ██╗███████╗ █████╗ ██╗██╗ ██╔══██╗██║██╔══██╗╚══██╔══╝╚██╗ ██╔╝██╔════╝██╔══██╗██║██║ ██║ ██║██║██████╔╝ ██║ ╚████╔╝ █████╗ ███████║██║██║ ██║ ██║██║██╔══██╗ ██║ ╚██╔╝ ██╔══╝ ██╔══██║██║██║ ██████╔╝██║██║ ██║ ██║ ██║ ██║ ██║ ██║██║███████╗ ╚═════╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝

DIRTYFAIL 是一个小巧、文档齐全的 C 语言工具,供安全研究人员使用。它检测 Linux 主机是否易受此家族中的三个 CVE 影响,并在获得明确、键入的确认后,运行一个真实的概念验证,将调用者置于易受攻击系统上的 root shell 中。

| CVE / 变种 | 名称 | DIRTYFAIL 覆盖 |
|---|---|---|
| **CVE-2026-31431** | Copy Fail (algif_aead authencesn page-cache write) | 检测 + 完整 PoC |
| **CVE-2026-43284 v4** | Dirty Frag — IPv4 xfrm-ESP page-cache write          | 检测 + 完整 PoC |
| **CVE-2026-43284 v6** | Dirty Frag — IPv6 xfrm-ESP page-cache write (`esp6`) | 检测 + 完整 PoC |
| **CVE-2026-43500**    | Dirty Frag — RxRPC page-cache write                  | 检测 + 完整 PoC |
| Copy Fail GCM 变种 | xfrm-ESP `rfc4106(gcm(aes))` page-cache write        | 检测 + 完整 PoC |

**额外模式:**

- **`--scan --active`** — 哨兵-STORE 主动探测。默认的 `--scan` 报告每个 CVE 的前提条件(内核、模块、LSM 状态)以及 Copy Fail 原语的主动探测。添加 `--active` 会将哨兵文件 STORE 探测扩展到所有其他四个原语(ESP v4、ESP v6、RxRPC、GCM):每个都针对 `/tmp` 中的哨兵触发内核触发器,并且仅在标记字节实际落地时报告易受攻击。这是在不运行完整漏洞利用的情况下区分反向移植补丁内核(前提条件显示易受影响但探测显示完好)与未补丁内核的唯一方法。绝不接触 `/etc/passwd`。根据内核构建自动校准 V6 STORE 移位。
- **`--exploit-backdoor`** — 持久的 uid-0 后门:长度匹配覆盖 `/etc/passwd` 中的 `nologin`/`false`/`sync` 行,替换为 `dirtyfail::0:0:<pad>:/:/bin/bash`。在页面被逐出之前,即使 shell 退出后仍然存在。状态存储在 `/var/tmp/.dirtyfail.state` 中,供 `--cleanup-backdoor` 使用。`dirtyfail` 用户名故意与此项目匹配,以便在任何审计中立即识别 — 如果你需要为授权的红队行动使用不同的标识符,请更改 `src/backdoor.c` 中的 `NEW_USER`。
- **AppArmor 绕过** — 通过单跳 `change_onexec("crun")` 重新执行到保留用户命名空间能力的无限制配置文件,击败 Ubuntu 的 `apparmor_restrict_unprivileged_userns=1` 策略。每个漏洞利用模式通过 fork 内部处理此问题:父进程留在初始命名空间中,子进程执行绕过操作,父进程读取全局页面缓存并运行 `su` 以获得真正的初始命名空间 root。遗留的 `--aa-bypass` 标志仍然存在,用于隔离调试绕过机制。参见 [§8.5 架构](#85-architecture-outerinner-fork-based-bypass)。

## 已验证可工作于

DIRTYFAIL 已在多个发行版和内核版本上进行了**端到端经验验证**。下面的矩阵显示了针对每个发行版的全新安装运行每个 `--exploit-*` 模式后的每模式测试结果。

| 发行版 | 内核 | LSM | Copy Fail | xfrm-ESP v4 | xfrm-ESP v6 | RxRPC | GCM | 后门 | SU shellcode |
|---|---|---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| Ubuntu 24.04 LTS | `6.8.0-111-generic` | AppArmor | 🛡²  | ✅ | ✅ | ✅ | ✅¹ | ✅¹ | (未测试) |
| Debian 13.4 | `6.12.86+deb13` | 无 | 🛡 | 🛡 | 🛡 | 🛡 | 🛡 | 🛡 | 🛡⁵ |
| AlmaLinux 10.1 | `6.12.0-124.8.1.el10_1` | SELinux | ✅ | ✅ | ✅ | ⏭³ | ✅ | ✅ | ✅ |
| Fedora 44 (Server) | `6.19.10-300.fc44` | SELinux | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Ubuntu 26.04 LTS | `7.0.0-15-generic` | AppArmor (强化) | 🛡 | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁵ |

**图例:** ✅ 漏洞利用成功落地并产生真正的初始命名空间 root  · 🛡 已缓解 — 漏洞利用无法触及内核漏洞(内核已修补或 LSM 阻止非特权路径)  · ⏭ 不适用(前提条件缺失)

### 主动探测验证 (`--scan --active`)

`--active` 标志在检测期间为每个 CVE 添加了一个哨兵文件 STORE 探测。我们针对上述相同的 4 个发行版(Debian、Fedora、AlmaLinux、Ubuntu 26.04)验证了探测输出 — 下面的矩阵显示了每模式探测结果,并与完整漏洞利用的地面实况一一匹配:

| 发行版 | Copy Fail 探测 | ESP v4 探测 | ESP v6 探测 | RxRPC 探测 | GCM 探测 |
|---|:-:|:-:|:-:|:-:|:-:|
| Debian 13.4 | 完好 🛡 | 完好 🛡 | 完好 🛡 | 完好 🛡 | 完好 🛡 |
| Fedora 44   | marker @0 ✅ | STORE @0 ✅ | STORE @8 ✅ | byte change ✅ | sentinel[0] 0x41→0x27 ✅ |
| AlmaLinux 10.1 | marker @0 ✅ | STORE @0 ✅ | STORE @8 ✅ | preconds ⏭ | sentinel changed ✅ |
| Ubuntu 26.04 | 完好 🛡 | LSM 阻断 🛡 | LSM 阻断 🛡 | LSM 阻断 🛡 | LSM 阻断 🛡 |

V6 探测的 STORE 落地偏移(Fedora 和 Alma 上为 8)与 `calibrate_v6_shift()` 在运行时发现的实验性 `V6_STORE_SHIFT` 匹配 — 这确认了自动校准正确地取代了先前硬编码的常量,且适用于不同的内核构建。

¹ GCM 和后门需要 `algif_aead` 可加载。Ubuntu 24.04 附带了 `/etc/modprobe.d/disable-algif_aead.conf` 黑名单以将其作为 Copy Fail 缓解措施。移除此黑名单后(例如在内核版本早于该缓解措施时),两种模式均可端到端工作。

² Copy Fail 的 algif_aead 路径已通过 modprobe 黑名单缓解;底层内核中的 CVE 原语与 `authencesn` 是否可达相同。xfrm-ESP、RxRPC 和 GCM 变种均在同一内核上落地,因为它们不经过 algif_aead。

³ AlmaLinux 10 的最小安装默认不安装 `kernel-modules-extra` 包,因此磁盘上缺少 `rxrpc.ko`。从 EPEL 或 AlmaLinux extras 仓库安装 `kernel-modules-extra-$(uname -r)` 可恢复该模块;在标准最小安装上,RxRPC 不可达。

⁴ **Ubuntu 26.04 LTS 全面阻止非特权利用。** 其附带的 `7.0.0-15.15` 内核(发布于 2026-04-22)比主线补丁 `f4c50a4034e6`(于 2026-05-07 合并)**早约 2 周** — 因此漏洞**仍在**内核中。Ubuntu 的防御是**通过 AppArmor 强化的纵深防御**,而非内核补丁:

- `apparmor_restrict_unprivileged_userns=1` 默认启用。
- 在 `unshare(CLONE_NEWUSER)` 上,内核级的 AppArmor 强制将任何配置文件(包括标记为 `(unconfined)` 的配置文件,如 `crun`、`chrome`、默认 `unconfined`)自动转换为具有 `audit deny capability` 的 `<profile>//&unprivileged_userns (mixed)` 子配置文件。新用户命名空间内的 uid 0 不会获得任何能力。
- `change_onexec` 切换到不同配置文件无济于事 — 即使 `crun` 配置文件(具有显式的 `userns,` 权限和 `flags=(unconfined)`)也会在 unshare 时自动转换。通过 `aa-exec -p crun bash -c 'unshare -U -n cat /proc/self/attr/current'` 验证 → `crun//&unprivileged_userns (mixed)`。
- `newuidmap`/`newgidmap`(setuid root)成功写入 uid_map,但 `setresuid(0)` 随后成功,而 `ioctl(SIOCSIFFLAGS)` 及所有其他 CAP_NET_ADMIN 门控系统调用返回 EPERM,因为能力拒绝是按命名空间而非按 uid 进行的。

DIRTYFAIL 二进制文件正确装备了绕过并到达阶段 2,但无法在新的用户命名空间内获取 CAP_NET_ADMIN。无论采用何种绕过技术,漏洞利用基础设施均被 LSM 层阻止。我们测试了 `change_onexec(crun)`、`change_onexec(chrome)`、`aa-exec -p <profile>` 以及直接 `unshare(USER|NET) + newuidmap` — 均产生相同的 `unprivileged_userns` 子配置文件。

**这是 Canonical 出色的安全工作。** 该漏洞类已针对非特权用户得到缓解,无需重新构建内核。后续的稳定更新可能还会带来内核补丁本身,从而完成防御。

⁵ **`--exploit-su` shellcode 注入**依赖于相同的 Copy Fail algif_aead 4 字节原语(`cf_4byte_write`)。在内核上 Copy Fail 已修补(Debian 13.4)或 LSM 阻止(Ubuntu 26.04 — 但 algif_aead 路径在 7.0.0-15 中也已修补)时,植入会运行但验证步骤失败(“页面缓存与植入的 shellcode 不匹配”),自动恢复会还原 `/usr/bin/su`。在 AlmaLinux 10.1(入口点文件偏移 `0x45b0`)和 Fedora 44(偏移 `0x1b60`)上进行了端到端测试;ELF 解析器独立处理每个发行版的 PIE 基址。Fedora 44 上的真实 root 证据:`uid=0(root) gid=0(root) ... context=unconfined_u:unconfined_r:unconfined_t`。

测试可重现性:

- 我们从干净的 ISO 重新安装了每个发行版,设置了 SSH 密钥认证 + NOPASSWD sudo,在每个发行版上克隆并构建了 DIRTYFAIL,拍摄了 `clean-build` Parallels 快照,然后以 `--no-shell`(通过 fadvise + drop_caches 自动还原)运行了所有 5 种漏洞利用模式。
- 经验结果行源自解析实际的 `--exploit-*` 输出,寻找成功信号:`page cache now reports <user> with uid 0`、`root password field is now empty`、`is now uid 0`(后门)或任何失败模式(`write did not land`、`byte flip failed`、`setresuid: Invalid`、`add_rxrpc_key: No such device`、`page cache not in expected shape`)。
- 对于 RxRPC 和后门的“真实 root”验证,我们执行了 `echo "" | su - root` / `echo "" | su - dirtyfail`,并确认了 `uid=0(root)` 以及成功读取 `/etc/shadow`。

> **仅限授权测试。** 仅在您拥有或明确受聘评估的系统上使用 DIRTYFAIL。漏洞利用模式会破坏 `/etc/passwd` **在内核页面缓存中**(磁盘上的文件从未被触碰)。清理命令为 `dirtyfail --cleanup` 或 `echo 3 > /proc/sys/vm/drop_caches`。

---

## 目录

1. [漏洞类](#1-the-bug-class)
2. [CVE-2026-31431 — Copy Fail](#2-cve-2026-31431--copy-fail)
3. [CVE-2026-43284 — Dirty Frag (xfrm-ESP)](#3-cve-2026-43284--dirty-frag-xfrm-esp)
4. [CVE-2026-43500 — Dirty Frag (RxRPC)](#4-cve-2026-43500--dirty-frag-rxrpc)
    - [4.5 架构概述](#45-architecture-overview)
5. [构建](#5-build)
6. [使用](#6-usage)
7. [DIRTYFAIL 如何检测每个 CVE](#7-how-dirtyfail-detects-each-cve)
8. [DIRTYFAIL 如何利用每个 CVE](#8-how-dirtyfail-exploits-each-cve)
    - [8.5 架构:基于外部/内部 fork 的绕过](#85-architecture-outerinner-fork-based-bypass)
9. [缓解措施](#9-mitigations)
10. [伦理与披露](#10-ethics--disclosure)
11. [致谢](#11-credits)

**配套文档:**
- [`docs/DEFENDERS.md`](https://github.com/karazajac/dirtyfail/blob/main/docs/DEFENDERS.md) — 系统管理员手册:我是否易受攻击,如何缓解,监控什么。
- [`docs/RESEARCH.md`](https://github.com/karazajac/dirtyfail/blob/main/docs/RESEARCH.md) — 对相邻路径(AH、IPCOMP、MACsec、kTLS 等)进行同一漏洞类的内核源码审计。
- [`tools/dirtyfail-check.sh`](https://github.com/karazajac/dirtyfail/blob/main/tools/dirtyfail-check.sh) — 供系统管理员使用的独立 Bash 检测器(无需编译)。
- [`tools/99-dirtyfail.rules`](https://github.com/karazajac/dirtyfail/blob/main/tools/99-dirtyfail.rules) — 可直接加载的 auditd 规则,用于漏洞利用链。
- [`tools/dirtyfail-container-escape.sh`](https://github.com/karazajac/dirtyfail/blob/main/tools/dirtyfail-container-escape.sh) — 跨命名空间爆炸半径演示。
- [`tools/exploit_su_aarch64.S`](https://github.com/karazajac/dirtyfail/blob/main/tools/exploit_su_aarch64.S) — aarch64 (ARM64) 的 `--exploit-su` shellcode 源码。未经硬件测试;在 `DIRTYFAIL_AARCH64_TRUST_UNTESTED=1` 后门条件下发布。使用 `aarch64-linux-gnu-as` 重新生成 `src/exploit_su.c` 中对应的字节数组以验证。

---

## 1. 漏洞类
下载工具