본문 바로가기
C.W.K.
Stream
Lesson 08 of 10 · published

도구 호출 격리하기

~14 min · security, sandbox, tools

Level 0수련생
0 XP0/100 lessons0/14 achievements
0/120 XP to next level120 XP to go0% complete

모델의 말이 실제 행동으로 이어질 때

이메일 발송, 코드 실행, URL 조회처럼 부작용이 있는 도구는 실행 환경에서 격리해야 해. 모델이 얼마나 확신했는지와 관계없이 각 호출이 할 수 있는 일에 물리적 한계를 둬.

격리하는 다섯 방식

  • 자원 제한 — URL 도구는 내부 IP, file:// URL, 메타데이터 끝점을 통신 정책으로 막아.
  • 프로세스 격리 — 코드는 컨테이너, VM, WASM에서 돌리고 호스트 파일과 환경 변수에 닿지 못하게 해.
  • 도구별 호출 상한 — 한 세션에서 민감한 도구를 부를 수 있는 횟수를 제한해.
  • 허용 목록 — charge_card나 send_email_external은 확인된 대상만 받고 나머지는 거절해.
  • 모의 실행 — 첫 호출은 실행이 아니라 계획만 만들고 사람이나 후단 검사를 거쳐 확정해.

한계는 실행 코드가 소유해야 해

“1,000달러가 넘으면 charge_card를 부르지 마”는 지침일 뿐이야. 도구 구현이 1,000달러 초과 호출을 거절해야 보장이 돼.

Code

SSRF 방어를 갖춘 URL 조회기·python
import ipaddress
import socket

DENY_NETS = [
    ipaddress.ip_network(n) for n in [
        "127.0.0.0/8", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16",
        "169.254.0.0/16",  # link-local + cloud metadata
    ]
]

def fetch(url: str) -> str:
    if not url.startswith(("http://", "https://")):
        raise ValueError("only http(s)")
    host = urlparse(url).hostname
    addr = ipaddress.ip_address(socket.gethostbyname(host))
    if any(addr in net for net in DENY_NETS):
        raise ValueError("blocked target")
    return httpx.get(url, timeout=10).text

External links

Exercise

URL을 여는 도구에 사설 주소와 링크 로컬 범위를 거절하는 SSRF 방어를 넣고 공격용 가짜 URL로 시험해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.