€0.01 송금 한 번으로 은행 AI 어시스턴트를 뚫을 수 있다
A €0.01 bank transfer could compromise a banking AI agent
TL;DR Highlight
송금 메모에 심은 지시문이 은행 AI를 피싱 도구로 바꿨다
Who Should Read
거래내역·문서·메시지를 LLM 컨텍스트에 넣는 AI 어시스턴트를 운영하는 백엔드 개발자
Core Mechanics
- 송금 메모가 프롬프트 인젝션 통로였다
- 공격자는 €0.02를 보내며 거래 설명란에 악성 지시문을 넣었다.
- 피해자 기기 접근, 악성코드, 전통적 사회공학은 필요 없었다.
- 사용자는 평범한 질문만 했다
- 사용자가 "최근 거래 보여줘"라고 묻자 어시스턴트가 거래 데이터를 LLM 컨텍스트로 가져왔다.
- 모델이 메모 속 지시문을 따라 은행의 재인증 요청처럼 보이는 스피어피싱 메시지를 만들었다.
- 은행 앱 안에서 나온 피싱이라 믿기 쉽다
- 메시지가 은행 자체 앱의 AI 어시스턴트에서 나온다.
- 실제 거래 내역과 사용자 정보를 언급할 수 있어 신뢰도가 높다.
- 가드레일이 있었는데도 뚫렸다
- 은행 AI 앱에는 이미 가드레일이 있었다.
- 페이로드가 "ignore previous instructions" 같은 전형적 패턴 없이 거래 데이터에 섞이도록 만들어져 단독 텍스트 검사로는 구분이 어려웠다.
- 위험은 텍스트가 아니라 데이터 흐름에 있다
- 위험은 신뢰할 수 없는 데이터, 검색 로직, 모델 동작, 앱 맥락, 출력·액션이 만나는 지점에서 생긴다.
- 글은 프롬프트 인젝션을 모델 문제가 아니라 앱 보안·데이터 흐름·런타임 모니터링 문제로 본다.
- 글이 권하는 4겹 방어
- 불필요한 필드는 컨텍스트에 넣지 않는다.
- 검색된 데이터는 신뢰하지 않고 지시와 데이터를 구분한다.
- 링크 생성·자격증명 요청·고위험 툴 호출을 제한하고 런타임 동작을 모니터링한다.
Community Reactions
- 거래 조회에 LLM이 왜 필요하냐는 의견
- 댓글에서 "최근 거래 보여줘"는 결정적 DB 조회라 LLM 해석이 필요 없다는 지적이 나왔다.
- 외부 입력이 닿는 고위험 구간에서는 신뢰할 수 없는 데이터를 가능하면 아예 빼야 한다는 의견도 있었다.
- 구조적 한계를 짚는 의견
- 댓글에서 컨텍스트 안의 데이터가 지시로 해석되는 한 안전한 LLM은 없다는 의견이 나왔다.
- 이 의견을 쓴 댓글러는 "데이터와 지시를 어떻게 분리하나"를 AI 기능 도입 논의의 기준 질문으로 쓰겠다고 했다.
- 방어 아이디어 제안과 반론
- 댓글에서 신뢰 불가 마커 감싸기, 구조화 출력 생성 후 다른 에이전트로 검증하는 방식이 제안됐다.
- 다른 댓글은 커스텀 메시지 롤과 들여쓴 XML을 쓰고, 위험한 액션은 독립된 새 컨텍스트에서 승인받아야 한다고 했다.
- 검증 AI를 또 검증해야 하는 무한 회귀라는 냉소도 있었다.
- 글이 삭제됐고 수정 내용도 안 나온다는 경험
- 댓글에서 원문 링크가 블로그 메인으로 리다이렉트되고 아카이브 링크가 공유됐다.
- 실제 적용한 수정 내용이 글에 없다는 불만도 있었다.
How to Apply
- 컨텍스트에 들어가는 외부 입력 필드 목록 만들기
- 오늘 RAG·툴 응답이 프롬프트에 넣는 필드를 전부 뽑아 제3자가 쓸 수 있는 것(메모, 메시지, 문서)에 표시하라.
- 질문 처리에 필요 없는 필드는 기본값으로 컨텍스트에서 빼라.
- 단순 조회는 LLM 없이 렌더링하기
- "최근 거래 보여줘" 같은 결정적 조회는 DB 결과를 코드로 바로 보여주도록 분기하라.
- LLM은 요약이 꼭 필요한 경우에만 호출하라.
- 응답의 링크와 자격증명 요청 차단하기
- 출력 단계에서 허용 도메인 외 URL과 "재인증"·"비밀번호" 요청 패턴을 걸러라.
- 걸린 응답은 막고 로그에 남겨라.
- 런타임 행동 로그로 이상 징후 탐지하기
- 어시스턴트가 가져온 데이터, 생성한 출력, 호출한 툴을 기록하라.
- 평소와 다른 외부 URL 삽입이나 예상 밖 툴 호출이 보이면 알림을 보내라.
Try It
# Claude나 ChatGPT에 그대로 붙여넣기 (원문 방법의 간이 버전: 인젝션 점검용)
아래는 우리 AI 어시스턴트가 사용자 질문에 답하려고 컨텍스트에 넣는 데이터 필드 목록과 시스템 프롬프트다.
[시스템 프롬프트]
{{시스템 프롬프트}}
[컨텍스트에 들어가는 필드]
{{필드 목록: 예) 거래 설명, 가맹점명, 고객 메시지}}
[어시스턴트가 쓸 수 있는 출력/툴]
{{링크 생성 여부, 호출 가능한 툴}}
다음을 해줘.
1. 각 필드를 제3자가 쓸 수 있는지 여부로 분류해줘.
2. 제3자가 쓸 수 있는 필드에 간접 프롬프트 인젝션이 들어갈 때 가능한 시나리오를 필드별로 3개씩 써줘. (고전적인 "이전 지시 무시" 문구 없이 데이터에 섞인 형태로)
3. 각 시나리오에 대해 (a) 컨텍스트 최소화 (b) 데이터와 지시 분리 (c) 출력·액션 제한 (d) 런타임 모니터링 중 어떤 방어가 효과적인지 표로 정리해줘.Terminology
관련 논문
모델이 그렇게 좋다면 OpenAI는 왜 회사 100개를 직접 안 차릴까
HN 댓글 답: 코드는 쉬워도 뭘 만들지 아는 건 별개라 토큰을 판다
OpenShell: 자율 AI 에이전트를 가두는 NVIDIA의 안전한 샌드박스 런타임
정책 파일로 에이전트의 파일·네트워크·자격증명 접근을 커널 수준에서 통제한다
Omnara: Claude Managed Agents의 오픈소스 대안 (셀프호스팅 가능)
어떤 모델·머신에서도 에이전트를 돌리는 오픈소스 managed agent 플랫폼
Rust off Rails: 코드 없이 Markdown 60개로 만든 AI 에이전트용 웹 스택
Markdown 규칙 60개로 에이전트가 Rust 웹앱을 짜게 한다는 프레임워크
LayerFS: AI 코딩 에이전트를 위한 파일시스템
에이전트마다 임시 Workspace를 마운트하고 결과만 커밋하는 파일시스템
Launch HN: Alter (YC S25) – 멀티유저 에이전트용 접근 제어
에이전트마다 별도 신원·정책·감사로 API 키 공유 문제를 푼다
Claude로 코드의 공격 표면(attack surface) 줄이기
Claude로 25개 오픈소스를 분석해 불필요하게 열린 코드 493건을 찾았다
WhatsApp 도움말 페이지에 숨겨진 LLM 지시문: 규제기관을 추천하지 말라
WhatsApp 도움말에 화면엔 안 보이는 AI 지시문 102개가 숨어 있었다