설명
간접 프롬프트 인젝션은 공격자가 웹 페이지나 문서 같은 외부 리소스에 지시를 삽입하고, 애플리케이션이 그 콘텐츠를 모델 컨텍스트로 가져올 때 발생합니다. 모델이 데이터와 지시를 완전히 구분하지 못하면 공격자가 넣은 문장이 원래 작업을 바꾸거나 후속 동작을 유도할 수 있습니다.
이 취약점의 실제 영향은 모델 호출 자체보다 모델이 접근할 수 있는 비밀정보·도구·권한과 모델 출력의 후속 사용 방식에 크게 좌우됩니다. 외부 콘텐츠를 변경할 수 있는 주체와 모델의 권한 경계를 함께 검토하세요.
잠재적 영향
- 요약·분류·추천 결과가 공격자가 원하는 방향으로 조작될 수 있습니다.
- 모델이 비밀정보나 외부 도구에 접근하면 데이터 유출이나 권한 없는 작업으로 이어질 수 있습니다.
- 모델 출력이 명령, 코드, 승인 또는 보안 의사결정에 사용되면 무결성과 가용성 영향이 커질 수 있습니다.
해결 방법
프롬프트 인젝션을 모든 문맥에서 안전하게 제거하는 범용 문자열 새니타이저는 없습니다. 구분자, 역할 분리, 인코딩, RAG, 미세 조정, 또는 “외부 지시를 무시하라”는 시스템 프롬프트는 위험을 줄일 수 있지만 완전한 방어로 취급하면 안 됩니다.
- 외부 콘텐츠의 신뢰 경계를 유지하세요. 출처와 콘텐츠 유형을 기록하고, 불필요한 소스·크기·형식을 제한하세요. 허용 목록에 있는 도메인이라는 이유만으로 그 응답 본문을 신뢰하지 마세요.
- 모델의 권한과 데이터 접근을 최소화하세요. 모델에 필요한 도구와 데이터만 제공하고, 비밀정보와 부작용이 있는 작업에서 격리하세요.
- 권한 부여를 모델 밖에서 시행하세요. 도구 인수와 전송 대상은 결정론적 코드에서 엄격한 스키마와 허용 목록으로 검증하고, 고위험 작업에는 사용자 확인을 요구하세요.
- 출력을 제한하고 검증하세요. 가능한 경우 구조화된 출력이나 유한한 선택지를 사용하고, 후속 처리 전에 서버 코드에서 검증하세요. 스키마는 구조만 증명하며 의미상 안전성을 증명하지 않으므로 값과 권한 부여 정책을 별도로 검사하세요. 모델 출력만으로 명령을 실행하거나 보안 결정을 내리지 마세요.
- 공격을 반복 시험하세요. 모델이나 프롬프트가 바뀔 때마다 간접 인젝션 시나리오를 여러 번 평가하고, 입력·출력·도구 호출을 모니터링하세요.
예시
변경 전
javascript
const express = require("express");
const { fetch } = require("undici");
const { streamText } = require("ai");
const { openai } = require("@ai-sdk/openai");
const app = express();
app.post("/bad1", async (_req, res) => {
const retrieved = await (
await fetch("https://example.com/manual")
).text();
await streamText({
model: openai("gpt-5.6"),
prompt: "Summarize this document:\n" + retrieved
});
res.send("ok");
});
변경 후
javascript
const express = require("express");
const { streamText } = require("ai");
const { openai } = require("@ai-sdk/openai");
const app = express();
app.post("/good", async (_req, res) => {
await streamText({
model: openai("gpt-5.6"),
prompt: "Summarize this internal FAQ: Support is available Monday through Friday."
});
res.send("ok");
});
설명:
- 변경 전: 원격 문서 본문을 모델 입력에 포함합니다. 공격자가 문서를 변경할 수 있다면 본문에 숨긴 지시가 요약 작업에 영향을 줄 수 있습니다.
- 변경 후: 신뢰되지 않은 외부 콘텐츠를 모델에 전달하지 않고 서버가 작성한 고정 FAQ 내용만 전달합니다. 원격 콘텐츠가 업무상 반드시 필요하다면 위의 다층 통제로 영향을 제한해야 하며, 단순한 문자열 구분만으로 이 코드와 동등하게 안전해지지는 않습니다.
참조
- OWASP Top 10 for LLM Applications 2026
- OWASP LLM01:2025 Prompt Injection (위험 설명 참고)
- CWE-1427: Improper Neutralization of Input Used for LLM Prompting
- NIST AI 100-2 E2025: Adversarial Machine Learning
- OpenAI: Understanding prompt injections
- OpenAI: Designing AI agents to resist prompt injection
- Vercel AI SDK: Generating and Streaming Text
- OpenAI Node SDK
- Anthropic TypeScript SDK