ARTICLE · 1144393
源码零 execve 弹 Shell:AST 语法沙箱底层穿透实录
面向 AI 代码执行、在线判题或多租户插件的系统,第一道甚至唯一防线往往是 AST(抽象语法树)静态沙箱。
安全规则通常密不透风:语法树中一旦出现 execve、system、subprocess 或 dlopen,一律拦截;动态拼接与反射调用也被层层过滤。
许多人据此认为:“源码里连衍生进程的符号都没有,绝不可能弹出 Shell。”
然而现实很残酷:AST 审查的是静态字符,而 CPU 运行的是动态虚拟内存。 只要环境保留了基础的文件读写与内存寻址能力,即便源码干干净净,依然能从 Linux 运行时底层撕开缺口。
一、 核心拆解:借道内核的“隔山打牛”
想在源码不调用任何危险 API 的前提下拿到 Shell,核心在于执行流劫持。整个穿透过程只需三步:
1. 勘测地图:读取 /proc/self/maps
进程虚拟内存空间不是黑盒。Linux 提供了伪文件 /proc/self/maps,通过常规只读文件流打开,就能拿到当前进程的内存映射表。
无需猜测地址随机化(ASLR),直接解析文本即可定位:
libc.so)的加载基址;puts)在内存中的绝对虚拟地址。在 AST 眼中,这仅仅是读取了一个普通文本文件。
2. 破壁强写:被低估的 /proc/self/mem
按常规认知,代码段内存页权限为 r-xp(只读执行)。直接用指针覆写,MMU 会立刻抛出段错误(SIGSEGV);若调用 mprotect 改权限,又会被语法规则阻断。
破局的关键,正是伪设备 /proc/self/mem。
💡 费曼比喻: 展厅玻璃柜贴着“严禁触摸”(只读内存页),你伸手砸柜,警报必响(
SIGSEGV)。 但若绕到大楼内部维修口(/proc/self/mem),向物业主管(内核)申请维护。内核处理该写入请求时会走access_remote_vm流程,打上FOLL_FORCE特权标记。主管默认为调试特需,主动绕开只读限制,借写时复制(CoW)悄悄克隆出私有展柜,把数据强行刷入!
这意味着:无需提权与敏感 API,凭基础的 open、lseek 和 write,就能直接覆写只读代码段。
3. 移花接木:触发变异的普通函数
构造 20 余字节的极简机器码:置寄存器 rax 为 59(触发底层 execve 系统调用),参数指向 "/bin/sh",通过 /proc/self/mem 覆盖掉 puts 函数入口。
随后在源码里正常执行一行:
puts("hello, world");语法分析器只看到人畜无害的打印调用;但指令指针跳入该地址的瞬间,CPU 直接扎入机器码,控制台 Shell 瞬间弹出!
二、 冷思考:别把语法树当安全屏障
在沙箱防御中玩“打地鼠”毫无意义:封了函数封句柄,层层设卡依然漏洞百出。根本症结在于抽象层级错位:
| AST 语法黑名单 | |||
| Seccomp-BPF | |||
| MicroVM / gVisor |
可靠的沙箱防线必须果断下沉到操作系统与虚拟化层:
execve、execveat 与 ptrace。即使机器码劫持成功,一旦触碰未授权调用,内核立即抛出 SIGKILL 终止进程。🧭 按图索骥
https://man7.org/linux/man-pages/man5/proc_pid_mem.5.htmlhttps://lwn.net/Articles/704924/https://man7.org/linux/man-pages/man2/seccomp.2.html💡 核心源码/文档已挂载至文末【阅读原文】,点击可直达。
🐳 鲸推荐
🛠️ jujutsu (jj) 0.46.0
💡 鲸短评:重新思考版本控制的交互范式,其基于变更集与自动提交的工作区模型,让习惯了 Git 的开发者大呼真香。
https://github.com/jj-vcs/jj/releases/tag/v0.46.0
⚡ The Missing Piece in Rust Error Handling
💡 鲸短评:深挖 Rust 在错误链传播与上下文丢失上的现实困境,直击现代工程中易用性与类型严谨性的两难抉择。
https://mcmah309.github.io/posts/the-missing-piece-in-rust-error-handling/
⚡ Shipping JPEG XL in Chrome
💡 鲸短评:数年拉锯后 Chrome 终于迎来 JPEG XL,不仅带来极致无损压缩与 HDR,更为 Web 图像编码划定新标杆。
https://developer.chrome.com/blog/jpeg-xl-in-chrome
💡 Navier-Stokes lost in translation: Why Lean verification of AI autoformalisation does not guarantee correct natural language proofs
💡 鲸短评:大模型真能靠 Lean 证明深奥数学吗?本文犀利拆解形式化中的语义漂移,为过热的 AI 验证潮泼上一盆理性冷水。
https://arxiv.org/abs/2610.08144