Agent Sandboxing
에이전트 샌드박싱은 AI 에이전트의 명령과 생성된 코드를 파일, 네트워크, 자격 증명, 컴퓨팅 리소스를 제한하는 격리된 환경에서 실행합니다.
에이전트 샌드박싱은 셸 명령, 생성 코드, 파일 편집, 웹 탐색 등 AI 에이전트의 동작을 격리된 환경에서 실행해 해당 동작이 접근할 수 있는 파일, 네트워크, 자격 증명, 컴퓨팅 리소스를 제한하는 방식입니다. 대규모 언어 모델(LLM)을 기반으로 구축된 에이전트는 자신이 읽은 텍스트를 바탕으로 각 명령을 선택하며, 해당 텍스트는 부정확하거나 악의적일 수 있습니다. 샌드박스는 운영 체제 또는 하이퍼바이저에서 제한을 강제하므로 모델이 웹 페이지나 README에 숨겨진 프롬프트 인젝션을 따르거나 단순히 실수하더라도 제한이 유지됩니다.
에이전트에 샌드박스가 필요한 이유#
함수 호출 및 도구 사용은 모델의 텍스트를 실제 동작으로 전환하므로, 셸을 실행할 수 있는 에이전트는 파일을 삭제하거나 SSH 키를 읽거나 소스 코드를 업로드할 수도 있습니다. OWASP AI 에이전트 보안 치트 시트는 샌드박싱 없이 에이전트가 임의의 코드를 실행하도록 허용하는 것을 피해야 할 관행으로 제시하며, 2025년 12월에 발표된 OWASP 에이전틱 애플리케이션 상위 10개 위험은 예상하지 못한 코드 실행을 에이전트 시스템의 주요 위험 10가지 중 하나로 꼽습니다. 샌드박스는 에이전트의 사용성도 높입니다. 모든 명령을 사람에게 승인받도록 하면 승인 피로가 발생하기 때문입니다. Anthropic은 내부 사용에서 Claude Code 샌드박싱을 적용해 권한 요청을 84% 줄였다고 밝혔습니다. 경계 안에서 실행되는 명령에는 더 이상 승인이 필요하지 않기 때문입니다.
샌드박스가 제한하는 항목#
에이전트용 샌드박스는 일반적으로 다음 다섯 가지를 제어합니다.
- 파일 시스템: 에이전트에는 임시 작업 공간이나 단일 저장소만 표시되며, 읽기 전용 기본 이미지에서 실행되는 경우가 많습니다. 자격 증명, 브라우저 프로필 또는 다른 프로젝트에는 접근할 수 없습니다.
- 네트워크: 외부 트래픽을 차단하거나 패키지 레지스트리처럼 허용 목록에 있는 도메인만 허용하는 프록시를 통해 라우팅하므로, 탈취된 에이전트가 공격자의 서버로 데이터를 보낼 수 없습니다.
- 자격 증명: 비밀 정보는 샌드박스 외부에 보관하거나 단일 작업에 한정된 단기 토큰으로 전달합니다. 이는 데이터 보안의 최소 권한 원칙입니다.
- 컴퓨팅: CPU 시간, 메모리, 프로세스 수, 실제 경과 시간에 제한을 두어 무한 루프와 포크 폭탄을 방지합니다.
- 시스템 호출: seccomp와 같은 필터는 에이전트 도구에 필요하지 않은 커널 인터페이스를 차단합니다.
격리 강도는 경계가 설정된 위치에 따라 달라집니다. Docker 컨테이너는 호스트 커널을 공유하므로 커널 익스플로잇으로 탈출할 수 있습니다. gVisor는 사용자 공간 커널을 추가해 각 컨테이너의 시스템 호출을 가로챕니다. AWS가 Lambda용으로 구축한 Firecracker와 같은 마이크로VM은 모든 샌드박스에 자체 최소 커널을 제공하며, 메모리 오버헤드는 5 MiB 미만이고 부팅 시간은 125ms 미만입니다. 호스팅 코드 인터프리터와 클라우드 코딩 에이전트는 일반적으로 각 작업을 새 컨테이너나 마이크로VM에서 실행한 후 이를 폐기합니다. 개발자 컴퓨터에서 Claude Code 샌드박스는 macOS에서 Seatbelt를, Linux에서 bubblewrap을 사용합니다. 셸 명령은 작업 디렉터리와 임시 디렉터리에만 쓸 수 있으며, 네트워크 트래픽은 각 호스트를 허용 목록과 대조하는 프록시를 거칩니다.
샌드박스는 모델의 도구 호출을 실행하는 소프트웨어인 에이전트 하네스의 한 계층입니다. 하네스는 제안된 각 동작을 정책에 따라 확인하고, 허용된 동작을 샌드박스 안에서 실행하며, 결제, 배포, 조직 외부로 보내는 메시지처럼 되돌릴 수 없는 동작을 수행하기 전에는 사람의 승인을 기다립니다.
생성 코드 샌드박싱#
데이터 분석 어시스턴트부터 에이전틱 코딩 도구까지, 코드를 작성하고 실행하는 에이전트에는 가장 엄격한 제한이 필요합니다. 생성 코드는 인터프리터가 할 수 있는 모든 작업을 수행할 수 있기 때문입니다. 가장 안쪽 계층은 일반적인 프로세스 격리이며, Python 표준 라이브러리로 이를 보여줄 수 있습니다. 이 스크립트는 resource 모듈(Linux 및 macOS)을 사용해 모델이 작성한 코드를 임시 디렉터리에서 실행하고, 빈 환경과 CPU 시간 제한을 적용합니다.
import os
import resource
import subprocess
import sys
import tempfile
os.environ["API_KEY"] = "sk-live-123" # 에이전트 자체 프로세스가 보유한 비밀 정보
# 모델이 작성한 코드: 환경 변수를 읽은 다음 무한 루프를 실행합니다
generated = "import os\nprint('API_KEY =', os.environ.get('API_KEY'), flush=True)\nwhile True: pass"
def limit_cpu():
"""Stop the child process after 2 seconds of CPU time."""
resource.setrlimit(resource.RLIMIT_CPU, (2, 2))
# 격리 모드와 임시 디렉터리, 빈 환경을 사용해 실행합니다
cmd = [sys.executable, "-I", "-c", generated]
with tempfile.TemporaryDirectory() as workspace:
proc = subprocess.run(cmd, cwd=workspace, env={}, capture_output=True, text=True, preexec_fn=limit_cpu)
print(proc.stdout.strip())
print("exit code:", proc.returncode)자식 프로세스는 빈 환경에서 시작해 부모 프로세스의 비밀 정보를 볼 수 없으므로 API_KEY = None을 출력하고, 종료 코드 -24와 함께 종료됩니다. 무한 루프가 CPU 시간 제한 2초에 도달했을 때 커널이 SIGXCPU로 프로세스를 종료했기 때문입니다. 컨테이너나 마이크로VM을 사용하면 이 프로세스에 파일 시스템과 네트워크 경계가 추가됩니다.
샌드박싱과 관련 제어 기능 비교#
- AI 가드레일: 입력, 출력 또는 제안된 동작이 실행되기 전에 이를 검사하는 분류기와 규칙입니다. 가드레일이 동작을 허용한 뒤에는 샌드박스가 해당 동작의 실행을 통제합니다.
- 권한: 접근 제어는 에이전트가 사용할 수 있는 도구와 리소스를 결정합니다. 샌드박싱은 모델이 말로 우회할 수 있는 검사를 넘어 운영 체제 수준에서 이러한 결정을 강제합니다.
- 컨테이너화: 재현 가능한 배포를 위해 소프트웨어와 종속성을 패키징하는 것입니다. 컨테이너는 권한을 제거하고 마운트를 제한하며 송신 규칙을 적용해 실행하면 샌드박스 역할을 합니다.
- 테스트 샌드박스: 소프트웨어를 안전하게 시험할 수 있는 비운영 시스템 복사본입니다. 에이전트 샌드박스는 개발 환경뿐 아니라 운영 환경에서도 에이전트가 수행하는 모든 동작을 감쌉니다.
에이전트 샌드박스 사용 사례#
- 코딩 에이전트: 각 작업에는 저장소 하나가 포함된 새 컨테이너나 가상 머신이 제공됩니다. 에이전트는 그 안에서 종속성을 설치하고 테스트를 실행한 다음 사람이 검토할 수 있도록 diff를 반환합니다.
- 컴퓨터 사용 에이전트: 스크린샷과 클릭을 통해 데스크톱이나 브라우저를 조작하는 에이전트는 자체 계정이 있는 가상 머신에서 실행됩니다. 에이전트가 보는 모든 페이지에 에이전트를 겨냥한 지침이 포함될 수 있기 때문입니다.
- 코드 인터프리터: 업로드된 스프레드시트나 이미지를 분석하는 어시스턴트는 세션별 샌드박스에서 Python 코드를 실행하며, 인터넷 접근이 차단되는 경우가 많습니다.
- MCP 서버 및 에이전트 스킬: 타사 도구와 스킬 스크립트는 사용자의 자격 증명으로 실행되므로, 신중한 호스트는 로컬 서버와 스크립트를 에이전트의 셸과 동일한 경계 안에서 실행합니다.
호스팅 에이전트 플랫폼도 자체 워크플로에 동일한 제한을 적용합니다. Ultralytics Platform Agents는 YOLO26 탐지, 비전-언어 모델, 알림 블록을 연결합니다. 각 공유 체험 실행을 60초, 입력 이미지 20개, 모델 또는 제공자 호출 20회로 제한하며, Webhook 블록은 공개 HTTPS URL에만 요청을 보내고 리디렉션을 따르지 않으며 5초 후 시간 초과됩니다.










