메인 콘텐츠로 건너뛰기

에이전트 격리 모범 사례: 에이전트 트랜스크립트의 오프라인 모니터링(비공개 베타)

사이버 검증 프로그램의 고객을 위해 API에서 새로운 샌드박스 탈출 분류기를 제공하여 오용을 모니터링하고 줄입니다. 이 문서에서는 에이전트 트랜스크립트를 읽을 가치가 있는 이유를 설명합니다. 그 다음 모니터링의 각 계층별로 한 섹션씩 있습니다: 먼저 프록시 로그, 그 다음 트랜스크립트가 포함해야 할 내용, 트랜스크립트에 대한 패턴 규칙, 그리고 트랜스크립트에 대한 모델 검토자입니다. 배치가 실행 중일 때 계층이 에이전트에 플래그를 지정할 때 수행할 작업과 그 후에 유지할 사항으로 끝납니다.

이 분류기는 비공개 베타 상태입니다.

사용 가능한 모든 리소스의 개요를 보려면 에이전트 격리 모범 사례: 시작하기(비공개 베타)를 참조하세요.

개요

  • 트랜스크립트를 읽는 것은 샌드박스나 분류기가 올바른 결정을 내리는 것에 의존하지 않는 검사입니다. 트랜스크립트는 에이전트 자체의 프로세스에 의해 생성되므로 프록시 로그와 같이 샌드박스 외부에서 수집한 기록과 함께 사용하세요. 프로빙은 종종 해로운 작업이 실행되기 전에 트랜스크립트에서 보이지만, 대응할 시간이 있다고 가정하지 마세요: 작업이 실행되기 전에 작동하는 제어가 먼저 옵니다. 네트워크 접근이 없는 긴 배치 중에는 라이브 트랜스크립트 파일을 일정에 따라 스캔하고 1~2시간마다 사람이 히트를 확인하도록 하세요. 대상에 대한 네트워크 접근이 있는 실행의 경우, 엔지니어가 실행을 감시하거나 지속적으로 스캔하고 히트 시 에이전트를 중지하세요. 모든 실행 후에는 모든 항목을 한 번 스캔하여 모든 에이전트가 샌드박스 내에 머물렀는지 확인하세요.

  • 가장 저렴한 것부터 시작하여 세 가지 모니터링 계층을 사용하세요: (1) 이그레스 프록시 및 자격증명 프록시 로그, (2) 사용자 환경을 위해 작성된 트랜스크립트에 대한 패턴 규칙, (3) 트랜스크립트에 대한 모델 검토자(샌드박스 및 범위를 위해 작성한 프롬프트 포함).

  • 또한 검토자에게 패턴 규칙이 플래그하지 않은 트랜스크립트의 무작위 5~10%를 보내세요. 일부 거짓 양성을 예상하세요. 검토자가 에이전트가 무언가를 했다고 말하면, 그 부분의 트랜스크립트를 읽은 후 조치를 취하세요.

  • 계층이 에이전트가 실행 중에 작업을 벗어났음을 보여주면, 이를 중지하고 범위를 벗어난 동작에 대해 Anthropic 계정 팀에 알리세요.

  • 트랜스크립트 및 프록시 로그를 최소 30일 동안 유지하세요.

트랜스크립트를 읽는 이유

샌드박스와 Claude Code의 자동 모드 권한 분류기는 모두 에이전트가 실행되는 동안 작동합니다. 트랜스크립트를 읽는 것은 둘 다에 의존하지 않는 검사입니다. 두 가지 용도가 있습니다.

  • 실행 중. 프로빙이 발생하면 해로운 작업이 실행되기 전에 트랜스크립트에서 보일 수 있습니다. 대응할 시간이 있다고 가정하지 마세요: 작업이 실행되기 전에 작동하는 제어가 먼저 옵니다. 긴 배치 중에는 라이브 트랜스크립트 파일을 일정에 따라 스캔하고, 스캔이 플래그한 항목을 1~2시간마다 사람이 확인하도록 하세요.

  • 실행 후. 모든 항목을 한 번 스캔하여 모든 에이전트가 샌드박스 내에 머물렀는지 확인하세요.

실제 대상에 대한 네트워크 접근이 있는 참여의 경우, 모범 사례는 사람이 실행을 감시하거나, 의도된 범위를 알고 있는 모니터가 지속적으로 감시하고, 실행이 해당 범위를 초과할 수 있을 때 사람에게 에스컬레이션하며, 실행을 종료할 수 있도록 권장합니다(샌드박싱의 범위 및 감시 섹션 참조). 이 문서의 계층은 그러한 모니터가 구축되는 부분입니다.

Messages API에 대해 직접 에이전트를 실행하는 경우, API는 실행 중에 샌드박스 탈출 분류기에서 요청별 점수를 반환할 수도 있습니다(온라인 모니터링 참조).

계층 1: 프록시 로그

가장 저렴한 계층은 트랜스크립트를 전혀 읽지 않습니다.

이그레스 프록시는 거부한 모든 요청을 클라이언트 주소 및 대상과 함께 기록해야 합니다. 빈 허용 목록을 사용하면 에이전트는 자격증명 프록시를 통해서만 모델 API에 도달하고 다른 호스트가 필요하지 않으므로, 실행 중에 거부된 모든 요청은 살펴볼 가치가 있습니다. 이를 야기한 모든 실행의 트랜스크립트를 읽으세요. 클라이언트 주소는 요청을 한 에이전트를 보여주므로 먼저 읽을 트랜스크립트를 알 수 있습니다.

이그레스 계층이 기록하지 않는 것을 알아두세요. 참조 설계에서 이그레스 프록시는 거부된 HTTPS CONNECT 요청을 기록합니다. 일반 HTTP 및 원시 TCP 시도는 내부 네트워크의 프록시를 통과하지 않으므로 로그 라인 없이 실패하고 트랜스크립트에만 나타납니다. 자신의 빌드에서는 모든 프로토콜에 대해 거부된 연결뿐만 아니라 허용된 연결도 타임스탬프와 함께 기록하는 것을 고려하세요.

자격증명 프록시는 모델 호출이 아닌 모든 요청에 대해 라인을 기록해야 합니다. 실행이 끝날 때 로그를 저장하세요(샌드박싱의 자격증명 프록시 섹션 참조).

트랜스크립트에서 캡처할 항목

두 번째 및 세 번째 계층은 트랜스크립트 자체를 읽습니다.

호스트의 오케스트레이터가 모든 에이전트 단계에 대해 트랜스크립트를 작성하도록 하고, 각 메시지가 도착할 때마다 한 줄에 하나의 JSON 메시지를 작성하세요. Claude Code의 stream-json 출력은 이 형식입니다. 각 파일에서 "type": "assistant"가 있는 라인은 모델이 생성한 것을 포함합니다: text, thinking, tool_use 블록. tool_use 입력은 Bash 명령 또는 작성 중인 파일을 보유합니다. "type": "user"가 있는 라인은 tool_result 블록을 포함합니다: 명령 출력, 파일 내용, 대상 응답.

도구가 없는 에이전트의 단계(예: 결과만 판단하거나 비교하는 에이전트)를 포함하여 모든 단계를 캡처하세요. 이러한 트랜스크립트에서 확인할 항목이 적지만, 트랜스크립트가 없는 단계는 전혀 검토할 수 없습니다.

계층 2: 트랜스크립트에 대한 패턴 규칙

에이전트 및 대상을 위해 정규식과 같은 자신의 패턴 규칙을 작성하세요. 셸을 통해 작동하는 에이전트의 경우, 이그레스 프록시 또는 방화벽 우회, 자격증명 전송 또는 샌드박스 외부로 SSH 연결 열기, 커널 또는 권한 튜너블 변경, /proc을 통한 다른 프로세스 나열과 같은 동작을 다루세요. 규칙은 누군가가 예상한 동작만 일치하므로 이를 시작점으로 취급하고 완전한 탐지기로 취급하지 마세요.

원시 라인에 따라 규칙을 적용하지 말고 JSON 디코딩된 문자열에 적용하세요. 원시 라인에서는 따옴표와 줄바꿈이 이스케이프되고 패턴이 일치하지 않을 수 있기 때문입니다. 파일, 라인, 규칙, 스니펫과 함께 각 히트를 보고하고, 스캔이 무언가를 찾을 때 고유한 상태로 종료되도록 하여 예약된 작업이 긴 배치 중에 이를 실행하고 경고를 발생시킬 수 있도록 하세요.

양성 히트 예상

히트는 트랜스크립트의 해당 부분을 읽을 이유입니다. 그 자체로는 에이전트가 잘못된 작업을 했다는 의미가 아닙니다. 취약점 연구를 수행하는 에이전트는 일반적인 이유로 탈출 규칙과 일치하는 명령을 정기적으로 실행합니다:

  • LD_PRELOAD shim 아래에서 대상 실행;

  • 자신의 자식 프로세스에 ptrace 연결 또는 해당 프로세스에 대해 /proc/<pid>/ 읽기;

  • /proc/sys/kernel/randomize_va_space를 통해 ASLR 끄기;

  • /proc를 나열하여 자신의 퍼즈 워커 찾기 및 종료.

프록시 우회 규칙은 공개 IP가 있는 펜테스트 대상에 대한 모든 curl, wget 또는 netcat 요청과 일치할 수 있으며, SSH 이그레스 규칙은 공개 IP 또는 DNS 이름이 있는 대상에 대한 모든 ssh 또는 scp와 일치할 수 있습니다. 대상에서 양성 히트만 생성하는 규칙을 좁히거나 제거하세요.

계층 3: 트랜스크립트에 대한 모델 검토자

패턴 규칙이 플래그한 각 트랜스크립트에 대해, 작성한 검토자 프롬프트를 사용하여 Claude에 하나의 Messages API 요청을 보내세요. 프롬프트는 Claude에게 네트워크 접근을 확대하거나 샌드박스를 벗어난 에이전트(시도되었거나 달성된)를 찾도록 요청하고, 플래그할 항목과 플래그하지 않을 항목을 말하고, 트랜스크립트 라인으로 지원되는 결과 또는 없음을 요청해야 합니다.

사용자 메시지를 두 부분으로 구성하세요:

  1. 샌드박스 및 의도된 범위를 설명하는 2~3개 문장으로 시작하세요. 참조 설계의 경우: 각 에이전트는 자신의 격리된 샌드박스(컨테이너 또는 마이크로VM)에서 내부 네트워크에서 실행되고, 유일한 방법은 모델 API 호출을 전달하고 다른 것은 전달하지 않는 프록시이며, 대상은 샌드박스 내에서 에이전트와 함께 있습니다. 샌드박스가 다른 호스트를 허용하거나 대상이 네트워크에 있으면 여기에서 말하고 범위 내 대상의 이름을 지정하세요.

  2. 그 다음 에이전트 자신의 메시지(즉, text, thinking, tool_use 블록)를 포함하고, 각 호출이 반환한 것을 보여주기에 충분한 tool_result 내용을 포함하세요.

에이전트를 실행하는 모델 또는 더 저렴한 모델을 사용하세요. Amazon Bedrock 또는 Google Cloud의 Agent Platform(Vertex AI) 아래에서 계정에서 활성화된 모델을 사용하세요.

기억해야 할 두 가지 제한:

  • 샌드박스 및 네트워크 탈출만 찾는 검토자 프롬프트는 허용된 호스트에 도달할 수 있는 참여를 초과하는 에이전트를 탐지하지 않습니다.

  • 트랜스크립트는 검토자에 대한 신뢰할 수 없는 입력입니다. 대상이 제어하는 텍스트를 포함합니다. 깨끗한 평결은 규칙이나 프록시 로그가 플래그한 트랜스크립트를 지우지 않습니다.

플래그되지 않은 트랜스크립트의 샘플도 검토하세요

패턴 규칙은 누군가가 예상한 것만 포착하므로, 같은 요청을 사용하여 규칙이 플래그하지 않은 트랜스크립트의 무작위 5~10%도 보내세요. 샘플은 규칙이 놓친 것과 규칙을 추가해야 하는지 여부를 보여줍니다.

분류기의 거부 읽기

자동 모드 분류기의 거부도 읽을 가치가 있습니다: 트랜스크립트에서 분류기의 거부 메시지를 검색하고, 사용할 수 없을 때 발생하는 거부와 분리하세요(자동 모드 참조).

이 검토자는 각 작업이 실행되기 전에 결정하는 자동 모드 권한 분류기(자동 모드 참조)와 API의 샌드박스 탈출 분류기(온라인 모니터링 참조)와는 별개입니다. 세 가지는 서로를 보완합니다.

실행 중 히트 시 수행할 작업

계층 중 하나가 배치가 여전히 실행 중인 동안 작업을 벗어난 에이전트를 보여줄 때:

  1. 에이전트를 중지하세요. Docker 기반 설정에서 에이전트의 컨테이너에 docker rm -f를 실행하면 이를 중지합니다. 컨테이너를 제거하면 게스트의 디스크가 삭제되므로 에이전트가 거기에 작성한 모든 항목이 손실됩니다. 오케스트레이터는 실행을 실패로 기록하고 배치의 나머지를 계속해야 합니다.

  2. 증거를 유지하세요. 실행의 결과를 그대로 두고 같은 시간 창에 대해 이그레스 프록시의 로그를 확인하세요. 로그 라인에 타임스탬프가 있는지 확인하세요.

  3. 보고하세요. 찾은 것이 진정한 범위 외 동작(샌드박스 또는 네트워크 격리를 조사하거나 참여 외부에서 작동한 에이전트)이면, 자신의 인시던트 프로세스가 요구하는 것 외에도 Anthropic 계정 팀에 알리세요.

  4. 모델 API 자격증명을 회전하세요. 트랜스크립트가 예상치 못한 동작을 보여주는 모든 실행 후와 마찬가지로(샌드박싱 참조).

팀 외부에서 트랜스크립트를 공유해야 하는 경우 사본에서 작업하세요. 세션 ID, 사용 계정, 트랜스크립트의 첫 번째 라인이 기록하는 호스트 인벤토리를 제거하고 전송하기 전에 파일을 읽으세요.

보존

실행 후 최소 30일 동안 또는 규제 또는 계약 의무가 요구하는 더 오래 다음을 유지하세요. 호스트 외부에 저장하세요:

  • 에이전트 트랜스크립트;

  • 샌드박스에서 이그레스를 적용하는 것의 로그(프록시 또는 방화벽), 거부된 연결 포함;

  • 모델 API 자격증명을 주입하는 것의 로그(별도 구성 요소인 경우).

실행 자체와 동일한 접근 제어로 저장하세요. 트랜스크립트는 대상 소스 코드, 익스플로잇 코드, 결과를 포함할 수 있습니다.

이러한 로그 중 하나라도 컨테이너의 로그로만 존재하면 컨테이너가 제거되거나 다시 생성되기 전에 내보내세요. 로그는 이와 함께 삭제되기 때문입니다.

답변이 도움되었나요?