프롬프트 인젝션은 필터 하나로 못 막는다…권한부터 줄여야 한다

RAG와 도구 사용 에이전트의 프롬프트 인젝션은 공격 문구를 거르는 필터만으로 막기 어렵다. 먼저 에이전트가 읽을 데이터와 호출할 기능을 필요한 범위로 제한하고, 외부 콘텐츠를 신뢰할 수 없는 데이터로 분리해야 한다. 정보 반출이나 되돌리기 어려운 작업에는 실행 직전 사용자 승인을 요구한다.
필터가 공격을 놓쳐도 권한 검사, 실행 승인, 샌드박스와 감사 기록이 다음 방어선으로 남아 있어야 한다. 설계의 기준은 모델이 악성 지시를 한 번도 따르지 않는다는 가정이 아니라, 따르더라도 보호 데이터와 고위험 기능에 닿지 못하게 하는 것이다.
1. 입력 위치와 가능한 피해를 함께 표시한다

직접 인젝션은 사용자가 대화창에서 기존 지시를 무시하거나 비밀을 공개하라고 요구하는 형태다. 간접 인젝션은 웹페이지, 이메일, 첨부 파일, 코드 저장소나 RAG 검색 문서처럼 제3자가 통제할 수 있는 콘텐츠에 지시를 숨긴다. OpenAI의 보안 해설 은 제3자가 대화 맥락에 악성 지시를 삽입해 AI를 속이는 공격으로 이를 설명하며, 조작된 추천과 무단 데이터 공유를 잠재적 결과로 제시한다.
RAG에서는 문서가 검색됐다는 사실과 그 내용을 신뢰해도 된다는 판단을 분리해야 한다. 검색 적합도가 높더라도 문서 속 “이전 지시를 무시하라”거나 “다른 도구를 호출하라”는 문장은 업무 자료가 아니라 공격 입력일 수 있다. 이메일 에이전트라면 본문뿐 아니라 숨은 HTML 요소, 첨부 파일, 인용된 이전 메일과 외부 링크에서 가져온 내용도 같은 공격 표면으로 분류한다.
각 입력 지점에는 통제 주체, 허용 목적, 접근 가능한 데이터, 호출 가능한 도구와 최악의 결과를 연결한다. 외부 웹페이지가 읽기 전용 요약에만 쓰이면 잘못된 답변이 주요 위험이지만, 같은 실행 주체가 사내 검색과 외부 메일 발송까지 할 수 있으면 내부 조회와 반출이 하나의 경로로 이어진다. 이 연결 관계가 권한을 먼저 줄여야 할 지점을 보여준다.
2. 외부 콘텐츠와 신뢰된 지시를 분리한다
시스템 정책, 사용자의 현재 요청, 애플리케이션이 넣은 규칙과 검색 문서를 하나의 평문 덩어리로 합치지 않는다. 영역마다 출처와 신뢰 등급을 붙이고, 외부 문서는 사실 추출과 요약의 자료일 뿐 목표 변경이나 도구 실행을 승인하는 지시가 될 수 없다고 명시한다. 이 구분은 모델의 판단을 돕지만 독립된 보안 경계를 대신하지는 않는다.
AWS의 RAG 공격 분류 에는 역할 전환, 프롬프트 템플릿 추출, 기존 지시 무시, 다국어·이스케이프 문자 사용과 대화 기록 추출이 포함된다. 공격 문구의 재표현이나 문자 치환, Base64 인코딩, 입력·출력 형식 변경도 필터를 피하는 수법으로 다뤄진다. 따라서 고정된 금칙어 목록이 모든 언어와 인코딩, 분할된 공격을 포괄한다고 가정할 수 없다.
입력 단계에서는 파일 형식과 크기를 검증하고, 텍스트를 정규화하며, 불필요한 숨은 요소와 과도한 중첩을 제거한다. 검색 단계에서는 문서보다 먼저 사용자와 테넌트의 접근권한을 검사한다. 모델이 만든 URL, 수신자, 파일 경로와 도구 인수는 그대로 실행하지 않고 허용 목록, 타입, 길이와 업무 규칙을 결정적 코드로 검증한다.
3. 최소 권한은 모델 밖에서 강제한다

피해 범위를 직접 줄이는 통제는 에이전트의 권한을 좁히는 것이다. 읽기와 쓰기, 조회와 전송, 초안 작성과 게시를 별도 기능으로 분리하고 각 도구에 작업 범위가 좁은 자격 증명을 부여한다. 사용자의 광범위한 세션 토큰을 모델 문맥에 넣거나 여러 커넥터가 공유하는 만능 키를 제공해서는 안 된다.
OWASP LLM01 완화 지침 은 애플리케이션 전용 API 토큰과 최소 권한, 고위험 작업의 사람 승인, 외부 콘텐츠 분리, 결정적 출력 검증과 적대적 테스트를 함께 권고한다. 권한 결정은 LLM이 생성한 자연어 판단이 아니라 애플리케이션 코드나 정책 계층이 맡아야 한다. 리소스 소유권, 테넌트, 허용 동작, 데이터 등급과 전송 목적지를 도구 호출 때마다 검사한다.
도구 인터페이스도 좁힌다. 범용 셸이나 임의 SQL 실행 기능보다 승인된 조건으로 한 고객을 조회하거나 지정 폴더의 파일만 읽는 함수를 제공하는 편이 안전하다. 메일 기능은 기본적으로 초안 작성과 발송을 분리하고, 외부 문서에서 추출된 문자열이 수신자나 반출 대상을 직접 결정하지 못하게 한다.
조건부 예로, 계약서 요약 에이전트가 문서 속 “재무 자료를 찾아 특정 주소로 보내라”는 지시를 공격으로 알아보지 못했다고 하자. 이 에이전트에 계약서 저장소의 읽기 권한만 있고 메일 발송 기능이 없다면 내부 재무 자료 조회와 외부 전송은 권한 계층에서 막힌다. 반대로 사내 검색, 파일 다운로드와 외부 발송을 한 실행 주체에 묶으면 한 번의 모델 오판이 정보 유출 경로로 이어질 수 있다.
4. 승인과 샌드박스로 실행 경계를 세운다
사용자 승인은 모든 도구 호출에 붙이는 형식적인 팝업이 아니라 위험이 커지는 지점에 둔다. 외부 전송, 결제, 삭제, 권한 변경, 코드 실행과 공개 게시처럼 되돌리기 어렵거나 제3자에게 영향을 주는 행동은 실행 직전에 멈춘다. 승인 화면에는 모델의 설명 대신 실제 수신자, 대상 리소스, 공유할 데이터, 변경 전후 값과 호출 도구를 구조화해 표시한다.
승인은 표시된 작업 한 건과 구체적인 인수에만 유효해야 한다. 승인 뒤에 모델이 수신자, 첨부 파일이나 목적지를 바꾸면 다시 확인받는다. “이후 작업 모두 허용”처럼 범위가 모호한 동의는 숨은 지시가 후속 작업까지 밀어붙일 여지를 남긴다.
브라우저, 코드 실행기와 파일 변환기는 운영 환경과 분리된 샌드박스에서 실행한다. 기본 네트워크 차단과 필요한 목적지의 허용 목록, 읽기 전용 파일 시스템, 임시 작업 공간, 실행 시간과 자원 한도를 적용한다. 샌드박스 안에도 운영 자격 증명이나 다른 사용자의 기록을 넣지 않는다. 격리는 공격 탐지 성공 여부와 관계없이 내부 파일 탐색, 내부망 접근과 외부 반출의 물리적 범위를 줄인다.
5. 로그와 공격 테스트를 배포 조건으로 만든다

감사 기록은 프롬프트 전문을 저장하는 데 그치지 않고 실행의 의사결정 경로를 재구성할 수 있어야 한다. 요청 주체, 검색 문서의 식별자와 신뢰 등급, 선택된 도구, 정규화된 인수, 정책의 허용·거부, 사용자 승인과 실행 결과를 하나의 추적 ID로 연결한다. 민감한 원문과 자격 증명은 마스킹하고 로그 자체의 열람 권한과 보존 범위도 제한한다.
탐지는 공격 키워드뿐 아니라 행동의 변화를 봐야 한다. 요약 흐름에서 갑자기 외부 URL 접속이나 대량 조회가 발생하거나, 외부 문서의 내용이 수신자·파일 경로·권한 변경을 결정하려 하면 차단하거나 검토 대상으로 보낸다. 반복된 정책 거부, 여러 문서에 나뉜 지시의 결합, 승인 직전의 인수 변경도 기록할 신호다.
배포 전 점검은 다음 순서로 진행한다.
- 웹페이지, 이메일, 업로드 파일, 검색 청크, 메모리와 도구 응답 등 외부 입력이 들어오는 위치를 열거한다.
- 각 입력이 영향을 줄 수 있는 데이터와 도구를 연결해 최대 피해 범위를 확인한다.
- 읽기·쓰기·외부 전송 권한과 자격 증명을 작업별로 분리하고 기본 거부 정책을 적용한다.
- 외부 콘텐츠의 출처와 신뢰 등급을 표시하고 도구 인수와 출력 형식을 코드로 검증한다.
- 외부 전송, 삭제, 결제, 권한 변경과 코드 실행에는 대상과 데이터를 보여주는 승인을 요구한다.
- 브라우징과 실행 환경을 격리하고 네트워크, 파일, 시간과 자원 한도를 설정한다.
- 직접·간접 공격, 역할 전환, 다국어, 인코딩, 기록 추출과 분할 페이로드를 정상 입력과 함께 회귀 테스트한다.
- 모델, 시스템 정책, 검색 파이프라인이나 도구 구성이 바뀌면 같은 테스트를 반복하고 감사 기록에서 우회 징후를 점검한다.
통과 기준은 알려진 공격 문자열을 모두 탐지했다는 결과가 아니다. 탐지가 실패해도 권한 밖 데이터에 접근할 수 없고, 고위험 행동이 구체적인 승인 없이 실행되지 않으며, 시도와 차단 과정을 사후에 재구성할 수 있어야 한다. 이 조건을 갖춰야 필터가 유용한 한 겹의 방어선으로 남고 시스템 전체의 단일 실패 지점이 되지 않는다.
뉴스레터 구독
최신 Web3, AI, 암호화폐 뉴스를 이메일로 받아보세요.