시스템 프롬프트 유출
시스템 프롬프트 유출 (LLM07:2025) — 도둑맞은 지시문이 열쇠가 될 때
시스템 프롬프트(System Prompt)는 모델 행동을 애플리케이션 요구에 맞게 유도하는 지시문이에요. 그런데 이 안에 외부에 알려지면 안 되는 비밀이 담길 수가 있는데요, 이게 노출되면 다른 공격을 돕는 재료가 됩니다. 중요한 것은 시스템 프롬프트는 비밀이 아니며 보안 통제로 써서도 안 된다는 점이에요. OWASP가 정리한 LLM07:2025 위험 정의와 완화 전략을 강사 목소리로 풀어볼게요.
출처: OWASP GenAI Security Project — LLM07:2025 System Prompt Leakage
진짜 위험은 프롬프트 유출 자체가 아니에요
꼭 짚고 넘어가야 할 점이 있어요. 시스템 프롬프트가 유출됐다고 해서 그 자체가 치명적이진 않아요. 진짜 문제는 그 밑에 있는 요소들이에요 — 민감정보 노출, 가드레일 우회, 권한 분리 실패 같은 것들이죠. 시스템 프롬프트에 크레덴셜이나 연결 문자열 같은 민감 데이터를 넣었는데, 권한 관리와 인가 검증을 LLM에 위임해 버리면, 유출 한 번으로 세션 관리와 인가 검사를 통째로 우회하는 상황이 만들어져요.
또 하나 알아둘 점이 있어요. 설령 정확한 문구가 통째로 새지 않더라도, 공격자는 앱을 사용하면서 입력을 보내고 결과를 관찰하는 것만으로도 프롬프트에 있는 가드레일과 형식 제약을 대부분 알아낼 수 있어요. 그래서 '문구를 숨기면 안전하다'는 접근은 근본적으로 취약해요.
민감정보가 노출되는 형태
- 민감 기능 노출 — 시스템 아키텍처, API 키, DB 자격증명, 사용자 토큰 같은 정보가 프롬프트에 담겨 있고, 이를 추출해 무단 접근에 쓰는 경우. 예를 들어 프롬프트에 사용하는 DB 종류가 드러나면 공격자가 SQL 인젝션을 노릴 수 있어요.
- 내부 규칙 노출 — '일일 거래 한도는 $5,000, 총 대출액은 $10,000' 같은 내부 결정 규칙이 드러나면, 공격자가 이 정보로 통제를 우회해 한도를 넘는 거래를 시도할 수 있어요.
- 필터링 기준 노출 — 특정 요청을 거절하라는 필터 지시가 드러나는 경우.
- 권한·역할 노출 — '관리자 역할은 사용자 레코드 수정에 전체 접근 가능' 같은 역할 구조가 드러나면, 공격자가 권한 상승 공격을 찾아볼 수 있어요.
완화 전략
- 시스템 프롬프트에서 민감 데이터 분리 — API 키, 인증 키, DB 이름, 사용자 역할, 권한 구조를 프롬프트에 직접 넣지 말고, 모델이 직접 접근하지 않는 시스템으로 외부화해요.
- 시스템 프롬프트로 엄격한 행동 통제에 의존하지 않기 — 프롬프트 인젝션으로 시스템 프롬프트가 바뀔 수 있으니, 모델 행동 통제는 LLM 밖의 시스템에 맡겨요. 유해 콘텐츠 탐지·차단도 외부 시스템에서 처리하는 게 안전해요.
- 가드레일 구현 — LLM 밖에 독립적인 가드레일 시스템을 두고, 모델이 기대에 부합하는지 출력을 검사해요. '시스템 프롬프트를 공개하지 말라'는 행동을 모델에 학습시켜도 항상 지켜진다는 보장은 없으니, 독립 검사가 더 확실해요.
- 보안 통제를 LLM과 독립적으로 강제 — 권한 분리, 인가 경계 검사 같은 핵심 통제를 LLM에 위임하지 마요. 결정적이고 감사 가능한 방식으로 LLM 밖에서 처리해야 해요. 에이전트가 작업을 수행할 때 서로 다른 접근 수준이 필요하다면, 각각 최소 권한으로 설정된 여러 에이전트를 사용해요.
예시 공격 시나리오
- 시스템 프롬프트에 특정 도구용 크레덴셜이 들어 있는데, 프롬프트가 유출돼 공격자가 그 크레덴셜을 다른 용도로 쓰는 경우.
- 공격자가 시스템 프롬프트를 추출한 뒤, 유해 콘텐츠·외부 링크·코드 실행을 금지하는 지시를 프롬프트 인젝션으로 우회해 원격 코드 실행 공격을 일으키는 경우.