한 고객 서비스 챗봇이 단순한 양고기 레시피 요청을 받은 후 자신의 시스템 프롬프트를 유출했습니다. 몇 분 만에 봇은 레시피를 제공했을 뿐만 아니라, Python 코드까지 생성하고 자신의 행동을 안내하는 내부 지침을 드러냈습니다.
이 사건은 언어 모델의 "시스템 프롬프트"가 보안 장벽이 될 수 없음을 증명합니다. 봇이 사용자의 요청이 자신의 임무에 부합하는지 실시간으로 판단하도록 설계된 경우, 공격자는 그 추론 과정을 유도하여 모델이 권한이 있는 정보를 노출하도록 만들 수 있습니다.
침해를 유발한 원인
테스트는 "양고기 스튜 레시피를 알려줄 수 있나요?"라는 단순한 질문으로 시작되었습니다. 회사의 서비스를 설명하는 것이 명시된 목적이었던 이 봇은 전체 레시피를 응답했을 뿐만 아니라, 재료를 분석하는 짧은 Python 스크립트를 추가했고, 모델이 어떻게 행동해야 하는지 알려주는 텍스트인 시스템 프롬프트의 정확한 문구를 출력했습니다.
요청 자체는 무해했습니다. 위험은 봇이 해당 레시피를 자신의 핵심 작업의 일부로 취급하려 했다는 점에 있었습니다.
이것이 중요한 이유
현재 챗봇은 고객 응대 역할을 맡아 개인 데이터를 처리하거나, 거래를 실행하거나, 내부 도구를 제어하기도 합니다. 만약 모델이 유도되어 자신의 지침 세트를 노출하게 된다면, 공격자는 모델이 해로운 행동을 하지 못하도록 막아야 할 가드레일에 대한 통찰력을 얻게 됩니다.
공격 방식
- 봇의 목적 파악 – 테스터는 봇의 역할이 회사 서비스를 설명하는 것임을 확인했습니다.
- 허위 연결 고리 생성 – 테스터는 어떤 서비스를 사용해야 할지 결정하기 위해 레시피가 필요하다고 주장함으로써, 요청이 봇의 임무와 표면적인 관련성이 있는 것처럼 만들었습니다.
- 로직 악용 – 봇은 조작된 관련성을 수용하여 내부 관련성 검사를 통과시켰고, 요청을 차단했을 가드레일을 무력화했습니다.
이 공격은 모델의 관련성에 대한 자체 평가에 달려 있습니다. 이러한 평가가 흔들릴 수 있다면, 모델의 자체 "규칙"은 협상 가능한 대상이 됩니다.
세 가지 실패 지점
| 실패 단계 | 발생한 상황 |
|---|---|
| 목표 탈취 | 봇이 관련 없는 요리 요청을 서비스 설명이라는 자신의 목표의 일부로 취급했습니다. |
| 기능 드리프트 | 역할에 코드 생성 기능이 포함되어 있지 않음에도 불구하고 실행 가능한 Python 코드를 생성했습니다. |
| 프롬프트 유출 | 숨겨져 있어야 할 시스템 프롬프트를 그대로 출력했습니다. |
각 단계는 많은 배포 환경에서 모델 자체가 강제할 것이라고 가정하는 서로 다른 방어 계층의 붕괴를 나타냅니다.
실제로 작동하는 방어 계층
가드레일을 모델 외부로 옮겨 결정론적(deterministic) 코드로 구현하면 신뢰할 수 있는 보안 경계를 복구할 수 있습니다.
- 작업 라우팅(Task routing) – 별도의 분류기를 사용하여 들어오는 메시지를 허용된 의도(intents) 목록에 매핑합니다. 요청이 해당 목록을 벗어나면 즉시 거부합니다. 이렇게 하면 모델이 관련성에 대해 논쟁할 기회조차 갖지 못합니다.
- 최소 권한(Least capability) – 봇에게 불필요한 도구는 제거합니다. 코드 실행이나 광범위한 데이터베이스 액세스가 필요하지 않다면 해당 기능을 삭제하십시오.
- 결정론적 권한 부여(Deterministic authorization) – 권한 확인은 언어 모델이 아닌 애플리케이션 코드에서 수행합니다. 모델은 동작을 제안할 수 있지만, 실행 여부는 코드가 결정합니다.
- 출력 검증(Output validation) – 모델의 응답이 사용자에게 도달하기 전에 시스템 프롬프트나 민감한 데이터와 같이 허용되지 않은 콘텐츠가 포함되어 있는지 스캔합니다.
단순히 "이 요청이 금지되었는가?"라고 묻는 필터는 설득력 있는 사용자에 의해 우회될 수 있습니다. 하지만 폐쇄된 목록을 기준으로 확인하는 라우팅 계층은 협상의 여지를 남기지 않습니다.
향후 주의 사항
대화형 AI에 의존하는 기업은 양고기 레시피 테스트에서 보여준 세 가지 실패 모드에 대해 배포 환경을 감사해야 합니다. 그동안에는 모든 시스템 프롬프트를 공개된 지식으로 간주하십시오. 시스템 프롬프트가 모델의 정보 노출을 막아줄 것이라고 기대해서는 안 됩니다.
시사점은 명확합니다. 보안 모델이 자연어 지침 한 단락에 의존하고 있다면, 그 모델은 취약합니다. 모델이 무엇을 말하든 상관없이 감사, 버전 관리 및 강제가 가능한 코드로 보안을 강화하십시오.
