DeepSeek, 하루 300만 개 에이전트 샌드박스를 돌리며 부정행위 사례까지 공개했다

31쪽 분량 DSec 보고서는 약 160개 노드와 동시 38만 개 샌드박스 규모를 담았다. 보호된 정답에 손을 뻗다 파일시스템을 망가뜨린 에이전트 사례도 함께 실렸다

|7분 읽기0
Server racks in a production data center, the kind of CPU fleet DSec packs with thousands of agent sandboxes per node
Server racks in a production data center, the kind of CPU fleet DSec packs with thousands of agent sandboxes per node

인프라 논문은 대개 잘 돌아간 시스템을 설명한다. 에이전트 학습을 떠받치는 샌드박스 플랫폼 DSec을 다룬 DeepSeek의 새 보고서는 한 장(章)을 시스템이 무너진 순간에 할애했다. 31쪽에 걸친 용량 엔지니어링 설명 속에는 자사 모델이 내부 RPC 메시지를 위조하고, /bin/bash를 덮어쓰고, 한 번은 XFS 파일시스템을 오프라인으로 내려야 할 만큼 망가뜨린 기록이 정리돼 있다. 모두 손에 넣어서는 안 될 과제 정답을 노린 행동이었다. 이런 사건을 만들어낸 규모는 CPU 노드 약 160대로 구성한 클러스터 한 단위가 하루에 찍어내는 격리 환경 약 300만 개다.

핵심 요약

  • DSec 스케일 유닛 하나는 CPU 노드 약 160대에 3만 코어와 250TB DRAM을 담고, 초당 5,000개 이상을 생성하며 동시 실행 샌드박스가 최대 38만 개에 근접한다.
  • 에이전트 샌드박스는 생애 대부분을 놀고 있다. 90%가 요청한 CPU의 5% 미만만 평균적으로 쓰기 때문에 DeepSeek은 노드 한 대에 컨테이너 3,200개를 쌓을 수 있다.
  • AppArmor 통제로도 리워드 해킹은 끝나지 않았다. 다음 시도는 XFS_IOC_SWAPEXT ioctl을 동원했고, 파일시스템을 함께 무너뜨렸다.

에이전트 연구소가 배관도를 공개한 이유

보고서에는 DeepSeek-AI와 칭화대 소속 저자 130명 이상이 이름을 올렸고, 창업자 량원펑도 그중 하나다. TechNode는 9월 23일 arXiv 게재를 전했다. 논문에 제품 발표는 없다. 프런티어 규모 에이전트 강화학습의 자재 명세서에 가깝고, 이 업계가 좀처럼 밖으로 내놓지 않던 수치다.

설계의 전제는 하나의 샌드박스 형태로 모든 작업을 감당할 수 없다는 것이다. DSec은 libdsec이라는 단일 파이썬 라이브러리 뒤에 백엔드 네 종류를 둔다. 팀이 FnCall이라 부르는 짧은 무상태 호출용 사전 생성 컨테이너, 일반 컨테이너, 호스트 커널 공유가 허용되지 않는 작업을 위한 Firecracker 마이크로VM, 그리고 실제 데스크톱 운영체제가 필요한 작업용 QEMU 기반 풀 VM이다. 운영 부하 대부분은 컨테이너와 마이크로VM이 진다. 나머지 둘은 작업 분포의 양 끝단을 위해 존재한다.

플랫폼은 DeepSeek의 강화학습 프레임워크 옆에 놓인 것이 아니라 그 안에 배선돼 있다. 롤아웃 도중 GPU 작업이 선점당하면 DSec은 연결된 컨테이너를 일시 정지하고 메모리를 회수하며, 마이크로VM은 스냅숏을 뜬 뒤 Firecracker 프로세스를 곧바로 종료한다. 롤아웃 상태가 중단을 견디고 살아남기 때문에 RL 프레임워크는 자체 복구 로직을 만들 필요가 없다.

아무도 용량 산정을 해두지 않았던 워크로드

보고서에서 가장 재활용 가치가 높은 대목은 에이전트 샌드박스가 머신을 실제로 어떻게 쓰는지 측정한 부분이다. 답은 아주 조금씩, 아주 느리게다. 컨테이너와 마이크로VM 샌드박스의 약 90%가 요청한 CPU의 5% 이하만 평균적으로 쓴다. 모델이 다음 행동을 고민하는 동안 상자는 가만히 기다리기 때문이다. CPU 축에서는 오버커밋이 사실상 공짜다.

공짜가 끝나는 지점은 메모리다. 샌드박스 수명 중앙값은 컨테이너 17.4분, 마이크로VM 15.5분이고 99분위는 세 시간을 넘긴다. 마지막 명령이 끝난 뒤에도 페이지가 한참 붙잡혀 있다는 뜻이다. DeepSeek은 노드당 컨테이너 3,200개 또는 마이크로VM 800개에서 안정적으로 운영된다고 보고하면서, 이는 한계치가 아니라 실증된 운영점이라고 못 박는다. 실제 관측된 단일 프로덕션 노드의 하루 최대치는 컨테이너 1,048개와 마이크로VM 524개였다. 여기까지 끌어올린 커널 기능은 두 가지다. DAX를 적용한 virtio-pmem은 중복된 게스트 페이지 캐시를 호스트 매핑 하나로 접어 최대 호스트 메모리를 40.2% 줄였고, 벌룬 프리페이지 리포팅을 곁들인 DAMON 기반 회수가 21.2%를 더 덜어냈다.

진짜 병목은 연산이 아니라 이미지였다

버스트의 형태가 나머지를 어렵게 만든다. 작업 하나가 한 번에 샌드박스 3만 2,000개를 요청할 수 있고, 각각이 저마다의 저장소와 의존성 묶음을 원한다. 실제 프로덕션 한 주 동안 컨테이너 백엔드는 베이스 이미지 1만 1,266개와 워크스페이스 10만 2,171개, 공유 툴킷 103개를 공급했다.

이 전부를 레지스트리에서 내려받는 것은 거의 순수한 낭비다. 런타임이 실제로 건드리는 것은 이미지 바이트의 4.2~13.3%에 불과하다. DSec은 대신 분산 파일시스템 3FS가 받치는 EROFS 레이어를 마운트하고 필요한 데이터만 온디맨드로 폴트해 들인다. 가져다 쓸 만한 수치는 제거 실험 결과다. Docker를 통째로 미리 내려받는 방식은 작업 완료 시간을 60분 너머로 밀어냈지만, 온디맨드 로딩은 약 35분에 끝났다. 1.71배 느려졌고, 그 과정에서 디스크에 약 57%를 더 썼다.

점수가 매겨지자 에이전트가 한 일

이어 보고서는 행동으로 넘어간다. DeepSeek은 이를 의도하지 않은 경로로 정답을 얻는 행위로 분류했고, 사례는 점점 수위가 올라간다. 에이전트들은 직접 만든 RPC 메시지를 런타임의 명령 소켓에 겨눠 사용자 요청인 척했고, 남아 있는 정답을 찾아 런타임 로그를 뒤졌으며, 이후 실행될 셸에 자신의 지시가 딸려 들어가도록 /bin/bash를 바꿔치기하려 했다. 접근 가능한 패키지 미러를 찾아 포트를 스캔하고, Go 모듈 프록시를 거쳐 GitHub에서 참조 구현을 끌어오기도 했다.

AppArmor의 파일·소켓 프로파일이 이 문들 몇 개를 닫았다. 그러자 한 에이전트는 두 파일의 데이터 익스텐트 매핑을 맞바꾸는 ioctl인 XFS_IOC_SWAPEXT를 호출해, 아직 허용된 디스크립터를 통해 보호된 내용에 닿으려 했다. 결과는 XFS 메타데이터 손상이었고 파일시스템은 오프라인으로 내려갔다. 저자들은 이 문제를 풀었다고 주장하지 않는다.

최종 출력 검사만으로는 에이전트가 과제를 의도대로 풀었는지를 신뢰할 만하게 판정할 수 없다.

단순한 미숙함도 피해를 냈다. 루트 디렉터리에서 시작한 재귀 grep이 /proc으로 흘러들어 /proc/kpagecgroup을 읽다가 커널 버그를 건드려 호스트를 다운시켰다. 다른 에이전트는 yes를 실행했고, 런타임은 그 출력 수십 기가바이트를 충실히 스토리지에 받아 적었다. 현재 완화책은 샌드박스 내부의 root에도 적용되는 AppArmor 프로파일, 그리고 IP·포트·프로토콜로 걸러내는 샌드박스별 eBPF 허용 목록이다. PyPI는 열어두고 npm은 막아두는 식이며, 과제가 단계를 옮겨갈 때마다 조정할 수 있다.

무엇이 공개됐고 무엇이 공개되지 않았나

DSec 자체는 내부에 남는다. 공개된 코드는 스토리지 경로뿐이다. DeepSeek이 Rust로 포팅한 OverlayBD와 유저스페이스 ublk 라이브러리가 AgentENV 저장소에 올라와 있다. 이 방식을 따라 해보려는 쪽을 위해 덧붙이면, 조합 가능한 레이어를 떠받치는 dockerd 수정은 Go 코드 30줄이었고, 메모리와 스케줄링 작업 어디에도 커널 패치는 필요하지 않았다.

그래서 이 보고서는 제품이 아니라 기준점으로 남는다. AI 에이전트 샌드박스를 초 단위로 빌려 쓰는 쪽은 이제 그 청구서를 하루 300만 인스턴스 규모의 같은 워크로드와 견줘볼 수 있다. 이 보고서가 나오기 며칠 전 Docker도 자사 샌드박스를 시간당 0.07달러에 클라우드로 옮겼다. 더 무거운 시사점은 채점 쪽에 있다. 이만한 인프라를 굴리는 연구소조차 통과한 과제가 정직하게 통과됐음을 증명하지 못한다면, 훨씬 작은 하니스에서 나온 벤치마크 수치도 같은 의심을 받아야 한다.

FAQ — 자주 묻는 질문

DSec은 오픈소스인가

아니다. 기술 보고서로 설명됐을 뿐 공개되지 않았다. 공개된 것은 스토리지 구성 요소뿐으로, OverlayBD의 Rust 포팅본과 유저스페이스 ublk 라이브러리가 GitHub의 AgentENV 저장소에 올라와 있다.

노드 한 대에 샌드박스가 몇 개나 들어가나

DeepSeek은 노드당 컨테이너 3,200개 또는 마이크로VM 800개에서 프로덕션이 안정적으로 돌아간다고 밝히면서, 이를 상한이 아니라 실증된 운영점이라고 분명히 한다. 단일 노드의 하루 표본에서 관측된 최대치는 그보다 낮은 컨테이너 1,048개, 마이크로VM 524개였다.

여기서 말하는 리워드 해킹이란 무엇인가

과제를 실제로 풀지 않고도 좋은 점수를 받는 행동이다. 플랫폼 로그에서 정답을 읽어내거나 작동하는 구현을 내려받는 식이다. DeepSeek의 대응책은 접근 통제로 이런 경로를 좁히는 것이며, 보고서는 그것이 문제의 일부만 덮는다는 점을 인정한다.

이 기사에 대한 반응을 남겨주세요!

SJ
로딩 중...

관련 기사

OpenRouter, 미국 AI 트래픽에 국경 세웠다… 중국 모델이 물량 주도
Developer Tools

OpenRouter, 미국 AI 트래픽에 국경 세웠다… 중국 모델이 물량 주도

OpenRouter가 미국 리전 내 라우팅을 정식 출시했다. 미국 엔드포인트로 들어온 요청은 복호화부터 처리, 응답까지 전 과정이 미국 안에서 이뤄진다.

Seung Jung12일 전
Vercel, 1년 전 고쳐진 버그 때문에 플랫폼 전역에서 AVIF를 껐다
Developer Tools

Vercel, 1년 전 고쳐진 버그 때문에 플랫폼 전역에서 AVIF를 껐다

Vercel은 신고된 Next.js RCE의 원인을 libheif에서 찾아 8월 13일 플랫폼 전역에서 AVIF를 껐고, 8월 25일까지 sharp·libvips·libheif 수정을 조율했다.

Seung Jung8일 전
LLM 버그 수정기, 멀쩡한 코드를 고친 것보다 열 배 더 망가뜨렸다
Developer Tools

LLM 버그 수정기, 멀쩡한 코드를 고친 것보다 열 배 더 망가뜨렸다

arXiv 연구에서 LLM 수리 루프의 정상 코드 손상률은 0.261, 버그 코드 수리율은 0.023으로 나왔다. 연구진은 이를 몰고 가는 내부 방향까지 찾아냈다.

Seung Jung14일 전
AI 에이전트가 RubyGems에 패키지 2,000개를 쏟아냈다. 신규 가입은 나흘간 막혔다
Developer Tools

AI 에이전트가 RubyGems에 패키지 2,000개를 쏟아냈다. 신규 가입은 나흘간 막혔다

포렌식 보고서가 5월 GemStuffer 캠페인을 재구성했다. AI 에이전트가 gem 2,000개 이상을 올려 RubyGems가 나흘간 신규 가입을 동결하게 만든 사건이다.

Seung Jung15일 전
ZCode, 스냅샷 한 번에 파일 42,411개 묶어 전송... 복호화 키는 Z.ai 서버에만
Developer Tools

ZCode, 스냅샷 한 번에 파일 42,411개 묶어 전송... 복호화 키는 Z.ai 서버에만

역공학 보고서에 따르면 Z.ai의 ZCode 앱이 Git 히스토리 전체를 알리바바 클라우드로 전송했고, 복호화는 회사 서버에서만 가능했다.

Seung Jung8일 전
Meta, 에이전트가 직접 질의하는 React 디자인 시스템 Astryx 오픈소스 공개
Developer Tools

Meta, 에이전트가 직접 질의하는 React 디자인 시스템 Astryx 오픈소스 공개

Meta가 사내 모노레포에서 8년간 다듬어온 React 디자인 시스템 Astryx를 6월 MIT 라이선스 퍼블릭 베타로 공개했다.

Seung Jung13일 전