이 문서는 GenAI 개념 섹션의 일부입니다.
Prompt Injection이란?
Prompt Injection은 악의적 사용자가 프롬프트를 조작하여 모델의 원래 지시를 무시하게 만드는 공격 입니다. Enterprise 환경에서 반드시 방어해야 합니다.공격 유형
Prompt Injection 공격은 크게 3가지 유형으로 나뉩니다. 특히 Indirect Injection 은 RAG 시스템에서 탐지가 어려워 가장 위험합니다.방어 기법
단일 기법으로 완벽한 방어는 불가능하므로, 아래 기법들을 다층적으로 조합 하여 적용해야 합니다.방어적 System Prompt 예시
주의 핵심: Prompt Injection을 100% 방어하는 방법은 없습니다. 다층 방어(프롬프트 설계 + 입출력 필터 + 권한 제한)를 조합하세요.
Indirect Prompt Injection 심층 분석
Direct Injection은 사용자가 직접 악의적 프롬프트를 입력하는 것이므로 비교적 탐지가 쉽습니다. 그러나 Indirect Injection 은 LLM이 처리하는 외부 데이터 소스 에 공격 페이로드를 숨기기 때문에 탐지와 방어가 훨씬 어렵습니다.RAG를 통한 간접 주입
RAG(Retrieval-Augmented Generation) 시스템은 사용자 질문에 답하기 위해 외부 문서를 검색한 뒤 LLM에 컨텍스트로 제공합니다. 공격자가 이 검색 대상 문서에 악의적 지시를 삽입하면, LLM은 해당 지시를 신뢰할 수 있는 컨텍스트의 일부 로 처리합니다. 공격 시나리오:- 탐지 어려움: 문서가 수천~수만 건일 때 모든 문서를 수동 검토하는 것은 불가능
- 신뢰 경계 모호: LLM 입장에서 System Prompt, 검색된 문서, 사용자 입력이 모두 텍스트로 연결되어 경계가 불분명
- 지속적 공격: 한 번 삽입된 악의적 문서는 삭제 전까지 모든 관련 질의에 영향
실제 사례: Microsoft Copilot 간접 주입 (2024)
2024년, 보안 연구원들이 Microsoft 365 Copilot 에 대한 간접 프롬프트 주입 공격을 시연했습니다:- 공격자가 공유 SharePoint 문서 에 눈에 보이지 않는 악의적 지시를 삽입
- 피해자가 Copilot에게 해당 문서와 관련된 질문을 함
- Copilot이 문서를 검색하면서 숨겨진 지시를 실행— 피해자의 이메일 요약, 캘린더 정보 등 민감 데이터를 공격자에게 전달하도록 유도
- 이 공격은 ASCII Smuggling 기법(사람 눈에 보이지 않는 유니코드 태그 문자 사용)을 활용하여 악의적 지시를 완전히 숨김
위험 핵심 교훈: RAG 시스템에서 LLM이 접근하는 모든 외부 데이터는 잠재적 공격 벡터입니다. 문서가 “내부 문서”라고 해서 안전하다고 가정하면 안 됩니다. 내부 위키, 공유 드라이브, 이메일 첨부파일 모두 공격 대상이 될 수 있습니다.
간접 주입 방어 전략
컨텍스트 격리 프롬프트 예시:
OWASP LLM Top 10 (2025)
OWASP(Open Worldwide Application Security Project)는 2025년에 LLM 애플리케이션을 위한 Top 10 보안 위협 을 발표했습니다. 전통적인 웹 애플리케이션 OWASP Top 10과 별도로, LLM 특유의 위협을 정의한 것입니다.참고 참고: 전체 목록은 OWASP Top 10 for LLM Applications 에서 확인할 수 있습니다. 여기서는 Enterprise 환경에서 가장 영향이 큰 4가지 위협을 중점적으로 다룹니다.
LLM01: Prompt Injection (프롬프트 주입)
OWASP LLM Top 10에서 1위 로 선정된 위협입니다. 직접 주입과 간접 주입을 모두 포함합니다. 위험 등급: 🔴 Critical
Databricks 환경에서의 방어:
- Databricks AI Guardrails 로 입출력에 대한 자동 필터링 규칙 설정
- Agent Framework 의 도구 접근 제어를 통해 민감한 테이블에 대한 접근 차단
- Unity Catalog의 행/열 수준 권한 으로 Agent가 조회할 수 있는 데이터 범위를 제한
LLM02: Sensitive Information Disclosure (민감 정보 유출)
LLM이 학습 데이터나 컨텍스트에 포함된 개인정보(PII), 비즈니스 기밀, 시스템 정보 를 응답에 포함시키는 위협입니다. 위험 등급: 🔴 Critical
Databricks 환경에서의 방어:
- Unity Catalog에서 PII 컬럼에 태그(
contains_pii)를 지정하고, Agent의 서비스 주체(Service Principal)에 해당 컬럼 접근 권한을 부여하지 않음 - 출력 검증 레이어 에서 정규식 기반 PII 탐지 (주민등록번호, 전화번호, 이메일 등)
- Databricks AI Guardrails의 PII 마스킹 기능 활성화
- RAG 파이프라인에서 검색된 문서 chunk에 대해 접근 권한 필터링(사용자 권한에 따라 검색 결과 제한)
LLM03: Supply Chain Vulnerabilities (공급망 취약점)
서드파티 모델, 플러그인, 학습 데이터, 프레임워크 등 외부 공급망 을 통해 유입되는 취약점입니다. 위험 등급: 🟠 High
Databricks 환경에서의 방어:
- Databricks Marketplace 또는 검증된 소스의 모델만 사용
- MLflow Model Registry 에서 모델 버전 관리 및 승인 워크플로우 적용
- Unity Catalog의 Registered Models 로 모델 계보(lineage) 추적
- 서드파티 모델 도입 시 보안 검토 프로세스 의무화 (모델 카드, 학습 데이터 출처, 라이선스 확인)
LLM06: Excessive Agency (과도한 에이전시)
LLM 기반 Agent에 과도한 권한 이 부여되어, 의도치 않은 행동을 실행할 수 있는 위협입니다. Agent가 도구를 호출할 수 있는 환경에서 특히 위험합니다. 위험 등급: 🟠 High
Databricks 환경에서의 방어:
- Agent의 서비스 주체에 SELECT 전용 권한 부여 (DDL/DML 차단)
- Unity Catalog의 Function 수준 권한 으로 Agent가 호출 가능한 UC Function을 제한
- Agent Framework에서 도구 allowlist 를 명시적으로 정의
- 위험한 작업(DELETE, 외부 전송 등)은 Human-in-the-Loop 승인 절차를 필수로 설정
주의 Agent 권한 원칙: Agent에게 부여하는 권한은 반드시 최소 권한 원칙(Principle of Least Privilege) 을 따라야 합니다. “나중에 필요할 수 있으니 넉넉히”라는 접근은 LLM 환경에서 매우 위험합니다. LLM은 예측 불가능한 방식으로 도구를 조합할 수 있기 때문입니다.
다층 방어 아키텍처 (Defense in Depth)
단일 방어 기법으로는 LLM 보안을 보장할 수 없습니다. 4개 계층의 다층 방어 를 조합하여 각 계층이 서로의 약점을 보완하도록 설계해야 합니다.Layer 1: 입력 검증 (Input Validation)
사용자 입력이 LLM에 도달하기 전에 필터링하는 첫 번째 방어선 입니다.
Python 구현 예시:
참고 주의: 패턴 기반 필터링만으로는 우회가 가능 합니다. 공격자는 오타, 동의어, 다국어 혼합 등으로 패턴을 회피할 수 있습니다. 반드시 다른 계층과 조합하여 사용하세요.
Layer 2: 프롬프트 설계 (Prompt Design)
LLM이 악의적 입력을 받더라도 원래 의도대로 동작하도록 프롬프트 자체를 견고하게 설계합니다.
견고한 System Prompt 템플릿:
Layer 3: 출력 검증 (Output Validation)
LLM의 응답을 사용자에게 전달하기 전에 최종 검증 을 수행합니다.
Canary Token 기법:
Layer 4: 인프라 보안 (Infrastructure)
애플리케이션 레벨을 넘어 플랫폼과 인프라 수준 에서 보안을 강제합니다.
참고
Databricks AI Guardrails 설정 예시: Serving Endpoint 생성 시 guardrails 파라미터로 입출력 규칙을 정의할 수 있습니다. 토픽 제한(예: “금융 상담만 허용”), PII 자동 마스킹, 금지어 목록 등을 선언적으로 설정합니다.
Agent 보안 특수 고려사항
일반적인 LLM 챗봇과 달리, Agent 는 도구(Tool)를 호출하여 실제 시스템에 영향을 줄 수 있습니다. 따라서 Prompt Injection의 영향이 텍스트 출력을 넘어 실제 행위 실행 으로 확대됩니다.Agent에서 Prompt Injection이 더 위험한 이유
SQL Injection via LLM
Agent가 SQL을 생성하고 실행하는 환경에서, 사용자의 자연어 입력이 악의적 SQL로 변환 될 수 있습니다. 공격 시나리오:- Agent의 서비스 주체에 SELECT 전용 권한 부여 (INSERT, UPDATE, DELETE, DROP 차단)
- 생성된 SQL을 실행 전에 파싱하여 위험한 키워드 탐지(DROP, DELETE, INSERT INTO external, GRANT 등)
- 읽기 전용 SQL Warehouse 를 Agent 전용으로 프로비저닝
- Unity Catalog의 뷰(View) 를 통해 Agent가 접근 가능한 데이터를 한 번 더 제한
도구 호출 결과를 통한 2차 주입 (Second-Order Injection)
Agent가 외부 API나 웹 검색 결과를 받아올 때, 해당 결과에 악의적 지시가 포함 될 수 있습니다. 이를 2차 간접 주입(Second-Order Indirect Injection) 이라 합니다. 공격 흐름:- 외부 API/웹 검색 결과를 LLM에 전달하기 전 입력 검증 동일하게 적용
- 도구 호출 결과에서 명령형 문장 패턴 탐지 및 제거
- Agent가 외부로 데이터를 전송하는 도구(HTTP POST, 이메일 발송 등)를 보유하지 않도록 설계
- 민감한 작업은 반드시 Human-in-the-Loop 승인 후 실행
Human-in-the-Loop (사람 승인 절차)
변동성가 높은 Agent 행위에 대해 사람의 승인 을 요구하는 패턴입니다.주의 Agent의 도구 접근은 “기본 거부(Default Deny)” 원칙을 적용하세요. 필요한 도구만 명시적으로 허용(allowlist)하고, 허용되지 않은 도구 호출은 자동 차단합니다.
실전 보안 체크리스트
Agent 또는 RAG 시스템을 프로덕션에 배포하기 전, 아래 15개 항목 을 반드시 점검하세요.위험 배포 전 필수: 위 15개 항목 중 하나라도 “미확인”이면 프로덕션 배포를 보류하세요. 특히 #10 (최소 권한) 과 #12 (Human-in-the-Loop) 는 Agent 시스템에서 가장 치명적인 보안 사고를 예방하는 핵심 항목입니다.