📕 428커밋의 기록이 상품이 됐습니다 →
agenwiki

AI

프롬프트 인젝션

입력이나 외부 문서에 지시문을 심어 모델이 원래 규칙 대신 그 지시를 따르게 만드는 공격이다. 모델이 지시와 데이터를 같은 텍스트로 읽는다는 성질에서 비롯된다.

최종 수정

개념

프롬프트 인젝션(prompt injection)은 모델에게 들어가는 텍스트 안에 지시문을 심어, 원래 정해진 규칙 대신 공격자가 원하는 대로 행동하게 만드는 공격이다. 원인은 구조에 있다. 모델은 시스템 프롬프트에 적힌 규칙과 사용자가 보낸 내용, 검색해 온 문서를 모두 같은 종류의 텍스트로 읽는다. 어디까지가 따라야 할 명령이고 어디부터가 그저 처리 대상인 데이터인지 문법적으로 구분되지 않는다.

크게 두 갈래로 나뉜다. 직접 인젝션은 사용자가 대화창에 이전 지시를 무시하라는 식의 문장을 직접 넣는 방식이다. 간접 인젝션은 모델이 읽어 들이는 외부 자료에 지시문을 미리 숨겨 두는 방식으로, 웹페이지나 이메일, RAG로 가져오는 문서, 코드 주석 등이 통로가 된다. 사용자는 아무 잘못도 하지 않았는데 모델이 읽은 자료 때문에 공격이 성립한다는 점에서 간접 쪽이 실전에서 더 까다롭다.

노리는 결과는 시스템 프롬프트 유출, 금지된 답변 유도, 그리고 함수 호출을 통한 실제 동작 실행이다. 도구를 쥔 AI 에이전트일수록 피해 범위가 커진다.

SQL 인젝션과 자주 비교되지만 해결의 난이도는 다르다. SQL에서는 명령과 값을 문법적으로 분리하는 방법이 있어 근본적인 차단이 가능하지만, 자연어에는 그런 경계가 존재하지 않는다. 그래서 완전한 방지책이라 할 만한 것이 아직 없고, 발생을 전제로 피해를 줄이는 설계 쪽으로 접근하게 된다.

쓰임새

방어에는 하나로 끝나는 해법이 없어 여러 겹을 쌓는 방식으로 접근한다. 외부에서 들어온 텍스트를 명령이 아닌 데이터로 명확히 구분해 전달하고, 모델에 주는 권한을 필요한 최소한으로 줄이며, 되돌릴 수 없는 동작에는 사람의 승인을 붙인다. 출력에 담긴 링크나 코드를 그대로 실행하거나 전송하지 않는 것도 기본에 속한다.

특히 권한 축소가 실질적으로 가장 효과가 크다. 인젝션 자체를 완벽히 막기는 어렵지만, 모델이 할 수 있는 일이 조회뿐이라면 공격이 성공해도 피해가 제한된다. 가드레일은 이 통제를 코드 층에 구현하는 수단이다.

에이전트에서는 두 가지 능력이 겹칠 때 특히 위험하다. 외부에서 들어온 내용을 읽는 능력과, 밖으로 무언가를 내보내는 능력이다. 문서를 읽고 메일을 보낼 수 있는 에이전트라면 문서에 심어 둔 지시만으로 내부 정보가 빠져나갈 수 있다. 둘 중 하나를 끊어 두거나 사이에 사람의 확인을 넣는 것만으로도 경로 자체가 사라진다.

자주 하는 오해

시스템 프롬프트에 무시하지 말라고 적으면 막히지 않나?

그 문장 역시 같은 텍스트라 함께 무력화될 수 있다. 프롬프트 안에서만 완결되는 방어는 신뢰하기 어렵다.

사용자 입력만 검사하면 되는 것 아닌가?

모델이 읽는 모든 외부 자료가 통로다. 검색한 웹페이지나 첨부 문서를 타고 들어오는 간접 인젝션을 함께 고려해야 한다.

프롬프트 인젝션은 탈옥(jailbreak)과 같은 말 아닌가?

겹치는 부분이 있지만 초점이 다르다. 탈옥은 모델의 안전 정책을 우회하는 데 목적이 있고, 인젝션은 애플리케이션이 정해 둔 동작을 가로채는 데 목적이 있다. 그래서 방어의 책임도 갈린다. 탈옥은 모델을 만드는 쪽이, 인젝션은 애플리케이션을 만드는 쪽이 주로 감당해야 한다.

관련 용어

관련 글

용어

에이전트 메모리

에이전트가 대화나 작업이 끝난 뒤에도 필요한 정보를 남겨 두고 다음에 다시 꺼내 쓰는 구조다. 컨텍스트 윈도우 밖에 정보를 저장해 두고 필요할 때만 불러온다.

용어

에이전틱 워크플로

모델이 한 번에 답하는 대신 계획·실행·점검을 여러 차례 반복하며 작업을 진행하도록 짜 놓은 구성이다. 도구 호출과 자기 점검을 루프로 묶어 한 번의 응답으로는 어려운 일을 해낸다.