AI agent를 sandbox한다는 것은 신뢰할 수 없거나 model이 생성한 코드를 명시적인 filesystem, process, network, credential, resource, lifetime, artifact, cleanup control이 적용된 제한된 environment에서 실행한다는 뜻입니다. container라는 이름만으로 이런 속성을 증명할 수는 없습니다.
code가 접근해야 하는 대상부터 정한 뒤 나머지는 모두 거부하세요. task에 typed API call만 필요하다면 sandbox를 추가하지 말고 code execution을 제거하세요.
threat model부터 작성하세요
생성된 code가 다음 작업을 시도할 수 있다고 가정하세요.
- mount된 모든 file과 environment variable 읽기
- internal 및 public network scan
- command server에 접속하거나 output 유출
- process fork, disk 채우기, memory 할당, 무제한 data 출력
- 변경한 file, package, cache, scheduled work를 통한 persistence
- cloud metadata 또는 local runtime socket 검사
- 다른 tenant의 artifact 또는 credential 공격
prompt instruction은 이런 위협을 줄이지 않습니다. code가 의도적으로 탈출하려고 해도 runtime이 경계를 적용해야 합니다.
filesystem과 process tree를 격리하세요
실행마다 ephemeral workspace를 만드세요. 필요한 input만, 가능하면 read-only로 mount합니다. host repository, container socket, home directory, cloud configuration, SSH key, shared package cache를 mount하지 마세요.
unprivileged user로 실행하고, capability를 제거하고, 지원되는 경우 system call을 제한하고, process 수를 제한하세요. top-level command를 종료하면 child process도 종료되어야 합니다. background process를 살려 두는 wall-clock timeout은 cleanup이 불완전한 것입니다.
범위가 좁은 service를 통해 승인된 artifact를 export하세요. path와 file type을 검증하고, size limit를 설정하고, workspace를 폐기하기 전에 output을 복사합니다.
기본적으로 network access를 거부하세요
많은 code task에는 network가 필요하지 않습니다. 필요한 경우 egress를 allowlist나 authenticated proxy를 통해 routing하세요. private range, loopback, link-local address, cloud metadata endpoint를 포함해 DNS 및 IP access를 통제합니다.
allowlist에 있는 domain도 예상치 못한 address로 redirect하거나 resolve할 수 있으므로 connection 시점에 검증하세요. 생성 코드에 internal service discovery 직접 접근 권한을 주지 마세요.
web access가 task라면 제한 없는 socket보다 policy와 session isolation이 적용된 browser tool이 더 안전할 수 있습니다. 다운로드한 file과 page instruction은 신뢰할 수 없는 것으로 취급하세요.
범위가 좁고 수명이 짧은 credential을 주입하세요
application server의 environment를 상속하지 마세요. 정확한 resource와 operation에 필요한 task-scoped credential을 발급한 뒤 실행 후 expire하거나 revoke하세요. management, billing, provision credential은 sandbox 밖에 두세요.
내부에 둔 credential은 code가 읽을 수 있다고 가정하세요. “hidden” environment variable도 process에서 사용할 수 있습니다. 보안상 물어야 할 것은 scope와 lifetime 안에서 그 credential이 유출되어도 감당할 수 있는가입니다.
agent 보안 가이드는 downstream authorization과 audit requirement를 다룹니다.
모든 resource와 output channel의 범위를 제한하세요
CPU, memory, disk, process, file, network, stdout, stderr, wall-clock limit를 설정하세요. package installation과 dependency source를 제한합니다. 반복되는 policy violation은 중단하거나 quarantine하세요.
structured summary나 크기가 제한된 log를 model에 반환하세요. runtime 자체가 격리되어 있어도 무제한 terminal output은 memory, token, observability storage를 소모할 수 있습니다.
workload에 따라 isolation depth를 선택하세요
신뢰할 수 있는 application code에는 in-process function이나 background worker가 적합할 수 있습니다. package 분리가 필요한 code에는 제한된 container가 적합할 수 있습니다. 신뢰할 수 없는 생성 코드에는 hardened sandbox가 필요하고, 더 강한 kernel boundary나 privileged system access가 필요한 workload에는 dedicated VM이 필요할 수 있습니다.
compute escalation ladder는 이런 tier를 code trust, network, lifetime, state, latency에 mapping합니다. Cloudflare의 Project Think도 비슷한 tier 방식을 제시합니다. 여기서 product tier는 보편적인 경계가 아니라 예시입니다.
cleanup을 관찰 가능하고 idempotent하게 만드세요
execution ID, tenant, image 또는 runtime version, policy, credential reference, timestamp, resource usage, artifact reference, exit class, cleanup result를 기록하세요. cleanup은 success, failure, timeout, cancellation, worker crash 후에 모두 실행되어야 합니다.
reconciler를 사용해 process failure 후에도 남은 expired environment를 찾으세요. credential revoke와 environment deletion은 안전하게 반복할 수 있어야 합니다.
production을 위험에 빠뜨리지 않고 경계를 테스트하세요
전용 test environment에서 허용되지 않은 mount 읽기, environment variable 나열, private 및 public destination 연결, metadata 접근, 과도한 process 생성, output 채우기, termination 이후 생존, 다른 tenant의 artifact 검색을 시도하세요. 각 시도가 거부되고 민감한 값을 노출하지 않은 채 기록되는지 검증합니다.
허용된 경로도 테스트하세요. 모든 실제 task를 방해할 만큼 지나친 제한은 팀이 광범위한 exception을 추가하게 만듭니다. 각 exception을 구체적으로 만들고, 검토하고, 이를 필요로 하는 workload에 연결하세요.
아래 프롬프트는 공격 코드를 실행하지 않고 설정된 경계를 감사합니다. provider의 보장과 이 repository에 실제로 있는 setting을 구분해 sandbox 검토에서 흔히 드러나는 gap을 찾습니다.