클로드 웹의 마이크로VM 리버스 엔지니어링: 앤스로픽의 숨겨진 '앤트스페이스' 플랫폼 발견
개발자가 호기심으로 시작한 strace 조사가 Claude Code Web의 Go 바이너리 리버스 엔지니어링으로 발전해, 앤스로픽이 미공개한 애플리케이션 호스팅 플랫폼의 아키텍처가 드러났습니다. 세션은 Firecracker 스냅샷에서 복원되어 부팅 없이 즉시 시작되며, AWS Lambda/Fargate와 동일한 기술 위에 극도로 최소화된 init 환경으로 구동됩니다. 보안 강화(페이지 초기화, CRNG 재시드, capability 제거)도 스냅샷 재사용에 맞춰 정교하게 설계되어 있어, AI 네이티브 PaaS 설계의 실제 사례로서 중요합니다.
Claude Code Web 안에는 무엇이 들어 있을까: 심볼이 제거되지 않은 Go 바이너리, 앤스로픽의 비공개 배포 플랫폼, 그리고 AI 네이티브 PaaS의 아키텍처
시작점
우리는 Railway와 E2B와 유사한 포지션의 데스크톱부터 플랫폼까지 아우르는 풀스택 플랫폼인 ArcBox를 개발 중이다. 우리의 핵심 철학은 로컬-클라우드 일관성이며, OrbStack을 완전한 오픈소스인 ArcBox Desktop으로 대체해 로컬에서 샌드박스 기능을 제공한다. 최근 점점 더 많은 코딩 에이전트 플랫폼이 웹 기반 진입점을 출시하고 있으며, 놀랍게도 거의 모두가 내부적으로 Firecracker를 선택했다. Claude Code도 예외는 아니었다. 같은 분야의 실무자로서 그 런타임 환경에 대한 호기심에 약간의 조사가 시작되었다. 가볍게 시작한 strace -p 1이 결국 앤스로픽의 미출시 인프라 — 전혀 문서화되지 않은 애플리케이션 호스팅 플랫폼까지 — 를 밝혀내는 본격적인 리버스 엔지니어링 세션으로 이어졌다. 여기서 설명하는 모든 것은 Claude Code 세션 안에서 표준 리눅스 도구(strace, strings, objdump, go tool objdump)로 발견되었다. 익스플로잇도, 권한 상승도, 네트워크 공격도 없었다. 바이너리는 디버그 심볼이 완전히 담긴 채, 심볼이 제거되지 않은 상태로 그대로 그 자리에 있었다.
레이어 1: Firecracker 마이크로VM이다
첫 번째 질문: 이 환경은 정확히 무엇인가? ACPI 테이블이 OEM ID FIRECK와 creator ID FCAT로 서명되어 있으며, 둘 다 Firecracker 소스 코드에 하드코딩된 값이다. 이는 AWS Lambda와 Fargate을 구동하는 것과 동일한 마이크로VM 기술이다. 사양은 다음과 같다: vCPU 4개(인텔 Xeon Cascade Lake @ 2.80GHz), RAM 16GB, 디스크 252GB, Linux 6.18.5. Firecracker가 의도적으로 게스트에서 vmx/svm 플래그를 제거하기 때문에 중첩 가상화는 불가능하다.
프로세스 트리는 놀라울 정도로 최소화되어 있다: systemd 없음. sshd 없음. cron 없음. 로깅 데몬 없음. PID 1은 init이자 WebSocket API 게이트웨이 역할을 모두 하는 커스텀 바이너리다. 커널 커맨드 라인이 이를 확인해 준다. PID 1에 strace를 걸면 epoll 이벤트 루프를 실행하며 주기적으로 /proc//children과 /proc//status를 확인해 자식 프로세스를 모니터링한다. 본질적으로 최소화된 init 슈퍼바이저로, 포트 2024(WebSocket API)와 포트 2025(보조 엔드포인트)에서 대기한다.
스냅샷 아키텍처
세션은 처음부터 부팅되지 않고, 동결된 VM 스냅샷에서 복원된다. dmesg 출력은 템플릿 생성과 세션 복원 사이에 48.5시간의 간격이 있었음을 보여준다. 복원 시 Firecracker 호스트는 블록 디바이스를 핫스왑한다:
디바이스 | 템플릿 | 복원 후 내용 vda | 플레이스홀더 | 256 GiB ext4 — 세션 루트 파일시스템(Ubuntu 24.04) vdb | 플레이스홀더 | 63.7 MB squashfs — /opt/claude-code vdc | 플레이스홀더 | 12.1 MB squashfs — /opt/env-runner
initramfs는 의도적으로 최소화되어 있다: /process_api만 담긴 3.1MB cpio 아카이브다. 실제 Ubuntu 루트 파일시스템은 ext4 블록 디바이스(vda)에 있으며, 복원 시점에 주입된다. ext4의 마운트 횟수는 11로, 해당 이미지가 11개 세션에 걸쳐 재사용되었음을 나타낸다.
Snapstart: 지연 마운트 패턴
템플릿 생성 단계:
- Firecracker 부팅: 커널 + 3.1MB initramfs
- process_api가 최소 init 수행: /proc, /sys, /dev, cgroups 마운트; 네트워크 구성(IP=192.0.2.2/24, GW=192.0.2.1, MTU=1400)
- 호스트에 SNAPSTART_READY 신호 전송
- 호스트가 PUT /snapshot/create 호출 → 전체 VM 상태 저장
세션 복원 단계:
- 호스트가 세션 전용 블록 디바이스(vda/vdb/vdc) 준비
- 호스트가 새 디바이스 백엔드와 함께 PUT /snapshot/load 호출
- VM 재개 — 커널이 디바이스 변경을 감지하고 CRNG 재시드
- process_api가 복원을 감지하고 다음 수행:
- 페이지 캐시 삭제 — 오래된 템플릿 캐시는 쓰레기 데이터를 반환할 수 있음
- devtmpfs 재마운트 — 디바이스 노드 갱신
- ext4 마운트 → 새 루트 파일시스템으로 pivot_root
- squashfs 오버레이 마운트(claude-code, env-runner)
- clock_setime()으로 벽시계 시간 보정 — 그렇지 않으면 템플릿 생성 시각에 멈춰 있음
- CAP_SYS_RESOURCE 제거 — 보안 강화
- 연결 수락 — WebSocket 서버 준비 완료
보안 조치
조치 | 목적 init_on_free=1 | 세션 간 해제된 페이지를 0으로 초기화 CAP_SYS_RESOURCE 제거 | init 완료 후 PID 1의 capability 제한 CRNG 재시드 | 스냅샷 포크 간 암호학적 예측 가능성 방지