Koshmare-Blossom/DirtyDecrypt-go
GitHub: Koshmare-Blossom/DirtyDecrypt-go
CVE-2026-31635 的 Go 语言漏洞利用工具,通过 RxRPC rxgk 解密路径中的 page-cache 覆盖缺陷实现本地提权至 root。
Stars: 0 | Forks: 0
# dirtydecrypt-go
[dirtydecrypt](https://github.com/v12-security/pocs/tree/main/dirtydecrypt)(CVE-2026-31635)的 Go 移植版。属于 [Dirty Frag](https://github.com/V4bel/dirtyfrag) 漏洞类别。
## 工作原理 (简述)
该 bug 位于 `rxgk_decrypt_skb()`(`net/rxrpc/rxgk_common.h`)。该函数在调用 krb5enc AEAD 之前缺少对 `skb_cow_data()` 的调用。AEAD 会在原处解密 skb payload —— 直接写入支持 skb 数据的任何 page 中。如果该 page 是一个 page-cache page(通过 vmsplice + splice 固定在此处),则解密操作会覆盖该文件的 page cache。
**为什么是概率性的**
与 fragnesia(AES-GCM keystream 表)不同,rxgk 在调用设置时协商的 session key 下使用 AES-128-CTS。我们每次触发都会生成一个全新的随机 16 字节 key。写回 `page_cache[i]` 的 AES-CBC 解密数据块的第一个字节是完全随机的:它有 1/256 的概率等于目标字节。
**滑动窗口技术**
在偏移量 `i` 处的每次触发会破坏 16 个字节:`page_cache[i..i+15]`。一旦 `page_cache[i]` 与目标匹配,我们就移动到偏移量 `i+1`。下一次触发会覆盖 `page_cache[i+1..i+16]` —— 在不触及已写入字节 `i` 的情况下,修复偏移量 `i` 处的附带破坏。仅向前进行,无需重访。
每个字节的预期触发次数:约 256 次。最坏情况:每个字节 10000 次。
**触发链**
1. `add_key("rxrpc", ...)` - 安装随机的 AES-128 rxgk session key
2. `AF_RXRPC` 客户端 socket 连接到 loopback 上的伪 UDP 服务器
3. 伪服务器发送一个 CHALLENGE(SecuIdx=6, rxgk)
4. 客户端响应;伪服务器通过 `vmsplice`(网络包头)+ `splice`(偏移量 `i` 处的文件 page)构建一个恶意的 DATA 包
5. `rxgk_decrypt_skb()` 在客户端上运行 —— 进行原处解密,`/usr/bin/su` 的字节 `i` 变为随机值
6. mmap 检查:如果 `page_cache[i] == target[i]`,则前进到 `i+1`
总计 192 个字节。平均触发约 49152 次。一个 SA。无竞态。
## 用法
```
go build -o dirtydecrypt-go .
./dirtydecrypt-go
```
成功后,会通过 PTY 进入一个 root shell。磁盘上的二进制文件保持不变。
### 清理
```
echo 1 | tee /proc/sys/vm/drop_caches
```
## 环境要求
- Linux - 未修补的内核(见下文)
- 无需外部工具 - 纯 Go,单一静态二进制文件
- 内核模块:`rxrpc`(在 `socket(AF_RXRPC, ...)` 时自动加载)
## 受影响的内核
补丁之前的所有内核:https://lore.kernel.org/netdev/
与 dirtyfrag 系列的范围相同。
## 缓解措施
```
rmmod rxrpc
printf 'install rxrpc /bin/false\n' > /etc/modprobe.d/dirtydecrypt.conf
```
## 系列对比
| | dirtyfrag-go | fragnesia-go | **dirtydecrypt-go** |
|---|---|---|---|
| CVE | CVE-2026-43284 / CVE-2026-43500 | CVE-2026-46300 | CVE-2026-31635 |
| 传输方式 | ESP-in-UDP + RxRPC/rxkad | ESP-in-TCP (ULP) | RxRPC/rxgk |
| 写入模型 | 确定性 | 确定性(keystream 表) | 概率性(1/256) |
| 每字节触发次数 | 1 (ESP) / 3 次固定写入 (rxkad) | 1(keystream 查找) | 平均约 256 次 |
| 加密方式 | CBC-AES / HMAC-SHA256 / fcrypt | AES-128-GCM | AES-128-CTS (krb5enc) |
## 参考
- [v12-security/pocs - dirtydecrypt](https://github.com/v12-security/pocs/tree/main/dirtydecrypt) - 原始 C 语言 PoC
- [CVE-2026-31635](https://nvd.nist.gov/vuln/detail/CVE-2026-31635)
## 致谢
- **Aaron Esau / V12 团队** - 漏洞发现及原始 PoC
标签:CVE, EVTX分析, Go语言, Web报告查看器, 内核漏洞, 数字签名, 日志审计, 本地提权, 程序破解, 网络安全, 隐私保护