- 공격은 주입 단계와 발현 단계로 나뉜다. 메일 속 숨은 지시가 에이전트로 하여금
MEMORY.md같은 메모리 파일에 거짓 사실을 쓰게 하고, 이후 사용자의 다른 질문에서 그 사실이 근거로 쓰인다. - OpenClaw 백그라운드 모드에서 종단 간 성공률 87.5%, Claude Sonnet 4.6 기반에서 71.4%를 기록했고, 메모리 수정 사실이 사용자에게 드러난 경우는 없었다.
- 입력 필터는 91.6%, 시스템 수준 모니터는 93.5%의 미탐률을 보였다. 문장 단위 검사로는 막기 어렵다는 뜻이다.
- 메모리 기록도 파일 쓰기라는 도구 호출이다. 호출 단위로 판정하고 기록하면 무인 실행 중 메모리 변경을 통제할 수 있다.
1.개요
장기 메모리는 개인 비서형 에이전트의 핵심 기능이다. 에이전트는 사용자 선호, 진행 중인 업무, 계정 정보 같은 사실을 파일이나 벡터 데이터베이스에 저장하고 다음 세션에서 다시 불러온다. 연구진(Yechao Zhang 외)은 7월 6일 논문 「When Claws Remember but Do Not Tell」에서 이 메모리를 외부에서 오염시키는 공격을 발표했고, 7월 14일부터 영향받는 벤더에 순차 제보했다.
시험 대상은 OpenClaw(GPT-5.4), Claude Code SDK(Sonnet 4.6), NanoClaw, Hermes Agent, 그리고 Mem0 메모리 백엔드였다.
2.공격 원리
연구진의 예시는 금융 피해와 직결된다. 사용자의 은행 앱 이체 한도가 1만 달러로 상향되었다는 거짓 정보를 메모리에 심으면, 이후 사용자가 이체 관련 질문을 할 때 에이전트는 이를 사실로 전제하고 안내한다. 한 번 기록된 거짓 메모리는 세션이 바뀌어도 사라지지 않는다.
연구진은 에이전트가 설계상 '보이지 않는 단계'를 숨기기 때문에 파일을 수정하는 순간이 대화에 나타나지 않는다고 지적했다.
3.시험 결과
은닉률은 100%였다. 즉 시험에서 에이전트가 메모리를 수정했다는 사실을 사용자에게 드러낸 경우는 없었다. 연구진은 평가 도구 WhisperBench를 공개했으나, 학습된 공격 모델은 안전성 검토를 이유로 공개하지 않았다.
4.분석: 메모리는 지속성 거점이다
전통적 침해에서 공격자가 가장 공들이는 단계는 지속성 확보다. 재부팅 후에도 살아남는 실행 경로를 만들어야 하기 때문이다. 에이전트의 영구 메모리는 그 역할을 자연어로 대신한다. 실행 파일 대신 '사실'을 심어 두면, 에이전트가 스스로 그 사실을 불러와 판단의 근거로 삼는다.
미탐률 수치가 보여 주듯 문장을 검사하는 방어로는 한계가 뚜렷하다. 거짓 사실은 공격적인 문장이 아니라 평범한 진술의 형태를 띠기 때문이다. 반면 메모리에 기록하는 동작은 언제나 파일 쓰기나 데이터베이스 기록이라는 구체적 호출로 나타난다. 통제 지점은 바로 그 호출이다.
5.위협 분류 매핑
이 사건의 공격 단계를 OWASP 에이전트 애플리케이션 Top 10(2026)과 MITRE ATLAS 기법에 대응시키면 다음과 같다. GuardTrail은 판정 결과에 같은 분류의 태그를 붙여 기록하고, SIEM으로 내보낼 때 함께 전달한다.
| 체계 | 항목 | 이 사건에서 |
|---|---|---|
| OWASP ASI | ASI06 메모리·컨텍스트 오염 | 거짓 사실이 영구 메모리에 기록되어 이후 판단에 쓰였다 |
| OWASP ASI | ASI01 목표 탈취 | 메일 속 숨은 지시가 에이전트의 동작을 바꿨다 |
| MITRE ATLAS | AML.T0051.001 LLM Prompt Injection: Indirect | 메일 본문을 통한 간접 프롬프트 인젝션 |
6.젠아이랩스 GuardTrail의 대응
젠아이랩스(GenAI Labs) GuardTrail은 AI 에이전트의 도구 호출을 실행 직전에 가로채 기록·판정·차단하는 Agent EDR이다. 개발자 PC의 코딩 에이전트(Claude Code 훅, stdio 래퍼)와 사내 MCP 서버(게이트웨이)에 설치되며, 차단 판정은 언어 모델이 아닌 결정적 정책으로 내린다. 제품 소개 · 위협 차단 · 도입 방식
- 메모리 쓰기를 승인 대상으로 지정한다. 고객 정책으로 메모리 파일 경로(
MEMORY.md등)나 메모리 도구 이름을 지정해REQUIRE_APPROVAL을 걸면, 무인 실행 중 메모리 변경은 관리자 승인 없이 이뤄지지 않는다. - 에이전트별로 범위를 달리한다. 정책의
agent조건으로 메일을 읽는 에이전트에만 메모리 쓰기 승인을 요구할 수 있다. 연구진이 권고한 '메일 읽기 구성 요소와 메모리 쓰기 권한의 분리'를 운영 단계에서 강제하는 방식이다. - 모든 메모리 변경이 감사 기록으로 남는다. 어떤 세션에서 어떤 입력을 처리한 뒤 메모리가 바뀌었는지 시간순으로 확인할 수 있어, 오염 시점을 역추적할 수 있다.
고객 정책 예시
메일을 처리하는 에이전트(agent:mail-*)의 메모리 파일 기록만 승인 대상으로 지정한다. 사용자가 직접 대화하는 에이전트의 메모리 기록은 영향을 받지 않는다.
policies:
- id: mail-agent-memory-approval
name: 메일 처리 에이전트의 메모리 기록 승인
effect: REQUIRE_APPROVAL
mode: enforce
reason: 메일을 처리하는 에이전트의 메모리 파일 기록은 사용자 확인이 필요합니다.
match:
agent: ["agent:mail-*"]
tool: ["Write", "Edit", "*:write_file", "*:memory_*"]
args_pattern: ['(?i)(^|/)MEMORY\.md', '(?i)"memory"']
판정 결과
같은 메모리 파일 쓰기가 메일 처리 에이전트에서는 승인 대기로 멈추고, 다른 에이전트에서는 기록 후 진행된다. 아래 표는 위 정책을 GuardTrail 정책 엔진에 적용하고 guardtrail policy test --mode enforce로 각 호출을 판정한 실제 결과다. 인자에 넣은 키와 토큰은 공개 문서의 예시 값이다.
| 도구 호출 · 에이전트 | 판정 | 정책·사유 |
|---|---|---|
Write /home/u/.agent/MEMORY.mdagent:mail-assistant · 내장 정책 + 고객 정책 | 승인 필요 | mail-agent-memory-approval메일을 처리하는 에이전트의 메모리 파일 기록은 사용자 확인이 필요합니다. |
Write /home/u/.agent/MEMORY.mdagent:planner · 내장 정책 + 고객 정책 | 허용 | 적용 정책 없음기록 후 실행 |
7.점검 방법
- 메모리 파일 검토:
MEMORY.md등 에이전트 메모리 파일에서 금액, 한도, 계좌, 연락처처럼 행동을 유도하는 사실이 언제 추가됐는지 확인한다. - 출처 대조: 메모리 변경 시각과 같은 시각에 처리된 외부 메일이 있는지 GuardTrail 세션 기록으로 대조한다.
- 백그라운드 모드 점검: 무인 실행 모드에서 메모리 쓰기 권한이 열려 있는지 확인한다.
8.권고 사항
- 무인 실행 모드에서는 메모리 쓰기 권한을 제한한다.
- 신뢰할 수 없는 메일은 메모리 쓰기 권한이 없는 별도 구성 요소에서 처리한다.
- 메모리 항목에 출처를 표시해 사용자가 직접 제공한 사실과 외부에서 온 사실을 구분한다.
- 메모리 파일 변경 전 사용자 확인을 요구하고, 모든 변경을 감사 기록으로 남긴다.
참고 문헌
- Cloud Security Alliance, MemGhost: Agent Memory Poisoning (2026-07-23). labs.cloudsecurityalliance.org
- Cloud Security Alliance, MemGhost: AI Agent Memory Injection. labs.cloudsecurityalliance.org
관련 제품 · 보안 권고
- OWASP Top 10 for Agentic Applications 2026. genai.owasp.org
- 젠아이랩스 GuardTrail. guardtrail.gensapps.com · 표준 커버리지
수치와 경위는 각 출처가 공개한 내용을 따랐다. 접근 확인 2026-07-28.