devvm: 프로젝트마다 전용 VM에서 코딩 에이전트를 실행하고 토큰은 내 컴퓨터에 두는 샌드박스

핵심 요약

  • devvm은 프로젝트 폴더마다 Lima 기반의 전용 VM을 만들고, 코딩 에이전트와 설치 스크립트를 그 VM 안에서 실행하게 하는 macOS/Linux용 명령줄 도구입니다.
  • VM은 프로젝트 폴더만 읽고 쓸 수 있고, GitHub 토큰과 Claude Code 토큰 같은 비밀값은 내 컴퓨터에 남습니다. VM 안의 프로그램은 대체 문자열(placeholder)만 받고, 호스트의 프록시가 그 비밀값의 호스트로 가는 요청에만 실제 값을 넣습니다.
  • 새 VM은 기본적으로 허용 목록(allowlist) 등급이라 패키지 저장소, GitHub, 에이전트 제공자처럼 허용된 호스트에만 연결됩니다. 다만 허용된 호스트 자체가 데이터 유출 경로가 될 수 있다는 점은 개발자가 직접 밝혀 둔 한계입니다.
  • 기본 설치로 받는 버전은 2026년 11월 6일 공개된 0.1.0입니다. README와 저장소 문서에 나오는 학습 모드, 사용자 정의 비밀값, Linux의 .git 보호, Cursor CLI와 pi 지원 등은 아직 릴리스 후보(0.1.1-rc)에만 들어 있습니다.

devvm 소개

Claude Code나 Codex 같은 코딩 에이전트를 내 컴퓨터에서 바로 실행하면, 에이전트가 실행하는 npm install, 테스트, 셸 명령도 내 계정 권한으로 실행됩니다. 이 경우 홈 폴더의 ~/.ssh 키, 다른 프로젝트, .git 훅까지 같은 권한 안에 들어 있습니다. README나 이슈에 숨겨진 프롬프트 인젝션(prompt injection), 설치 스크립트에 섞여 들어온 악성 패키지가 이 권한을 그대로 쓸 수 있습니다. 그렇다고 명령마다 승인 창을 누르는 방식은 에이전트를 무인으로 실행하고 싶을 때 걸림돌이 됩니다. 이번에 소개하는 devvm은 프로젝트 폴더 하나에 VM 하나를 붙여, 에이전트와 빌드 과정을 그 VM 안에 가두는 도구입니다.

devvm은 프로젝트 폴더에서 devvm 한 번을 실행하면 그 폴더 전용 VM을 만들고, 내 컴퓨터와 같은 경로에서 VM의 셸을 열어 줍니다. VM은 프로젝트 폴더만 읽기/쓰기로 마운트하고, 그 밖에는 공유 도구와 에이전트 설정 폴더를 읽기 전용으로 받을 뿐 홈 폴더의 나머지는 보지 못합니다. 이 구조 덕분에 VM 안에서 --dangerously-skip-permissions 로 실행한 에이전트가 rm -rf ~ 를 잘못 실행해도 지워지는 범위는 VM입니다. 단, 프로젝트 폴더는 여전히 에이전트가 바꿀 수 있으므로 개발자는 자주 커밋하거나 --clone 모드를 쓰라고 안내합니다.

devvm은 Syntax 영상 제작자로도 활동하는 개발자 CJ(w3cj)가 Go로 작성했고, VM 실행은 Lima에 맡깁니다. 툴체인은 프로젝트 파일을 보고 자동으로 고릅니다. 예를 들어 package.json 이 있으면 Node 24를, pyproject.toml 이나 requirements.txt 가 있으면 CPython과 uv를 넣습니다. 이 툴체인과 코딩 에이전트는 여러 VM이 읽기 전용으로 함께 쓰는 공유 도구라서, 기본 이미지를 처음 한 번 만든 뒤에는 새 VM이 몇 초 안에 뜬다고 개발자는 설명합니다. 0.1.0 기준으로 VM 안에서 실행할 수 있는 에이전트는 Claude Code, Codex, opencode입니다. VM은 홈 폴더의 에이전트 파일 대신 devvm이 따로 보관하는 설정 저장소(devvm agent import 로 기존 설정을 복사)의 설정과 스킬, MCP 서버를 받고, 대화 기록은 받지 않습니다.

devvm vs. Docker Sandboxes, Claude Code 샌드박스

코딩 에이전트를 내 컴퓨터에서 격리하는 방법은 크게 세 가지입니다. 에이전트 프로세스 주변에 운영체제 샌드박스를 두는 방법, 마이크로VM(microVM)에 넣는 방법, 그리고 devvm처럼 전체 VM에 넣는 방법입니다. 아래 표는 devvm과 가장 자주 비교되는 두 도구를 각 도구의 공식 문서 기준으로 정리한 것입니다:

항목 devvm Docker Sandboxes Claude Code 샌드박스 (Sandbox Runtime)
격리 경계 자체 커널을 가진 전체 VM (Lima) 자체 커널을 가진 마이크로VM 셸 명령에만 적용되는 OS 샌드박스 (파일 도구, MCP 서버, 훅은 바깥에서 실행)
실행 환경 macOS 13 이상, Linux (arm64, x86_64) macOS 14 이상 (Apple silicon), Windows 11, Ubuntu 24.04 이상, Docker 클라우드 macOS, Linux, WSL2
프로젝트 파일 같은 경로에 읽기/쓰기 마운트, 또는 --clone 으로 VM 전용 복제본 읽기/쓰기 마운트, 또는 clone 모드 폴더를 그대로 사용
네트워크 기본값 허용 목록 등급 첫 실행 때 고르는 프리셋 (Open, Balanced, Locked Down) 허용 도메인이 빈 상태에서 시작
API 키 처리 VM에는 대체 문자열, 호스트 프록시가 실제 값을 넣음 VM에는 대체 문자열, 호스트 프록시가 실제 값을 넣음 설정한 환경 변수와 자격 증명 파일에 한해 마스킹 가능
SSH 키 VM에 마운트하지 않음, 에이전트 전달은 기본값 꺼짐 에이전트 전달이 기본값 기본 읽기 정책이 ~/.ssh 를 허용 (설정으로 차단 가능)
.git 훅과 설정 macOS에서 잠금, Linux는 커널이 허용할 때 읽기 전용 (0.1.1-rc.2부터) 직접 마운트 모드에서는 에이전트가 쓸 수 있음 (clone 모드는 보호) 셸 명령의 .git 안 hooks 와 config 쓰기를 막음

Docker Sandboxes와 devvm은 구조가 가장 비슷합니다. 둘 다 VM 경계와 호스트 프록시의 비밀값 치환을 쓰고, 에이전트 로그인을 호스트에 보관합니다. 차이는 운영체제 범위와 기본값에 있습니다. Docker Sandboxes는 Windows와 클라우드 실행을 지원하지만 SSH 에이전트를 기본으로 전달하고, 직접 마운트 모드에서 .git/hooks/ 가 에이전트에게 열려 있다는 점을 Docker가 공식 문서에 위험 요소로 적어 두었습니다. Claude Code 샌드박스는 VM 없이 가볍게 쓸 수 있습니다. 대신 Anthropic 문서 기준으로 기본 읽기 범위가 ~/.ssh 를 포함한 컴퓨터 대부분이고, 셸 명령 외의 도구에는 경계가 적용되지 않습니다.

devvm 문서에는 NVIDIA OpenShell, microsandbox, smolvm, nono, GitHub Codespaces까지 포함한 더 넓은 비교표가 있습니다. 이 비교표는 devvm 개발자가 2026년 11월 8일 기준으로 작성했고, 개발자도 도구들이 매주 바뀐다고 적어 두었습니다. 그러므로 다른 도구의 칸은 해당 도구 문서와 함께 확인하는 편이 안전합니다(예: Claude Code 샌드박스가 셸 명령의 .git 훅 쓰기를 막는다는 점은 이 비교표에 없습니다).

devvm을 사용하면 좋을 사용자

macOS나 Linux에서 Claude Code, Codex 같은 에이전트를 승인 없이 오래 실행하고 싶은 개발자, 처음 보는 저장소를 받아 npm install 이나 빌드부터 해 봐야 하는 개발자에게 devvm이 맞습니다. GitHub 토큰과 에이전트 로그인을 VM 밖에 두고 싶을 때, 프로젝트마다 툴체인을 따로 설치하는 수고를 줄이고 싶을 때도 이점이 큽니다.

반대로 Windows에서 일하거나, GPU를 써서 모델을 학습하고 추론해야 하는 작업이라면 다른 선택지를 보는 것이 맞습니다. devvm 문서에는 GPU 패스스루나 CUDA에 대한 설명이 없고, Intel Mac은 릴리스는 있지만 아직 아무도 테스트하지 않았다고 명시되어 있습니다. Windows 사용자나 VM 안에서 GPU 작업을 해야 하는 팀에게는 devvm이 아직 적절한 선택지가 아닙니다. 또한 devvm은 첫 안정판이 2026년 11월 6일에 나온 초기 프로젝트입니다. 2026년 11월 14일 기준 GitHub 기여자 통계에서 개발자 한 명이 커밋 709개를 맡고 다른 기여자는 각 1개씩이므로, 유지보수가 사실상 한 사람에게 달려 있다는 점도 감안해야 합니다.

devvm의 격리 범위와 비밀값 처리

devvm은 모든 보호를 VM 경계에 의존합니다. VM은 자체 커널을 실행하고, VM 사용자에게 비밀번호 없는 sudo 가 있으므로 devvm은 VM 안의 모든 것을 루트 권한을 가진 신뢰할 수 없는 코드로 취급합니다. 아래 그림은 devvm의 안전 문서에 있는 도식을 렌더링한 것입니다. 왼쪽부터 VM이 닿는 것(The VM reaches), 읽기 전용이거나 복사본만 받는 것(Read-only or copied), 닿지 않는 것(Out of reach)을 나눕니다.

VM이 직접 다루는 것은 프로젝트 폴더와 네트워크 등급이 허용하는 호스트뿐입니다. 공유 툴체인과 에이전트 설정 폴더는 읽기 전용으로 마운트되고, 에이전트 설정 파일은 비밀값을 뺀 복사본으로 들어갑니다. 홈 폴더의 나머지, SSH 에이전트(직접 켜지 않는 한), 비밀값은 VM에 들어가지 않습니다. 프로젝트 폴더의 .git 훅과 설정은 macOS에서 VM 안의 루트도 풀 수 없는 플래그로 잠기므로, VM이 심은 훅이 내 컴퓨터의 다음 git 명령에서 실행되는 일을 막습니다.

아래 그림은 devvm 네트워크 문서의 시퀀스 도식으로, 비밀값이 처리되는 순서를 보여 줍니다. VM(The VM)이 대체 문자열을 담아 api.github.com 에 요청하면, 호스트의 프록시(Its proxy, on this machine)가 허용 목록을 확인한 뒤 실제 GitHub 토큰으로 바꿔 보냅니다. 허용 목록에 없는 example.com 연결은 403으로 거부합니다.

대체 문자열은 VM마다 다른 무작위 값으로 끝나므로, VM이 이 값을 다른 곳으로 보내도 실제 비밀값은 드러나지 않습니다. 프록시는 VM마다 따로 만든 인증 기관(CA)으로 비밀값이 필요한 호스트의 TLS 트래픽을 읽습니다. 이 CA는 해당 VM만 신뢰하고 내 컴퓨터는 신뢰하지 않으며, 유효 기간은 30일입니다. 비밀값 자체는 macOS 키체인이나 Linux에서 나만 읽을 수 있는 파일에 저장됩니다.

devvm의 네트워크 등급

devvm은 VM마다 네 가지 네트워크 등급 중 하나를 적용합니다. 등급은 아래로 갈수록 엄격합니다:

등급 VM이 연결할 수 있는 범위 프록시로 제한
open 내 컴퓨터가 닿는 모든 곳 (localhost 와 LAN 포함), 프록시 규칙 없음 아니오
internet 모든 공개 호스트, 단 내 컴퓨터와 내부망 주소는 제외 예
allowlist 허용 목록의 호스트만 (기본값) 예
none 에이전트와 비밀값의 호스트, VM 사이 링크만 예

open 을 뺀 세 등급에서 VM은 자기 프록시 외에는 아무 데도 직접 연결하지 못하고, 이 제한은 VM 바깥(macOS 샌드박스, Linux의 QEMU 네트워크 제한)에서 걸리므로 VM 안의 루트도 우회하지 못합니다. devvm은 VM을 시작할 때마다 이 제한이 살아 있는지 스스로 확인하고, 확인에 실패하면 VM을 제한된 상태로 다시 시작하거나 멈춥니다. 허용 목록에는 devvm이 내장한 호스트(패키지 저장소, GitHub, 에이전트 제공자), 비밀값의 호스트, 사용자가 추가한 호스트가 들어갑니다.

호스트에서 Ollama 같은 로컬 모델 서버를 쓰는 경우에는 주의가 필요합니다. 프록시는 내 컴퓨터 자신의 주소와 내부망 주소를 주소 규칙 없이는 거부하는데, 이 주소 규칙은 허용 목록 등급에서만 읽습니다. 그래서 internet 이나 none 등급의 VM은 호스트의 로컬 모델 서버에 닿지 않습니다.

devvm 안정판 0.1.0과 릴리스 후보의 차이

devvm은 2026년 11월 6일 첫 안정판 0.1.0을 공개했고, 이후 0.1.1-rc.1부터 rc.3까지 릴리스 후보를 냈습니다. Homebrew의 devvm 과 설치 스크립트의 기본값, devvm upgrade 는 모두 0.1.0을 설치하고 릴리스 후보를 고르지 않습니다. 그런데 저장소의 README와 docs/ 는 main 브랜치 기준이라, 문서에서 본 기능이 설치한 버전에 없을 수 있습니다. 문서 사이트도 둘로 나뉘어 있어서, devvm.dev는 0.1.0 기준이고 next.devvm.dev가 main 기준입니다.

CHANGELOG 기준으로 릴리스 후보에만 있는 주요 기능은 다음과 같습니다:

기능 처음 들어간 버전
.NET SDK 툴체인 0.1.1-rc.1
--network learn 후 devvm network lock 으로 필요한 호스트만 허용 목록에 고정 0.1.1-rc.2
HTTP 메서드와 경로 단위 규칙 (--method, --path) 0.1.1-rc.2
사용자 정의 비밀값 (devvm secret set NAME --host HOST --env VARIABLE) 0.1.1-rc.2
Linux 호스트의 .git 보호, 4단계 아래 중첩 저장소까지 보호 0.1.1-rc.2
프록시 설정을 무시하는 도구도 프록시로 보내는 투명 모드 0.1.1-rc.2
pi 에이전트, Gemini/Groq/Mistral/xAI/DeepSeek 키 보관 0.1.1-rc.2
Cursor CLI 에이전트, devvm paste, 로컬 브랜치와 stash까지 복사하는 --clone 0.1.1-rc.3

Linux 사용자는 이 차이를 특히 확인해야 합니다. 0.1.0의 .git 잠금은 macOS에서만 동작하므로, Linux에서 0.1.0을 쓰면 VM이 프로젝트의 .git 훅을 바꾸는 것을 막지 못합니다. rc.2 이후에도 Ubuntu 23.10 이상처럼 커널이 사용자 네임스페이스(user namespace)를 막는 환경에서는 잠금 대신 감시만 하므로, devvm은 이런 Linux 호스트에서 --clone 을 쓰라고 권합니다. 릴리스 후보는 brew install devvmhq/tap/devvm-rc 나 devvm upgrade --to 0.1.1-rc.3 으로 설치할 수 있습니다.

devvm이 막지 못하는 것

devvm은 공격 벡터 문서에 막는 것과 막지 못하는 것을 한 목록으로 정리해 두었습니다. 개발자가 "좁혔지만 닫지 못함(Narrowed, not closed)" 과 "사용자 몫(Left to you)" 으로 분류한 항목 가운데 에이전트 사용자에게 중요한 것은 다음과 같습니다.

  • 허용된 호스트를 통한 유출: github.com은 계정만 있으면 누구의 push든 받으므로, 공격자는 자기 계정으로 데이터를 내보낼 수 있습니다. 허용 목록을 짧게 유지하고, 필요하면 메서드와 경로 단위 규칙(0.1.1-rc.2부터)으로 좁혀야 합니다.
  • VM이 쓸 수 있는 비밀값의 권한: VM은 GitHub 토큰을 볼 수 없어도 그 토큰으로 push하거나 API를 호출할 수 있습니다. devvm 문서는 npm 설치 스크립트로 퍼진 Shai-Hulud 웜(2025)을 예로 들며, 세분화된(fine-grained) GitHub 토큰을 쓰고 VM에 필요한 비밀값만 연결하라고 안내합니다.
  • VM이 프로젝트 폴더에 쓴 파일: VM이 만든 .claude/settings.json 의 훅, .vscode/tasks.json, .envrc 는 내 컴퓨터에서 Claude Code, VS Code, direnv를 실행하는 순간 내 권한으로 실행됩니다. 그래서 devvm은 설치, 테스트, 에이전트 실행을 모두 VM 안에서 하라고 권합니다.
  • VM 탈출: Lima, Apple Virtualization 프레임워크, QEMU의 버그는 devvm의 보호 범위 밖입니다.

Linux 호스트에는 호환성 제약도 있습니다. 이 환경에서는 VM이 프로젝트 폴더를 virtiofs 대신 9p 프로토콜로 마운트합니다. 그래서 LMDB나 numpy의 memmap 쓰기 모드처럼 파일을 공유 쓰기로 매핑하는 프로그램은 Invalid argument 로 실패하고, SQLite의 WAL(Write-Ahead Logging) 모드도 배타 잠금(locking_mode=EXCLUSIVE)을 켜지 않으면 프로젝트 폴더 안에서 실패합니다. 이런 프로젝트는 --clone VM을 쓰거나 데이터 파일을 VM 디스크에 두라고 devvm은 안내합니다.

devvm 설치와 사용

devvm은 macOS 13 이상 또는 Linux(arm64, x86_64)와 Lima 2.2 이상(현재 README 기준)이 필요하며, 메모리 8GiB와 CPU 4개를 권장합니다. 첫 VM에는 기본 이미지와 공유 도구용으로 디스크 여유 공간 8GiB가 필요합니다. macOS에서는 Lima까지 함께 설치하는 Homebrew를 씁니다:

brew trust --formula devvmhq/tap/devvm
brew install devvmhq/tap/devvm

Linux에서는 설치 스크립트를 씁니다. 이 스크립트는 macOS에서도 동작하며, Lima, QEMU, /dev/kvm 접근 권한을 설치하기 전에 먼저 묻습니다:

curl -fsSL https://github.com/devvmhq/devvm/releases/latest/download/install.sh | bash

설치가 끝나면 devvm doctor 로 빠진 의존성이 없는지 확인합니다. 각 릴리스는 minisign 키로 서명되어 있고, 설치 스크립트를 실행 전에 직접 검증하는 방법도 설치 문서에 있습니다.

프로젝트 폴더로 이동해 devvm 을 실행하면 새 VM의 구성(툴체인, 에이전트, 크기, 네트워크 등급)을 요약해 보여 줍니다. 확인하면 VM을 만든 뒤 셸을 엽니다. 첫 실행에서는 기본 이미지를 만드느라 몇 분이 걸립니다:

cd ~/some-project
devvm

VM의 셸 프롬프트는 (devvm) 으로 시작합니다. Claude Code를 처음 쓴다면 VM 셸이 아니라 내 컴퓨터의 터미널에서, 프로젝트 폴더에 있는 상태로 로그인을 한 번 만들어 둡니다. 로그인은 내 컴퓨터에 보관되고 VM에는 대체 문자열만 들어갑니다:

devvm agent login claude

그다음 VM 셸에서 에이전트를 실행합니다. 같은 폴더에서 devvm 을 다시 실행하면 같은 VM이 열립니다:

~/some-project $ devvm
(devvm) ~/some-project $ claude

신뢰하기 어려운 저장소나 무인으로 실행할 에이전트에는 --clone 을 씁니다. 이 모드에서 VM은 내 작업 폴더 대신 자기만의 저장소 복제본에서 작업하고, 그 결과는 내가 가져올 때만 내 저장소에 들어옵니다:

devvm --clone                 # make the VM with its own clone, and open a shell in it
git fetch devvm               # later, on this machine, fetch the VM's work as devvm/<branch>
git log -p main..devvm/main   # review it before you merge it

devvm의 라이선스

devvm은 MIT 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.

:house: devvm 공식 홈페이지

:github: devvm 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 초안을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 댓글로 알려주시기를 부탁드립니다. :hugs:

이 글은 :pytorch:파이토치 한국 사용자 모임:south_korea:이 직접 정리한 글입니다. 새 글을 놓치지 않으시려면 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로 알림을 받으시고, 회원으로 가입하시면 주요 글들을 이메일:love_letter:로도 보내드립니다! :smiley:

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck: