Sploitus

Exploit for copyfail-rs

kitploit · 2026-08-27

Exploit Code

MARKDOWN82 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-BOOS4721-COPYFAIL-RS
# copyfail-rs

CVE-2026-31431 (Copy Fail) 的 Rust 实现 — 通过 AF_ALG splice 实现的 Linux 内核页面缓存任意写入原语。

English README

## CVE-2026-31431

Linux 内核的 `algif_aead` 实现允许非特权用户通过 `splice()` 系统调用将任意数据写入任何可读文件的页面缓存。`authencesn` AEAD 算法将 `seqno_lo`(用户控制的 AAD 字节 4-7)写入目标 scatterlist 的 `assoclen + cryptlen` 偏移处——当目标通过 `splice()` 链接到页面缓存页时——导致对目标文件的任意 4 字节写入。磁盘内容不变,但所有后续读取者看到的是被篡改的页面缓存数据。

**受影响内核:** Linux < 6.12.23、< 6.13.11、< 6.14.2

## 功能

参数| 描述  
---|---  
`--check`| 安全预检:检查解析后的 `su` 目标并退出  
`--escalate`| 修改页面缓存中的 `/etc/passwd` 移除 root 密码,然后 `su root`  
`--set-password`| 先提权,再从 stdin 读取新 root 密码并通过 `chpasswd` 设置  
`--uid`| 翻转当前用户 UID 为 0,然后 `su <用户名>` 用自己的密码提权  
`--backup <路径>`| 覆盖前备份 `su` 二进制文件  
`--exec <路径>`| 覆盖后以 root 执行指定命令  
  
### 提权模式

**1.`--uid`** — 通过页面缓存写入将当前用户的 UID 字段翻转为 `0000`。修改后 `su <用户名>` 用自己的密码即可获得 root shell。工具会在认证成功后、启动 shell 前尝试清理页面缓存,降低 SSH 持续把该账号识别为 UID 0 的概率。无需修改 root 密码。适用于任何 4 位 UID (1000-9999) 的用户。

**2.`--escalate`** — 通过页面缓存写入修改 `/etc/passwd` 中的 root 行:`root:x:0:0:root:...` → `root::0:0:root :...`。注释字段用空格填充以保持行长度不变。修改后 `su root` 无需密码。

**3.`--set-password`** — 先提权(移除 root 密码),再从 stdin 读取新密码并通过 `chpasswd` 设置。

**4\. 默认模式(无参数)** — 用架构相关的 shellcode 覆盖 `su` 二进制的页面缓存(支持 x86_64、x86、aarch64),然后执行 `su` 获取 root shell。

## 构建

root@kitploit:~
    
    
    cargo build
    cargo build --release
    cargo test
    cargo clippy
    

## 使用

root@kitploit:~
    
    
    ./copyfail-rs --check
    ./copyfail-rs --uid
    ./copyfail-rs --escalate
    printf '%s\n' 'mypassword' | ./copyfail-rs --set-password
    ./copyfail-rs --backup /tmp/su.bak
    ./copyfail-rs --exec /bin/bash
    

## 恢复

页面缓存修改是易失性的——清除缓存可恢复原始磁盘内容:

root@kitploit:~
    
    
    echo 3 > /proc/sys/vm/drop_caches
    

## 验证环境

## 文档

  * 快速开始
  * 漏洞原理
  * 演示
  * 防御与缓解



## 许可

本项目仅用于授权安全测试和教育目的。