SafeAgents: 코딩 에이전트가 실행하는 모든 도구 호출을 사전에 검사하는 오픈 소스 프록시
요약
SafeAgents는 코딩 에이전트와 모델 서버 사이에 위치하는 로컬 프록시입니다. 이 도구는 에이전트가 실행하려는 모든 도구 호출(tool call)을 하네스에 전달되기 전에 검사하여 안전성을 확보합니다. 요청 기반 검사와 110개의 결정론적 검사기 등을 통해 네임스페이스 탈출, 보상 해킹 등 다양한 공격 시도를 로컬에서 감지하고 차단할 수 있습니다.
핵심 포인트
- 로컬 전용 프록시: 모든 검사가 로컬 기기에서 실행되어 사용자 데이터를 외부로 전송하지 않습니다.
- 다층적 보안 검사: 요청 기반 검사와 110개의 결정론적 검사기를 통해 공격을 방어합니다.
- 고급 취약점 포착: 네임스페이스 탈출, 보상 해킹 등 복잡한 에이전트의 오용 시도를 감지합니다.
- 호환성 및 모드 지원: OpenAI와 Anthropic 서버에 적용 가능하며, 로깅 또는 차단 모드를 제공합니다.
SafeAgents는 코딩 에이전트와 모델 서버 사이에 위치하는 작은 로컬 프록시입니다. 이 프록시는 모델의 응답에 포함된 각 도구 호출(tool call)이 하네스(harness)에 도달하기 전에 검사합니다. 플래그가 지정된 호출은 짧은 텍스트 알림으로 대체되므로, 하네스는 일반 텍스트 답변을 받고 아무것도 실행하지 않습니다. 에이전트의 기본 URL을 모델 서버 대신 이 프록시에 연결하면 됩니다.
모든 검사는 로컬 기기에서 실행됩니다: 이 프록시는 사용자가 이미 사용하는 모델 서버로만 트래픽을 전달하며, 선택적 judge를 원격 서버에 지정하지 않는 한 사용자 프롬프트, 코드 또는 도구 호출을 다른 곳으로 전송하지 않습니다. 모든 도구 호출은 최대 세 가지 검사를 거칩니다:
- 요청 기반 로컬 검사: 요청 자체만을 필요로 하는 두 가지 로컬 검사입니다. 이 검사들은 해당 도구가 하네스에 의해 선언되었는지, 그리고 호출이 대화에서 전혀 나타나지 않는 호스트에 도달하는지를 확인합니다.
- atif-scan (u/evalstate 작성): 보류 중인 호출(pending call)에 대해 약 110개의 결정론적 검사기(deterministic detectors)를 인프로세스(in-process), 모델 또는 네트워크 호출 없이 실행합니다. 이 검사들은 샌드박스 측면 채널(sandbox side channels), 프록시 및 네트워크 우회, 네임스페이스 탈출(namespace escapes), 보상 해킹(reward hacking) 등을 감지합니다. 예시로는 클라우드 메타데이터 엔드포인트로의
curl호출,~/.netrc파일을 게시하는--noproxy가 붙은curl호출, 또는/proc/1/environ읽기가 있습니다. - Judge 모델 (선택 사항): 더 완만한(milder) 발견을 위한 judge 모델입니다. 이는 llama.cpp를 통해 자체 기기에서 실행되는 작은 모델을 포함하여 모든 OpenAI와 호환되는 서버일 수 있으므로, 이 단계 역시 로컬로 유지될 수 있습니다. 이 모델은 JSON 형식으로 허용(allow) 또는 차단(block) 응답을 합니다. 오직 사용자 요청, 호출, 그리고 발견된 내용만을 보고하며, 에이전트의 추론 과정이나 도구 출력물은 볼 수 없습니다. 블록을 추가할 수는 있지만 제거할 수는 없습니다.
RL 및 평가에서 보상 해킹 포착: 동일한 검사기들은 정책(policy)이 작업을 해결하는 대신 게임의 보상을 조작하기 위해 수행하는 도구 호출도 다룹니다. 예를 들어, 자체 보상 파일을 작성하거나, 검증자(verifier)의 테스트를 수정하거나, 모든 것이 통과하도록 pytest 패치 등을 시도할 때 이를 포착합니다.
SafeAgents는 OpenAI와 호환되는 서버 앞단의 프록시일 뿐이므로, 롤아웃(rollouts) 또는 평가 실행(eval runs)에 사용되는 추론 서버 앞에 위치할 수 있습니다. --log-only 모드에서는 궤적(trajectories)을 변경하지 않고 이러한 시도를 기록하며, 이는 모델이 얼마나 자주 속이려 하는지 측정하는 지표를 제공합니다. 블로킹 모드(blocking mode)에서는 해당 호출을 알림으로 대체하고 실행되지 않습니다. 몇 가지 실질적인 세부 사항: 스트리밍 여부에 관계없이 OpenAI Chat Completions와 Anthropic Messages를 처리합니다. 텍스트는 도착하는 대로 전달되며, 도구 호출(tool call)은 인수가 완료될 때까지 보류됩니다. 로컬 검사는 M 시리즈 Mac에서 호출당 약 10~20ms가 소요됩니다. 심판(judge)은 이미 발견 사항을 제기한 호출에 대해서만 호출됩니다. --log-only는 아무것도 변경하지 않고 모든 호출을 확인하므로 시작하는 데 권장되는 방식입니다. 신뢰하는 호스트는 --allow-host로 추가할 수 있습니다. 이 저장소(repo)에는 12개의 하네스(harnesses)에 대한 설정 가이드가 있습니다. 그중 6개(pi, Claude Code, OpenCode, Qwen Code, OpenHands, DeepSeek Harness)는 CI에서 엔드투엔드로 테스트됩니다: 실제 하네스는 스크립트된 모델을 대상으로 프록시를 통해 실행되며, 테스트는 플래그 지정된 호출은 실행되지 않고 깨끗한(clean) 호출만 실행되는지 확인합니다. 다음 단계는 악의적인 도구 호출을 위한 작고 미세 조정된 결정 모델(decision model)과 이를 위한 공개 벤치마크입니다. 흥미로운 포착 사례와 오탐지(false positive) 보고 모두 유용합니다. Apache 2.0 라이선스이며 로컬에서 실행됩니다: https://github.com/huggingface/safeagents (제출자: /u/HauntingMoment) [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 Reddit AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기