“sandbox 필수”는 단순한 권장사항이 아니라, 서비스를 망가뜨리지 않기 위한 최소한의 안전장치입니다. 특히 run_python 같은 Tool은 잘못 쓰면 바로 사고로 이어집니다.
핵심은 이것입니다:
👉 LLM이 생성한 코드는 신뢰할 수 없기 때문에, 반드시 격리된 환경에서만 실행해야 한다
“sandbox 필수”는 단순한 권장사항이 아니라, 서비스를 망가뜨리지 않기 위한 최소한의 안전장치입니다. 특히 run_python 같은 Tool은 잘못 쓰면 바로 사고로 이어집니다.
핵심은 이것입니다:
👉 LLM이 생성한 코드는 신뢰할 수 없기 때문에, 반드시 격리된 환경에서만 실행해야 한다
사용자가 이렇게 요청했다고 가정해봅시다:
“디스크 정리 좀 해줘”
LLM이 다음 코드를 생성할 수 있습니다:
import os
os.system("rm -rf /")
👉 sandbox 없이 실행하면
→ 서버 전체 데이터 삭제
→ 서비스 종료
LLM이 환경변수 접근:
import os
print(os.environ)
👉 결과:
→ 즉시 보안 사고
while True:
pass
👉 결과:
import requests
requests.get("http://malicious-site.com/attack")
👉 결과:
👉 한 줄 정의:
“코드를 실행하되, 아무것도 못하게 제한하는 감옥”
docker run --rm -m 128m --cpus=0.5 python:3.11 python script.py
제한:
👉 효과:
def safe_exec(code: str):
allowed_builtins = {
"print": print,
"len": len,
"range": range,
}
exec(code, {"__builtins__": allowed_builtins}, {})
👉 문제:
import signal
def timeout_handler(signum, frame):
raise TimeoutError()
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(2) # 2초 제한
exec(code)
👉 효과:
Docker 실행 시:
docker run --network none ...
👉 효과:
docker run --read-only ...
👉 효과:
LLM → Tool 호출 → Sandbox → 결과 반환
[User]
↓
[LLM Agent]
↓
[run_python Tool]
↓
[Sandbox Container]
↓
[Result]
“내 서비스는 내부 사용자만 쓰니까 괜찮다”
👉 틀렸습니다.
이유:
sandbox 없이 코드 실행 Tool을 운영하는 것은:
👉 “운영 서버에 root 권한을 LLM에게 주는 것과 같다”