AtlasVector/Dirty-Frag-CVE-2026-43284
GitHub: AtlasVector/Dirty-Frag-CVE-2026-43284
针对 DirtyFrag Linux 内核提权漏洞的安全检测实验,包含完整漏洞利用链复现、检测盲区识别及修正后的 Elastic Stack EQL 检测规则。
Stars: 0 | Forks: 0
# DirtyFrag (CVE-2026-43284) - 实验检测练习报告
**分类:** 内部实验室 - CyberLAB
**日期:** 2026年5月24日
**平台:** Elastic Stack v9.4.1
**状态:** 已确认检测
## 目录
- [A - 执行摘要](#a---executive-summary)
- [B - 完整调查结果报告](#b---full-findings-report)
- [1. 目标与威胁模型](#1-objective-and-threat-model)
- [2. 漏洞背景](#2-vulnerability-background)
- [3. 实验环境](#3-lab-environment)
- [4. 阶段 1 - 执行前设置](#4-phase-1---pre-execution-setup)
- [5. 阶段 2 - 漏洞利用执行](#5-phase-2---exploit-execution)
- [6. 阶段 3 - 后渗透活动](#6-phase-3---post-exploitation-activity)
- [7. 阶段 4 - 检测工程](#7-phase-4---detection-engineering)
- [8. 检测参考](#8-detection-reference)
- [9. 关键发现总结](#9-key-findings-summary)
- [10. 参考文献](#10-references)
## A - 执行摘要
### 测试内容
一次受控的漏洞利用练习,模拟了在获取初始访问权限后的攻击者使用 ***DirtyFrag (CVE-2026-43284)***(一个 Linux 内核提权漏洞)进行攻击的过程。模拟的攻击者场景为:通过钓鱼凭证获取的低权限用户(`saskia`, uid=1001)试图在内部 Linux 主机上提权至 root。该实验室使用了一台与生产网络隔离的、故意留有漏洞的 Ubuntu 机器(`ubuntu-vuln`,内核 `6.0.0-22-generic`)。
### 结果:漏洞利用成功 - 已确认检测
攻击者在实验室环境中获得了完全的 root 访问权限(`uid=0`)。Elastic Security 检测堆栈生成了 **3 个高严重性告警**(风险评分 73),正确识别了漏洞利用链。然而,检测需要进行手动调优 —— 开箱即用的配置存在漏洞,原本会导致漏报。
### 风险声明
| 项目 | 详情 |
| ---- | ------ |
| **漏洞** | DirtyFrag - CVE-2026-43284 (xfrm-ESP 路径), CVE-2026-43500 (RxRPC 路径) |
| **CVSS 影响** | 完全本地提权至 root |
| **受影响内核** | Linux 内核 >= 2017年1月(长达9年的生命周期) |
| **受影响发行版** | Ubuntu 24.04.4, RHEL 10.1, AlmaLinux 10, openSUSE, CentOS Stream 10, Fedora 44 |
| **文件完整性绕过** | 磁盘上的文件未被修改 - AIDE, Tripwire, hash 监控均报告为正常 |
| **公开 PoC** | 可用(GitHub 上的 V4bel/dirtyfrag) |
| **提权至 root 时间** | 从低权限立足点起 < 10 分钟 |
### 关键发现
1. **默认的 `auditd` 规则未产生任何证据。** 如果没有为 `socket`、`splice` 和 `unshare` 配置明确的 syscall 规则,漏洞利用将静默运行 —— 没有日志,没有告警。默认的 Elastic Agent 部署不会自动添加这些规则。
2. **检测需要规则调优。** 已发布的 Elastic Security Labs 检测逻辑使用 `process.parent.pid` 作为关联键。在实践中,**DirtyFrag** 会 fork 中间进程,从而破坏了这种关联性。在本次练习中,我们识别并实现了通过 `auditd.session` 进行关联的修复方案。
3. **后渗透行动非常广泛。** 获得 root 权限后,攻击者读取了 `/etc/shadow`,访问了 SSH authorized keys,写入了持久化标记(`/root/pwned.txt`),并通过 `nc` 发起了网络侦察。所有这些都在初始访问后的 30 分钟内发生。
### 建议
| 优先级 | 行动 |
| -------- | ------ |
| **立即执行** | 将所有主机上的 Linux 内核修补至已修复版本。应用 Ubuntu, RHEL, AlmaLinux, openSUSE, CentOS, Fedora 的供应商安全公告。 |
| **短期** | 在由 Elastic Agent 监控的所有 Linux 主机上,为 `socket`、`splice` 和 `unshare` 部署明确的 auditd syscall 规则。 |
| **短期** | 更新 EQL 检测规则,对于命名空间操纵序列,通过 `auditd.session` 而不是 `process.parent.pid` 进行关联。 |
| **持续进行** | 将风险评分 >= 73 的特权提升告警视为高优先级分诊。当前规则在提权发生后的几秒钟内就会触发。 |
## B - 完整调查结果报告
### 1. 目标与威胁模型
**目标:** 验证家庭实验室 SOC 对 DirtyFrag 漏洞利用的检测覆盖率,识别检测漏洞,并根据观察到的攻击者行为制定修正后的检测规则。
**威胁模型:** 模拟获得初始访问权限后的攻击者,其拥有低权限用户账户(`saskia`, uid=1001)的钓鱼凭证。目标:利用 DirtyFrag 通过 `xfrm-ESP` 接收路径提权至 root。实验室执行通过 Proxmox 控制台进行 —— 在功能上等同于 SSH 后访问。
考虑了两个攻击者能力层级:
- **标准版(吵闹):** 在没有任何规避的情况下运行漏洞利用
- **规避版(安静):** 减少噪声,刻意进行清理
本次练习涵盖了标准层级。
### 2. 漏洞背景
DirtyFrag 是一系列相关 Linux 内核 bug 中的第三个,它们都滥用了相同的根本原因:
| CVE | 别名 | 引入时间 | 路径 |
| --- | -------- | ---------- | ---- |
| CVE-2022-0847 | Dirty Pipe | - | pipe |
| CVE-2026-31431 | Copy Fail | - | splice |
| CVE-2026-43284 | DirtyFrag | 2017年1月 (commit `cac2661c53f3`) | xfrm-ESP |
| CVE-2026-43500 | DirtyFrag | 2023年6月 (commit `2dc334f1a63a`) | RxRPC |
**根本原因:** IPv4/IPv6 数据报追加路径在 `skb_splice_from_iter()` 将页缓存页面植入 socket buffer (`sk_buff`) 后,未设置 `SKBFL_SHARED_FRAG`。随后 ESP 输入路径对攻击者控制的页缓存页面执行了原位加密,将其视为普通的未克隆非线性 skbs。
**漏洞利用原语:** 向页缓存中进行 4 或 8 字节的受控写入。确定性的 —— 不需要竞态条件。
**漏洞利用链:**
1. 攻击者将目标二进制文件(例如 `/usr/bin/su`)读取到页缓存中
2. 通过 `splice()` 构造一个数据包,使文件的页面位于 `struct sk_buff` 的 `frag[0]` 中
3. 内核将数据包传递给 `xfrm-ESP` 解密路径
4. ESP 执行原位加密 - 源和目的地都指向攻击者的页面
5. 加密将攻击者控制的字节写入页缓存
6. 随后对该文件的所有读取 —— 包括内核的 `execve()` —— 都将返回损坏的字节
**关键的规避特性:** 磁盘上的文件永远不会被修改。文件完整性监控工具(AIDE, Tripwire, hash 检查)均报告目标文件正常。
**确认存在漏洞的发行版:** Ubuntu 24.04.4, RHEL 10.1, AlmaLinux 10, openSUSE Tumbleweed, CentOS Stream 10, Fedora 44。
### 3. 实验环境
| 组件 | 详情 |
| --------- | ------- |
| Fleet Server / ELK 主机 | `ubuntu-tm` / `elk-docker` - `172.66.66.30` (实验室内部) |
| Elastic Stack | v9.4.1 (Elasticsearch, Kibana, Logstash - Docker) |
| 目标(受害者)主机 | `ubuntu-vuln` - `172.66.66.27` |
| 受害者内核 | `6.0.0-22-generic` (存在漏洞) |
| 受害者用户 | `saskia` - uid=1001, groups=1001(saskia),27(sudo),100(users) |
| Elastic Agent | v9.4.1 带 auditbeat |
| 网络 IDS | Suricata 8.0.5 位于专用传感器上 |
| Kibana | `http://172.66.66.30:5601` (实验室内部) |
**练习时的活动遥测数据:**
| 数据集 | 占比 |
| ------- | ----- |
| `suricata.eve` | 75.2% |
| `elastic_agent.fleet_server` | 10.8% |
| `elastic_agent` | 9.1% |
| `elastic_agent.filebeat` | 1.9% |
| `elastic_agent.auditbeat` | 1.4% |
| `auditd_manager.auditd` | 0.5% |
| `system.auth` | 0.2% |
| `system.syslog` | 0.1% |
### 4. 阶段 1 - 执行前设置
#### 4.1 实验室隔离
练习前已隔离实验室网络。防火墙别名 `Cyber_escape_door` 已确认禁用 - 阻止了对其他 VLAN 或互联网的横向访问。

#### 4.2 受害者主机验证
在 `ubuntu-vuln` 上确认了存在漏洞的内核和低权限账户:
```
saskia@ubuntu-vuln:~$ uname -r
6.0.0-22-generic
saskia@ubuntu-vuln:~$ whoami
saskia
saskia@ubuntu-vuln:~$ id
uid=1001(saskia) gid=1001(saskia) groups=1001(saskia),27(sudo),100(users)
```

#### 4.3 堆栈健康检查
**Suricata:运行并正在捕获 (systemctl status)**

**Kibana/Elasticsearch:绿色/健康 (API 检查)**

**在任何更改之前已拍摄 VM 快照**



#### 4.4 网络捕获
在 Suricata 主机上启动了 tcpdump(`emp6s19`,快照长度 262144 字节),以全量捕获 `172.66.66.27` 的流量。


### 5. 阶段 2 - 漏洞利用执行
#### 5.1 准备
来自 V4bel/dirtyfrag PoC 的漏洞利用源码 (`exp.c`) 已在受害者主机上就绪。
```
ubuntu-vuln@ubuntu-vuln:~/dirtyfrag$ ls
exp exp.c README.md
ubuntu-vuln@ubuntu-vuln:~/dirtyfrag$ cp exp.c /tmp/exp/
```
右侧终端显示了用户 `saskia` 可见的暂存副本。

#### 5.2 编译
通过 `sudo gcc` 以 root 身份编译(用户 `saskia` 在 sudoers 中):
```
saskia@ubuntu-vuln:~$ sudo gcc -o /tmp/exp/clean_frag /tmp/exp/exp.c
saskia@ubuntu-vuln:~$ ls -la /tmp/exp/
-rwxr-xr-x 1 root root 62320 May 24 12:18 clean_frag
-rw-rw-r-- 1 ubuntu-vuln ubuntu-vuln 67803 May 24 12:13 exp.c
saskia@ubuntu-vuln:~$ id
uid=1001(saskia) gid=1001(saskia) groups=1001(saskia),27(sudo),100(users)
```
二进制文件:ELF 64-bit LSB executable, x86-64, dynamically linked。

#### 5.3 执行 - 获得 Root 权限
以 `saskia` (uid=1001) 身份执行漏洞利用。该进程(`clean_frag`, pid=4326)打开了 `AF_RXRPC` 和 `AF_ALG` socket,随后调用 `splice()` 将页缓存页面植入网络缓冲区。ESP 路径上的原位加密将攻击者控制的字节写入了页缓存。一个子进程 (pid=4327) 调用了带有 `a0=50000000` (CLONE_NEWUSER | CLONE_NEWNET) 的 `unshare`,以获取命名空间范围内的能力。
```
saskia@ubuntu-vuln:~$ /tmp/exp/clean_frag
...
root@ubuntu-vuln:~# id
uid=0(root) gid=0(root) groups=0(root)
root@ubuntu-vuln:~# ls
```
**2026年5月24日 中欧夏令时间 12:22(UTC 10:22)** 获得了完整的 root shell。
**捕获的 Auditd syscall 序列 (UTC):**
| 时间戳 (UTC) | Syscall | 参数 | 进程 | 用户 |
| --------------- | ------- | -------- | ------------- | ---- |
| 10:21:11.054 | `unshare` | `a0=50000000` | clean_frag (4327) | saskia (1001) |
| 10:21:11.055 | `socket` | `a0=21` (AF_RXRPC) | clean_frag (4326) | saskia (1001) |
| 10:21:17.403 | `socket` | `a0=26` (AF_ALG) | clean_frag (4326) | saskia (1001) |
| 10:21:17.419 | `splice` | `a0=4` | clean_frag (4326) | saskia (1001) |
| 10:21:17.419 | `splice` | `a0=7` | clean_frag (4326) | saskia (1001) |
所有事件共享 `auditd.session=2`。

### 6. 阶段 3 - 后渗透活动
从大约 12:22 CEST 开始,所有操作均以 `root` 身份在 `ubuntu-vuln` 上执行。
#### 6.1 持久化标记
```
root@ubuntu-vuln:~# echo "Dirty Frag PoC executed at $(date)" > /root/pwned.txt
root@ubuntu-vuln:~# cat /root/pwned.txt
Dirty Frag PoC executed at Sun May 24 12:28:05 PM CEST 2026
```

#### 6.2 凭据访问
```
root@ubuntu-vuln:~# cat /etc/shadow | head -2
root:*:19823:0:99999:7:::
daemon:*:19823:0:99999:7:::
root@ubuntu-vuln:~# cat /home/ubuntu-vuln/.ssh/authorized_keys
ssh-ed25519 AAAA[...]
```
访问了 Shadow 文件和 SSH authorized keys。在实际的入侵中,这使得离线密码破解和持久的 SSH 后门访问成为可能。

#### 6.3 网络侦察
```
root@ubuntu-vuln:~# nc -vz 172.66.66.1 100-8000
```
12:51 CEST 时,从 root 上下文对实验室网关(`172.66.66.1`,端口 100-8000)执行了端口扫描。这展示了从提权后的会话进行横向移动和网络映射的能力。

#### 6.4 Suricata 网络可见性
Suricata 在整个练习窗口期间捕获了与 `172.66.66.27` 相关的 **105 个事件**(88 个 mdns,17 个 flow)。在截取屏幕截图时(大约在 12:53 CEST 的 nc 扫描期间),仪表板中显示了 29 个事件。
DirtyFrag 漏洞利用本身是内核内部的,不会产生网络特征 —— 提权原语在网络线缆上不会产生异常流量。引入 Suricata 是为了收集后渗透流量和枚举尝试的 pcap,而不是为了检测漏洞利用本身。
| 事件类型 | 计数 |
| ---------- | ----- |
| mdns | 88 |
| flow | 17 |
| **总计** | **105** |
flow 事件集中在 nc 端口扫描窗口期间(10:50-11:10 UTC / 12:50-13:10 CEST)。

### 7. 阶段 4 - 检测工程
#### 7.1 部署的检测规则
根据 Elastic Security Labs 的文章,在 Kibana Detection Engine 中创建了两条 EQL 序列规则。
**规则 1 - 带有 Splice 并随后执行操作的 AF_RXRPC 或 AF_ALG Socket**(未触发 - 见下文缺陷)
```
sequence with maxspan=60s
[any where host.os.type == "linux" and
(
(event.category == "process" and auditd.data.syscall == "socket"
and auditd.data.a0 in ("26", "21")) or
(event.category == "process" and auditd.data.syscall == "splice") or
(event.category == "network" and event.action == "bound-socket"
and data_stream.dataset == "auditd_manager.auditd"
and auditd.data.socket.family == "38")
)
and user.id != "0"] by process.pid, host.id, user.id with runs=10
[process where host.os.type == "linux" and event.action == "executed" and
(
(user.effective.id == "0" and user.id != "0") or
(process.name in ("bash", "sh", "zsh", "dash", "fish", "ksh", "busybox")
and process.args in ("-c", "--command", "-ic", "-ci", "-cl", "-lc",
"-bash", "-sh", "-zsh", "-dash", "-fish", "-ksh"))
)] by process.parent.pid, host.id, user.id
```
**规则 2 - 命名空间操纵随后提权**(修复后触发)
```
sequence by host.id, auditd.session with maxspan=30s
[process where host.os.type == "linux"
and auditd.data.syscall == "unshare"
and auditd.data.a0 in ("10000000", "50000000", "70000000",
"10020000", "50020000", "70020000")
and user.id != "0" and user.id != null]
[process where host.os.type == "linux"
and user.id == "0" and user.id != null
and (process.name in ("bash", "sh", "zsh", "dash", "fish",
"ksh", "su", "sudo", "pkexec", "busybox", "mksh")
or process.name like ("python*", "perl*", "ruby*", "php*", "lua*"))]
```
#### 7.2 初始检测缺陷 - 缺失的 Syscall 覆盖范围
规则 1 返回了零结果。`ubuntu-vuln` 上的默认 auditd 配置仅捕获了:`write`, `bpf`, `openat`, `unshare`。
缺失:`socket`, `splice`, `bind` —— 核心的漏洞利用原语。
**补救措施:** 添加到 `/etc/audit/rules.d/dirtyfrag.rules`:
```
-a always,exit -F arch=b64 -S socket -k socket_syscall
-a always,exit -F arch=b32 -S socketcall -k socket_syscall
-a always,exit -F arch=b64 -S splice -k splice-syscall
-a always,exit -F arch=b32 -S splice -k splice-syscall
-a always,exit -F arch=b64 -S unshare -k unshare-syscall
-a always,exit -F arch=b32 -S unshare -k unshare-syscall
```
漏洞利用运行后的几秒钟内,272 个新的 auditd 事件落入了 Elasticsearch 中。
#### 7.3 EQL 关联缺陷 - 进程树碎片化
尽管捕获了事件,规则 2 还是返回了 0 个匹配项。
**根本原因 - 实际的进程树(来自 Elasticsearch):**
| 进程 | PID | PPID | UID | auditd.session |
| ------- | --- | ---- | --- | -------------- |
| shell (saskia) | 4182 | - | 1001 | 2 |
| `clean_frag` (主) | 4326 | 4182 | 1001 | 2 |
| `clean_frag` (unshare 子进程) | 4327 | 4326 | 1001 | 2 |
| `bash` (root) | - | 4451 | 0 | 2 |
原始规则通过 `process.parent.pid` 进行关联。`unshare` 事件的 `ppid=4326`,但 root shell 具有不同的父进程 —— DirtyFrag fork 了中间进程,破坏了关联性。
**修复:** 通过 `auditd.session` 进行关联。漏洞利用链中的所有事件都共享 `session=2`,无论 fork 深度如何,都能正确链接序列。
#### 7.4 告警结果
**3 个高严重性告警**,风险评分 73,位于 Kibana Security - Alerts 中,时间戳为 `2026-05-24T10:25:57Z` UTC (12:25:57 CEST)。
| 告警 | 时间戳 (UTC) | 信号 |
| ----- | --------------- | ------ |
| 序列匹配 - unshare 事件 | 10:25:57.869 | process=clean_frag, user=saskia (uid=1001) |
| 序列匹配 - root shell | 10:25:57.881 | process=bash, user=root (uid=0) |
| 复合序列告警 | 10:25:57.893 | host=ubuntu-vuln |
- 规则:`DirtyFrag - Namespace Manipulation Followed by Privilege Escalation`
- 严重性:High
- 风险评分:73
- 主机:`ubuntu-vuln`


### 8. 检测参考
#### MITRE ATT&CK 映射
| 战术 | 技术 | ID |
| ------ | --------- | -- |
| 权限提升 | Exploitation for Privilege Escalation | T1068 |
| 权限提升 | Escape to Host | T1611 |
| 凭据访问 | OS Credential Dumping: /etc/passwd and /etc/shadow | T1003.008 |
| 发现 | Network Service Discovery | T1046 |
#### 关键 Syscall 值
| Syscall | 参数 | 含义 |
| ------- | -------- | ------- |
| `unshare` | `a0=50000000` | CLONE_NEWUSER \| CLONE_NEWNET |
| `socket` | `a0=26` | AF_ALG (内核加密子系统) |
| `socket` | `a0=21` | AF_RXRPC (RxRPC 路径) |
| `bind` | `socket.family=38` | AF_ALG bind |
| `splice` | - | 向网络缓冲区注入页面 |
#### KQL 参考查询
**所有与 dirtyfrag 相关的 auditd 事件:**
```
data_stream.dataset: "auditd_manager.auditd" and auditd.summary.how: *dirtyfrag*
```
**非 root 用户的命名空间操纵:**
```
data_stream.dataset: "auditd_manager.auditd" and auditd.data.syscall: "unshare" and auditd.data.a0: "50000000"
```
**同一会话中提权后的 root 活动:**
```
data_stream.dataset: "auditd_manager.auditd" and user.id: "0" and auditd.session: "2"
```
**漏洞利用窗口期间的所有 auditd 事件:**
```
data_stream.dataset: "auditd_manager.auditd" and @timestamp >= "2026-05-24T10:20:00Z" and @timestamp <= "2026-05-24T10:30:00Z"
```
**来自漏洞利用进程的 Socket 和 splice syscall:**
```
data_stream.dataset: "auditd_manager.auditd" and auditd.summary.how: "/tmp/exp/clean_frag"
```
### 9. 关键发现总结
| # | 发现 | 严重性 | 是否已补救 |
| - | ------- | -------- | ---------- |
| 1 | 默认的 auditd 规则漏掉了 `socket`, `splice`, `unshare` - 没有明确的规则就没有证据 | 严重 | 是 - 自定义规则已部署到 `/etc/audit/rules.d/dirtyfrag.rules` |
| 2 | 对 fork 的漏洞利用链使用 `process.parent.pid` 进行 EQL 关联失败 | 高 | 是 - 更改为 `auditd.session` |
| 3 | 文件完整性监控对 DirtyFrag 视而不见 - 磁盘文件始终未更改 | 高 | 范围内无补救措施 - 修补内核即为修复方案 |
| 4 | 后渗透:在任何告警驱动的响应之前,shadow 文件、SSH keys 和网络侦察均已以 root 身份执行 | 高 | 通过 auditd 日志检测到;凭据访问或侦察阶段没有专门的规则触发 |
### 10. 参考文献
- Elastic Security Labs:[Copy Fail and DirtyFrag: Linux Page Bugs in the Wild](https://www.elastic.co/security-labs/copy-fail-dirtyfrag-linux-page-bugs-in-the-wild)
- 公开 PoC:[GitHub 上的 V4bel/dirtyfrag](https://github.com/V4bel/dirtyfrag)
- MITRE ATT&CK:[T1068 - Exploitation for Privilege Escalation](https://attack.mitre.org/techniques/T1068/)
- MITRE ATT&CK:[TA0004 - Privilege Escalation](https://attack.mitre.org/tactics/TA0004/)
- MITRE ATT&CK:[T1003.008 - /etc/passwd and /etc/shadow](https://attack.mitre.org/techniques/T1003/008/)
标签:Elastic Stack, Linux内核, Metaprompt, MIT许可证, Web报告查看器, 协议分析, 安全靶场, 权限提升, 流量重放, 漏洞复现, 越狱测试