这条在讲 Claude Code Web 运行环境的逆向。出处是 AprilNEA,3 月发的,挂在 github.com/AprilNEA/reverse-engineering-claude-code-antspace。
作者没有把自己包装成“史上最全架构解析”。就是老老实实地写:自己在一个 Claude Code Web 会话里,用标准 Linux 工具把运行环境扒了一遍——strace、strings、objdump、go tool objdump,没提权,没漏洞利用,没网络攻击。我一开始也以为是那种靠截图起标题的,读到 PID 1 那段才决定推。
他拿到的环境干净得出奇——没有 systemd、sshd、cron,也没有日志守护进程。PID 1 是个自定义的 /process_api,听 2024 端口,既当 init 又当 WebSocket API 网关。后面跟着 PID 517 的 environment-manager 和 PID 532 的 claude CLI,就没了。进程树精简到不像给人用的机器,更像一个被裁剪掉的容器。
更怪的是会话不是从零启动的。dmesg 里能看见 ACPI 表的 OEM ID 是 FIRECK、creator ID 是 FCAT——这俩结合,作者判断运行在 Firecracker MicroVM 上,就是 AWS Lambda 和 Fargate 同款。4 个 vCPU,Intel Xeon Cascade Lake 2.80GHz,16GB 内存,252GB 磁盘,Linux 6.18.5 内核。规格具体到不像事后编的。
但它不是给你一台新开的 MicroVM。模板创建和会话恢复之间差了大约 48.5 小时。也就是说,Claude Code Web 给你的是一份冻结的快照——宿主先热替换块设备,再 PUT /snapshot/load 把整个状态载进来,会话启动那一瞬间,根文件系统 mount count 已经是 11。这我印象很深。
读到这,我一直觉得这就是篇扎实的逆向。但看到后面,我发现最值得讲的反而不是这些架构货,是一个几乎没人会当重点的事:Anthropic 没给这堆二进制剥符号。17MB 的 environment-manager,Go 1.25.7 编译,未剥离,符号表完整。作者用 objdump -t 直接把 internal 包结构一个个恢复出来——api、auth、claude、config、gitproxy、input、manager、mcp、orchestrator、podmonitor、sandbox……连 tunnel/actions 底下 deploy、snapshot、status 这些子包都明摆着。这种便宜,平时很难遇到。
他没明说,但意思很直白:这次分析能成,最大原因不是他技术多高,是对面把最该藏的东西自己留着了。他自己讲到,如果二进制被剥离,估计得上 Ghidra。那这篇就不是现在这个读法了,可能也不会这么痛快。
Go 的构建元数据在这事上帮了大忙。go version -m 一跑,module 路径、版本号、私有 monorepo 的 staging tag 全出来。连内部 Go SDK、gorilla/websocket、mcp-go v0.37.0、DataDog、OpenTelemetry 这些依赖清单都写得清清楚楚。一个没剥符号的 Go 服务端二进制,约等于对方把仓库的目录树摊在桌上。
Antspace 这个名,作者搜了公开互联网,Anthropic 官网、Git
