2026 年 3 月 18 日,做沙箱平台的安全研究者 AprilNEA 在自己的 Claude Code Web 会话里,依靠 strace、strings、objdump 这些标准 Linux 工具,找出了 Anthropic 隐藏的应用托管平台 Antspace。全过程不涉及漏洞利用或提权操作,能够实施逆向的基础,仅仅是由于生产环境分发了一个附带完整符号表的 27MB Go 二进制文件。
这场技术解密证实了 AI 编程产品竞争维度的下移。掌握从模型、沙箱到部署协议全栈的厂商,会将用户从提问到应用上线的整条路径锁在自有生态内。Anthropic 组合 Firecracker 快照恢复、自研部署协议以及 Supabase 自动建库,实际上已经铺设完毕这层云端基础设施。
自研 Rust 网关接管 PID 1
底层环境构建在 Firecracker MicroVM 之上。这套虚拟机环境砍掉了常见的系统启动包袱,内部既没有 systemd 初始化系统,也没有 sshd、cron 或者是日志守护进程。dmesg 里的 ACPI 表 OEM ID 显示为 FIRECK,creator ID 是 FCAT,全都是 Firecracker 源码中硬编码的特征值。硬件规格分配了 4 vCPU(Intel Xeon Cascade Lake @2.80GHz)、16GB RAM、252GB 磁盘,搭载 Linux 6.18.5 内核。系统从 guest 中剥离了 vmx/svm 标志,并不支持嵌套虚拟化。
真正在系统里充当 init 进程的,是一个名为 /process_api 的二进制文件,由 Rust 与 tokio 编写。宿主为它准备的 initramfs 只有 3.1MB,里面除了它什么都没有。内核启动命令行携带了 rdinit=/process_api init_on_free=1 参数。strace 跟踪日志表明,PID 1 运行着 epoll 事件循环,负责监听 2024(WebSocket API)和 2025(HTTP 控制 API)端口,并周期性读取 /proc/*/children 监控子进程状态。下层挂载 environment-manager 组件,最外层才是 claude CLI 本体。
在进程管理上,/process_api 会按进程维护 cgroup 并实现孤儿进程收养,将其 reparent 到 PID 1,系统也配备了可配置的 OOM 轮询机制。进程结束的触发原因被精确拆分,覆盖正常退出、信号中断、单进程 OOM、容器级 OOM、超时或是服务端主动关闭等多个维度。CreateProcess 结构体中不仅限制了 uid/gid 1000 和 300 秒运行超时,也由此设定了 1GB 的 memory_limit_bytes 内存上限。
为了支撑安全隔离,系统启动参数加入了 --block-local-connections 禁断本地连接 WebSocket,并强制使用 JWT 校验机制。配置文件中携带的密钥一旦读取完毕,便会被程序立刻擦除。
图:Firecracker microVM 架构图。来源:AprilNEA 博客
七步动作恢复快照环境
这些隔离沙箱并非每次都经历完整的冷启动流程。dmesg 日志暴露出,从虚拟机模板创建到会话恢复之间,相隔了 48.5 小时的空档期。系统初始的 initramfs 仅有 3.1MB,内置单个 /process_api 文件。
文件系统的 mount count 显示这个镜像已经被复用 11 次。恢复阶段,宿主机热插拔挂载三个不同的块设备:vda 挂载 256GiB ext4 作为 Ubuntu 24.04 会话根文件系统;vdb 挂载 63.7MB squashfs 存入 /opt/claude-code;vdc 挂载 12.1MB squashfs 存入 /opt/env-runner。
Snapstart 采用了高度优化的延迟挂载模式。在模板阶段,Firecracker 启动内核和 initramfs 后,/process_api 会先行完成最小化挂载,分配网络 IP 为 192.0.2.2/24、网关 192.0.2.1 以及 MTU 1400,随后向宿主机发送 SNAPSTART_READY 信号。宿主机器进而调用 PUT /snapshot/create 保存系统断点。
当后续会话触发恢复时,宿主机换上对应的块设备后端,调用 PUT /snapshot/load。虚拟机苏醒后,/process_api 必须精准执行七步恢复动作。第一步是丢弃页缓存,避免模板阶段遗留的缓存返回脏数据;紧接着重新挂载 devtmpfs,挂载 ext4 并执行 pivot_root 操作,挂载 squashfs overlay 形成合并视图;随后调用 clock_settime() 修正被冻结的墙上时钟;接着剥夺自身的 CAP_SYS_RESOURCE 权限;全部就绪后才开始接受外部连接。内核日志在此时打印出 random: crng reseeded due to virtual machine fork,阻断了快照分叉导致的随机数可预测风险,而 init_on_free=1 则保障了不同会话间的释放页被清零清洗。
图:会话内 dmesg 输出的 FIRECK ACPI 指纹。来源:AprilNEA 博客
27MB 产物带符号表上线
驱动整个平台调度的核心模块是 /usr/local/bin/environment-runner,大小达到 27MB 的 Go 二进制文件。令人意外的是,它不仅没有经过 strip 处理,还保留了完整的 debug_info 和符号表。作者在此处给出评价:把带完整符号表的产物发到生产是个选择。这一特征导致原本需要使用 Ghidra 耗时反编译的工作,只需 objdump 加 grep 命令便被梳理清楚。
符号表清晰呈现了内部包结构:api 负责会话入口、任务轮询和重试;auth 接管 GitHub App token 校验;config 模块划分了 new、resume、resume-cached 和 setup-only 四种会话模式;envtype 下游分化出 anthropic 与 byoc(Bring Your Own Cloud)两套独立环境。
在 BYOC 模式下,企业可以将 environment-runner 部署在自有基础设施内部,会话状态仍由 Anthropic API 进行统筹。此类环境默认运行 resume-cached 模式,利用 podmonitor 包借助 Kubernetes lease 实现集群内的状态协调。
五项差异切断 Vercel 依赖
对 tunnel/actions/deploy/ 包的分析发现了同时并存的两个客户端:一个是广为人知的 VercelClient,另一个是互联网上未见记录的 AntspaceClient。对 Antspace 的字符搜索,在官方博客、文档、招聘或会议中均返回零结果。
提取的协议串行链重构了 Antspace 的三阶段部署逻辑:首先 POST 请求至 antspaceControlPlaneURL,使用 Bearer token 完成鉴权并传输应用 metadata;其次,使用 multipart/form-data 上传打包好的 dist.tar.gz,若超过体积则会收到 project exceeds %dMB limit 的限制报错;最后,客户端通过 NDJSON 流读取部署进度,状态由 packaging 推进至 deployed。
AntspaceClient 与 VercelClient 之间存在五项核心结构差异。Vercel 采用基于 SHA 去重的逐文件上传策略,而 Antspace 要求开发者在本地虚拟机执行 npm run build,将构建产物打包成单独的 tar.gz 上传;Vercel 在远端服务器拉取代管代码完成构建,Antspace 则仅在云端接收本地完成的构建产物;在状态同步层面,Vercel 依赖轮询机制,Antspace 选用流式 NDJSON;鉴权方案上,Vercel 组合 API token 与 Team ID,Antspace 绑定 Bearer token 与动态控制面 URL;Vercel 提供丰富的公共文档,Antspace 依然作为纯内部协议运作。从零实现整套端到端部署协议,证实这是一项长期的战略资产投入。
图:Antspace 部署协议流程。来源:AprilNEA 博客
Baku 拦截报错阻止会话退出
构成生态底座的最后一块拼图是 Baku,属于用户向 Claude 发送 Web 需求时调用的环境构建器。项目模板绑定了 Vite、React 与 TypeScript,开发服务器进程交由 supervisord 托管管理,日志被强制写入 /tmp/vite-dev.log。
Baku 环境内嵌了 pre-stop hook 校验机制。一旦开发者试图结束会话,钩子程序会扫描是否存在未提交或未推送的 git 变更、检索 Vite 开发日志中的错误输出,或是通过 tsc --noEmit 拦截类型错误。任意一项指标报错,会话都无法退出。草稿存在 .baku/drafts/ 目录下,版本提交作者指向 [email protected],由于未配置 remote 远程仓库,代码暂留本地。
它还深度整合了 6 个 Supabase MCP 自动化工具:provision_database、execute_query、apply_migration、list_migrations、generate_types 和 deploy_function。执行建库后,环境变量例如 SUPABASE_URL、VITE_SUPABASE_ANON_KEY 会被自动写入项目根目录的 .env.local。在 Baku 设定里,默认首选的部署目标为 Antspace,Vercel 仅做降级备用。
未 strip 的二进制结合 VM 内的 root 权限促成了这次观测透视。尽管作者再三申明没有发起任何提权漏洞利用,但同一级别的可见性同样赋予了任意会话使用者读取底层包结构、部署协议及 MCP 集成逻辑的途径。一家 AI 厂商建立起涵盖执行沙箱、数据库编排与代码分发的底层云基础设施,行业版图的扩张边界已经延伸到了运行时。
参考链接:
- AprilNEA 博客
- HN 社区讨论