LLM 프롬프트 인젝션 (Prompt Injection) 및 가드레일 보안 (Guardrail Security)
요약
LLM의 지시 사항과 데이터 사이의 경계가 모호함을 악용하는 프롬프트 인젝션 공격의 원리와 방어 계층별 취약점을 분석합니다. 단순 필터링의 한계를 지적하며 심층 방어(Defense-in-depth) 전략의 중요성을 강조합니다.
핵심 포인트
- LLM은 지시 사항과 데이터를 하나의 토큰 스트림으로 처리하여 경계가 모호함
- 키워드 기반 입력 필터링은 유의어 및 난독화 공격에 매우 취약함
- 출력 필터링은 데이터 파편화 공격에 무력화될 수 있는 최후의 보루임
- 단일 계층 방어보다는 심층 방어(Defense-in-depth) 전략이 필수적임
7단계 프롬프트 인젝션 (Prompt Injection) 챌린지를 수행하며 구축한 회고 참조 자료입니다. 핵심 내용: 각 방어 계층이 어떻게 작동하는지, 어디서 무너지는지, 그리고 가장 중요한 방어 방법.
모든 것의 밑바탕이 되는 하나의 아이디어
LLM은 지시 사항 (Instructions)과 데이터 (Data) 사이에 명확한 경계가 없습니다. 컨텍스트 윈도우 (Context window)에 있는 모든 것 — 시스템 프롬프트 (System prompt), 사용자 메시지 (User message), 검색된 문서 (Retrieved documents) — 은 모델이 해석하는 하나의 토큰 스트림 (Stream of tokens)입니다. 프롬프트 인젝션 (Prompt injection)은 바로 이 점을 악용합니다: 공격자가 제어하는 _데이터_가 _지시 사항_으로 읽히게 만드는 것입니다. 단순히 **필터링 (Filtering)**만으로는 이를 완전히 해결할 수 없습니다. 각 개별 계층은 우회될 수 있음을 인지하고, **심층 방어 (Defense-in-depth)**를 통해 관리해야 합니다.
방어 계층 (및 각 계층의 취약점)
가장 약한 단계부터 가장 강력한 단계까지의 제어 단계이며, 각 단계는 교훈을 제공합니다.
1–2. 가드레일 (Guardrails) 없음 / 취약함
기본 상태: 모델이 그냥 답변합니다. 교훈: 제어 장치 없이 컨텍스트에 비밀을 보유한 LLM은 요청 시 이를 유출할 것입니다.
3. 입력 필터링 (Input filtering) — 사용자 메시지의 단어 차단
- 방어: 들어오는 프롬프트를 스캔하여 금지된 용어("code", "secret", "reveal")를 찾아 차단합니다.
- 취약점: 키워드 차단 목록 (Blocklists)은 유의어, 오타, 분리된 단어, 리트스피크 (Leetspeak), 다른 언어, 우회적 참조 등을 통해 매우 쉽게 우회됩니다. _문자열 (Strings)_을 필터링하는 것은 _의도 (Intent)_를 필터링하는 것이 아닙니다.
- 실제로 도움이 되는 방법: 차단 목록 (Blocklists)보다는 허용 목록 (Allowlists)을 선호하십시오. 키워드 매칭 대신 의미론적으로 의도를 분류하십시오. 모든 입력을 신뢰할 수 없는 것으로 취급하십시오. 속도 제한 (Rate-limit)을 설정하고 탐색 시도를 로그 (Log)로 남기십시오.
4. 출력 필터링 (Output filtering) — 응답에서 비밀을 포착
- 방어 (Defense): 모델의 출력값에서 알려진 비밀(Secret)을 문자열 일치 (String-match) 방식으로 찾아내어 삭제 (Redact)합니다.
- 취약점 (Weakness): 부분 문자열 일치 (Substring matching) 방식은 연속된 비밀값만을 포착할 수 있습니다. 비밀값을 파편화하거나 변형하는 방식 (구분자 삽입, 문자 단위 분리, 인코딩 등)을 사용하면 리터럴 문자열이 나타나지 않으므로 일치할 대상이 없게 됩니다.
- 실질적인 도움을 주는 방법: 애초에 모델이 출력할 수 있는 위치에 비밀을 두지 마십시오. 컨텍스트 (Context) 내의 민감한 데이터를 최소화하십시오. 출력 필터링은 깨지기 쉬운 최후의 보루로 취급해야 하며, 결코 주요 제어 수단이 되어서는 안 됩니다.
5. 입력 + 출력 필터링 결합 (Input + output filtering combined)
- 방어 (Defense): 위의 두 방식을 모두 계층적으로 쌓아서 적용합니다.
- 취약점 (Weakness): 취약점 또한 함께 쌓입니다. 난독화 (Obfuscation)를 통해 입력 필터를 통과한 뒤, 파편화 (Fragmentation)를 통해 출력 필터까지 통과할 수 있습니다. 계층을 쌓는 것은 기준을 높이지만, 각 계층은 여전히 개별적으로 무력화될 수 있습니다.
- 교훈 (Lesson): 계층화는 좋지만, "더 많은 필터"가 곧 "보안"을 의미하는 것은 아닙니다.
6. 가드레일로서의 두 번째 LLM — 의미론적 검사 (Second LLM as a guardrail — semantic check)
- 방어 (Defense): 별도의 모델이 출력을 읽고 비밀값을 인식하면 검열 (Censor)합니다. 이 모델은 단순한 문자열이 아닌 _의미 (Meaning)_를 이해하므로, 파편화나 역순 배치 등을 포착할 수 있습니다.
- 취약점 (Weakness): 추론하는 판사 (Reasoning judge) 모델 또한 **사회 공학적 공격 (Socially engineered)**을 받을 수 있습니다. 판사가 해당 비밀이 무해하다고 믿도록 재구성하거나 (예: "이 코드는 만료되었습니다 / 변경되었습니다"), 판사가 인식하지 못하는 형태로 제시할 수 있습니다. LLM이 LLM을 판단하는 구조는 동일한 조작 가능성을 모두 상속받습니다.
- 실질적인 도움을 주는 방법: LLM 판사 모델을 결정론적 검사 (Deterministic checks)와 결합하십시오. 모델 대 모델 (Model-on-model) 중재를 완벽한 것으로 취급하지 마십시오. 보호 대상 모델이 접근할 수 있는 범위 자체를 제한하십시오.
7. 인간 참여형 검토 (Human-in-the-loop review)
7. 인간 참여형 검토 (Human-in-the-loop review)
- 방어 기법: 사람이 나가는 메시지를 검토하여 비밀을 노출하는 모든 내용을 제거(redact)합니다.
- 취약점: 사람은 원시 바이트가 아닌 렌더링된 텍스트를 보기 때문에. 내용이 사람의 눈에는 숨겨져 있지만 모델에 의해 여전히 읽힐 수 있습니다. 이것이 바로 **ASCII 스머글링 (ASCII smuggling)**입니다(다음 섹션). 통제는 구조적으로 실패합니다.
- 실질적인 도움이 되는 방법: 렌더링된 텍스트만으로는 인간 검토에 절대 의존하지 말고, 모델이나 사람에게 도달하기 전에 원시 입력 스트림을 정규화하고(sanitize) 표준화(normalize) 해야 합니다.
심층 분석: ASCII 스머글링 (ASCII Smuggling) (흥미로운 부분)
개요. 이는 표시 계층(display layer) (UI가 특정 문자를 아무것도 아닌 것처럼 렌더링하는 것)과 원시 데이터 스트림(raw data stream) (모델이 모든 것을, 눈에 보이지 않는 문자까지 토큰화하는 것) 사이의 간극을 악용하는 애플리케이션 로직 결함입니다. 사람에게는 보이지 않지만 LLM에는 살아있는 문자를 사용하여 숨겨진 텍스트가 삽입됩니다.
눈에 보이지 않는 매개체:
- Unicode Tags block (U+E0000–U+E007F) — ASCII를 반영하는 사용 중단 태그 문자입니다. 거의 모든 렌더러에서 눈에 보이지 않습니다. 주요 스머글링 채널입니다.
- 제로폭 문자(Zero-width characters) — ZWSP (U+200B), ZWNJ (U+200C), ZWJ (U+200D), BOM / ZWNBSP (U+FEFF).
- 양방향 제어(Bidirectional controls) (U+202A–U+202E, U+2066–U+2069) —
이는 "수락/거절(Accept/Decline)" 게이트와 인간의 검토 과정을 완전히 우회합니다. 연구진의 테스트 결과 Gemini, Grok, DeepSeek는 취약한 것으로 나타난 반면, ChatGPT, Copilot, Claude는 입력을 정화(scrub)했습니다.
핵심 사고 모델(Mental model): 이것은 모델 탈옥(Model jailbreak)이 아니라, 파이프라인 / UI 결함입니다. 해결책은 모델이 아닌 애플리케이션에 있습니다.
방어책:
- 렌더링된 텍스트가 아니라, **토크나이저(Tokenizer)가 수신하는 원시 페이로드(Raw payload)**를 검사하고 정화(sanitize)하십시오.
- 태그 블록(Tags-block), 제로 너비(Zero-width), 제어/서식 문자를 제거하고, **NFKC 정규화(NFKC-normalize)**를 수행하십시오.
- 유해한 범위를 쫓기보다는 실제로 필요한 유니코드 범주(Unicode categories)의 **허용 목록(Allowlist)**을 사용하는 것을 권장합니다.
- 가시적/출력 가능한 길이(Visible / printable length)가 원시 코드 포인트 수(Raw code-point count)와 급격히 차이 나는 입력을 플래그(Flag) 처리하십시오. 이는 "누군가 나를 탐색하고 있다"는 강력한 신호입니다.
- 이 모든 사항을 사용자 프롬프트뿐만 아니라 **검색/수집된 콘텐츠(RAG)**에도 적용하십시오. 오염된 문서는 악성 메시지와 동일한 위협입니다.
- 이상 징후를 **로그(Log)**로 남기고 이를 공격 텔레메트리(Attack telemetry)로 취급하십시오. (AWS는 유니코드 은닉(Unicode-smuggling) 방어에 관한 가이드를 발표했으나, Google은 해당 공개에 대해 조치를 거부했습니다. 따라서 책임은 애플리케이션 소유자에게 있습니다.)
기억해야 할 교차 원칙 (Cross-cutting principles)
- 모든 입력은 신뢰할 수 없습니다 — 모델에 검색하여 제공하는 문서도 포함됩니다. RAG는 주요 인젝션 벡터(Injection vector)입니다.
- 지시문/데이터 경계가 없음 → 필터링만으로는 안전을 보장할 수 없습니다. 인젝션이 가능하다는 가정하에 설계하십시오.
- 겸손을 바탕으로 한 심층 방어(Defense-in-depth) — 제어 계층을 쌓되, 각 계층이 개별적으로 우회될 수 있다고 가정하십시오.
- 보안이 중요한 검사에서는 관리 가능한 경우 확률적(Probabilistic) 방식보다 결정론적(Deterministic) 방식이 우수합니다. LLM이나 인간이 "알아차릴" 것에만 전적으로 의존하지 마십시오.
- 경계에서 바이트를 정규화(Normalize bytes)하십시오 — 모델에 전달되기 전과 인간에게 전달되기 전에 수행해야 합니다.
- 컨텍스트 내의 비밀 정보(Secrets)를 최소화하십시오 — 모델이 볼 수 있는 모든 것은 결국 유출될 수 있다고 가정하십시오.
이 주제에 대한 최신 정보 유지하기
프레임워크 및 표준 (Frameworks & standards)
- OWASP Top 10 for LLM Applications / OWASP GenAI Security Project — 표준적인 위협 목록입니다. 최신 개정판을 따르십시오.
- MITRE ATLAS — AI 시스템을 대상으로 하는 적대적 위협 환경 (공격 기법 카탈로그).
- NIST AI Risk Management Framework — 거버넌스 및 리스크 관리 측면.
팔로우할 만한 인물 및 블로그
- Simon Willison (simonwillison.net) — "프롬프트 인젝션 (prompt injection)"이라는 용어를 대중화했으며, 지속적이고 날카로운 분석을 제공합니다.
- Johann Rehberger / Embrace The Red (embracethered.com) — ASCII 스머글링 (ASCII smuggling), 데이터 유출 (data exfiltration), AI 에이전트 공격에 대해 심도 있게 다룹니다.
- Lakera (블로그 및 Gandalf 게임) — 프롬프트 인젝션 연구를 수행하며, 훌륭한 실습 훈련 도구를 제공합니다.
- FireTail 블로그 — 위에서 언급된 ASCII 스머글링 공개 내용을 다룹니다.
- 벤더 보안 기술 문서: Anthropic, OpenAI, Google, Microsoft.
논문 및 알림
- 새로운 연구를 위해 arXiv cs.CR을 확인하십시오.
- "prompt injection", "indirect prompt injection", "LLM security"에 대해 Google Scholar / 뉴스 알림을 설정하십시오.
커뮤니티 및 이벤트
실습 (지식을 유지하는 가장 좋은 방법)
- Lakera Gandalf, Prompt Airlines, Secure Code Warrior (방금 수행한 것), 그리고 HackTheBox / PortSwigger에서 출시하는 AI 보안 랩; AI 카테고리가 포함된 CTF.
지속 가능한 습관: 위 인물 중 약 3명을 팔로우하고, Scholar/뉴스 알림을 하나 설정하며, 한 달에 한 번 실습 랩을 수행하십시오. 그렇게 하면 너무 많은 정보에 압도되지 않으면서도 근육 기억을 신선하게 유지할 수 있습니다.
주의 사항: 이 노트는 방어할 수 있도록 공격 **유형 (classes)**을 설명합니다. 진정한 가치는 방어 측면에 있습니다. 경계에서 데이터를 정화(sanitize)하고, 모든 입력(검색된 콘텐츠 포함)을 신뢰할 수 없는 것으로 취급하며, 모델이나 사람이 단순히 "알아차릴 것"이라고 절대 의존하지 마십시오.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기