LLM 에이전트 메모리 포이즈닝
일반 사용자 권한의 쿼리만으로 에이전트 장기 메모리를 오염시키는 지연 공격과, 사후 감사·출처 결합으로 옮겨가는 방어 구조를 정리한다.
Contents
메모리 포이즈닝은 에이전트의 영속 저장소를 오염시켜, 공격한 시점과 피해가 터지는 시점을 갈라놓는 지연 공격이다.
장기 메모리가 공격 표면이 되는 이유
LLM 에이전트는 과거 대화와 작업 기록을 벡터 데이터베이스 같은 영속 저장소에 남기고, 새 요청이 들어오면 유사도 검색으로 그중 일부를 꺼내 맥락에 넣는다. 이 저장소를 장기 메모리(long-term memory)라 부른다. 검색된 레코드는 사용자가 방금 쓴 문장과 같은 컨텍스트 창에 들어가므로, 모델 입장에서 둘의 신뢰도 차이는 명시되지 않는다.
도구 설명 텍스트를 오염시키는 MCP 도구 포이즈닝이 호출 시점에 즉시 오작동을 일으키는 공격이라면, 메모리 포이즈닝은 오염과 발현 사이에 세션 경계가 끼어든다. 공격자는 오늘 레코드를 심고, 피해는 몇 주 뒤 다른 사용자의 세션에서 나타날 수 있다.
Lin et al.의 장기 메모리 보안 서베이(arXiv:2604.16548, 2026-04 기준)는 메모리 위협의 성격을 세 축으로 정리한다. 지속성(persistence), 상태 의존성(statefulness), 전파성(propagation)이다. 지속성은 한 번 심은 레코드가 세션을 넘어 남는 성질이고, 상태 의존성은 에이전트의 행동이 누적된 메모리 상태에 좌우되는 성질이다. 전파성은 다중 에이전트 환경에서 오염된 메모리가 공유 저장소를 통해 다른 에이전트로 옮겨가는 성질을 가리킨다.
가장 곤란한 조건은 권한이다. 공격자는 시스템 접근 권한이나 재학습 기회가 없어도, 일반 사용자로서 쿼리를 주고받는 것만으로 저장소에 레코드를 남길 수 있다.
공격 계보: AgentPoison에서 MINJA까지
주요 연구 세 편을 위협 모델과 보고된 수치로 비교하면 공격의 진입 장벽이 어떻게 낮아졌는지가 드러난다. 아래 수치는 모두 각 논문이 자체 실험 환경에서 보고한 값이다.
| 연구 | 발표 | 핵심 기법 | 위협 모델 | 보고된 성공률 |
|---|---|---|---|---|
| AgentPoison (arXiv:2407.12784, 2024-07 기준) | NeurIPS 2024 | 트리거 쿼리가 특정 임베딩 영역으로 매핑되도록 설계한 악성 문서를 메모리·지식베이스에 주입 | 문서 삽입 가능, 재학습 불필요 | 독성 비율 0.1% 미만에서 공격 성공률(ASR) 80% 이상, 정상 쿼리 영향 1% 미만 |
| MINJA (arXiv:2503.03704, 2025-03 기준) | NeurIPS 2025 | 브리징 스텝 유도 후 유도문을 점진적으로 제거 | 쿼리와 관찰만 사용(query-only) | 주입 성공률 98.2%, ASR 76.8% |
| 재현 연구 (arXiv:2601.05504, 2026-01 기준) | 2026-01 | MINJA를 GPT-4o-mini, Gemini-2.0-Flash, Llama-3.1-8B에서 재현 | query-only | 이상적 조건에서 주입 성공률 95% 이상, ASR 70% |
AgentPoison은 저장소에 문서를 넣을 수 있다는 전제를 요구했다. MINJA는 그 전제를 걷어내고, 정상 대화 인터페이스만으로 같은 목표에 도달한다.
MINJA의 기법은 두 단계로 나뉜다. 먼저 공격자는 에이전트가 피해자 쿼리와 악성 추론을 잇는 중간 추론 단계(bridging step)를 스스로 생성하도록 유도 프롬프트로 안내한다. 그다음 이 유도 프롬프트를 조금씩 줄여(progressive shortening), 최종적으로는 유도문 없이도 해당 레코드가 자연스럽게 검색되도록 만든다.
운영 관점에서 두 번째 단계가 더 나쁘다. 저장소에 남는 최종 레코드에는 명시적인 공격 문구가 거의 남지 않으므로, 키워드나 패턴으로 로그를 훑는 사후 조사가 헛돈다.
한 가지 완화 요인은 있다. 같은 재현 연구는 정당한 메모리가 이미 충분히 쌓인 현실적 조건에서는 공격 효과가 크게 떨어졌다고 보고한다. 신규 배포 직후나 사용자별 메모리가 희박한 구간이 상대적으로 취약한 시점이다.
메모리 생명주기로 본 실패 지점
앞서 언급한 서베이는 에이전트 메모리를 6단계 생명주기로 나눈다. 단계를 나눠 보면 오염이 들어오는 지점과 피해가 나타나는 지점이 서로 다르다는 점이 분명해진다.
그림 설명: 6단계 메모리 생명주기를 세 구간으로 묶은 흐름도다. 오염 유입은 Write·Store, 피해 발현은 Retrieve·Execute, 확산과 회수는 Share and Propagate·Forget and Rollback이 맡는다.
각 구간에서 통제 수단과 남는 위험이 다르다.
- Write·Store는 무엇을 기억할지 정하는 구간이다. 여기서 걸러내지 못한 레코드는 이후 모든 세션의 후보가 된다.
- Retrieve는 오염 레코드가 실제 피해로 바뀌는 병목이다. 심어둔 레코드도 검색되지 않으면 무해하다.
- Execute는 검색된 텍스트를 행동으로 옮기는 구간이라, 외부 송신이나 파일 조작 같은 파괴적 액션의 게이트를 둘 마지막 지점이다.
- Share and Propagate는 단일 에이전트 방어와 갈라지는 지점이다. 한 에이전트의 오염이 공유 메모리를 통해 다른 에이전트로 전이된다.
- Forget and Rollback은 사고 이후 회수 경로다. 어떤 레코드를 언제 지울지 정해두지 않으면 사고 대응이 통째로 막힌다.
서베이는 방어 목표를 무결성(Integrity), 기밀성(Confidentiality), 가용성(Availability), 거버넌스(Governance) 네 축으로 분류한다. 메모리 포이즈닝은 이 중 무결성을 직접 겨냥하고, 전파 경로를 통해 거버넌스 문제로 번진다.
방어의 세 세대
방어 연구는 개입 시점을 기준으로 세 갈래로 갈라져 있다. 실시간 필터링, 사후 인과 감사, 출처 결합 순으로 등장했고 서로 대체 관계가 아니다.
실시간 필터링. Sunil et al.(arXiv:2601.05504, 2026-01 기준)은 다중 신호 기반 신뢰 점수로 메모리 입출력을 중재하는 방식을 제안한다. 저장소는 시간적 감쇠(temporal decay)와 패턴 기반 필터링으로 정제한다. 한계도 같은 연구가 보고한다. 신뢰 임계값을 높이면 정상 메모리를 차단하고, 낮추면 교묘한 공격을 통과시킨다.
사후 인과 감사. MemAudit(arXiv:2605.23723, 2026-05 기준)은 차단 대신 역추적을 택한다. 해로운 행동이 이미 관찰된 뒤, 어떤 저장 메모리가 그 행동의 원인이었는지 찾는다. 수단은 두 가지다.
- 반사실적 메모리 영향 점수(counterfactual memory influence score): 특정 항목을 제거했을 때 해로운 출력이 사라지는지를 측정해 인과 기여도를 산출한다.
- 메모리 정합성 그래프(memory consistency graph): 저장소 전체를 그래프로 보고, 다른 레코드와 정합성이 낮은 구조적 이상 항목을 식별한다.
MemAudit은 평가에서 QA 공격의 ASR을 70%에서 0%로, 추론 에이전트(RAP) 공격의 ASR을 83.3%에서 0%로 낮췄다고 보고한다. MINJA에 대한 방어 효과도 함께 보고한다. 명시적 공격 문구가 남지 않는 MINJA 계열에 인과 기반 접근이 맞물리는 지점이다.
출처 결합. Louck(arXiv:2606.24322, 2026-06 기준)은 탐지 대신 구조적 봉쇄를 시도한다. 비가변 출처 결합 권한(non-malleable, origin-bound authority)은 메모리 항목을 생성 출처와 분리 불가능하게 묶는 설계다. 항목을 변조하거나 다른 맥락에서 재사용하는 경로 자체를 없앤다. 검증을 위해 MEM-INV-Bench라는 벤치마크를 만들어 기존 포이즈닝 공격에 대한 방어 효과를 확인했다고 보고한다.
세 세대의 개입 시점과 한계를 정리하면 다음과 같다.
| 세대 | 개입 시점 | 막는 것 | 한계 |
|---|---|---|---|
| 실시간 필터링 | Write·Retrieve | 신뢰도 낮은 레코드의 저장과 검색 | 임계값 튜닝에 따른 과차단과 미탐 |
| 사후 인과 감사 | Execute 이후 | 피해 원인 레코드 특정과 제거 | 피해가 한 차례 발생한 뒤에야 개입 가능 |
| 출처 결합 | Write·Store 설계 | 항목 변조와 맥락 외 재사용 | 정형 검증의 구체성이 공개 자료로 확인되지 않음 |
Louck 논문은 기계 검증 보증(machine-checked guarantees)을 표방한다. 다만 공개된 초록과 본문 요약만으로는 Coq나 Isabelle 같은 정형 검증 도구 중 무엇을 썼는지 확인되지 않는다. 도입을 검토한다면 이 부분을 직접 확인하는 편이 안전하다.
멀티 에이전트 전파 시나리오의 방어는 아직 서베이 수준의 프레임워크 제시에 머물러 있다. 실제 다중 에이전트 배포 환경에서 검증된 방어는 위 세 갈래 어디에도 충분히 축적되지 않았다.
운영 체크리스트
논문의 방어 기법을 바로 도입하기 어렵더라도, 메모리 계층에서 정책으로 정할 수 있는 항목이 있다.
- 메모리 레코드에 출처, 작성 세션, 작성 주체를 필수 메타데이터로 남긴다. 사후 감사와 출처 결합 모두 이 정보가 없으면 시작하지 못한다.
- 사용자·테넌트 경계를 넘는 메모리 검색을 기본 차단한다. 한 사용자의 쿼리로 심은 레코드가 다른 사용자 세션의 후보가 되지 않게 한다.
- 메모리에 보존 기간과 감쇠 규칙을 둔다. 무기한 보존은 지속성이라는 공격 조건을 그대로 내주는 설정이다.
- 검색된 메모리와 사용자 입력을 컨텍스트에서 구분해 표시하고, 메모리 출처 텍스트는 지시가 아닌 참고 자료로 다룬다.
- 외부 송신·결제·파일 삭제 같은 파괴적 액션은 메모리 유래 근거만으로 실행하지 않고 사람 승인을 건다.
- 특정 레코드를 지목해 삭제하고 그 이후 행동을 재검증하는 회수 절차를 미리 만들어 둔다.
- 사용자별 메모리가 희박한 신규 배포 구간에는 보수적인 검색 임계값을 적용한다.
이 항목들은 모델을 바꾸지 않고 메모리 계층과 오케스트레이션 코드에서 강제할 수 있다.
정리
메모리 포이즈닝은 시스템 접근 권한 없이 쿼리만으로 에이전트의 영속 저장소를 오염시켜, 이후 임의 세션에서 피해를 일으키는 지연 공격이다. MINJA는 유도 프롬프트를 점진적으로 제거해 저장소에 명시적 공격 문구를 남기지 않으며, 주입 성공률 98.2%와 ASR 76.8%를 보고했다. 방어는 실시간 필터링에서 사후 인과 감사와 출처 결합 구조로 옮겨가는 중이고, 각각 임계값 튜닝, 사후 개입, 검증 구체성이라는 한계를 안고 있다. 당장 적용할 수 있는 통제는 메모리 레코드의 출처 메타데이터, 사용자 경계 격리, 보존 기간 제한, 파괴적 액션의 사람 승인이다. 멀티 에이전트 간 메모리 전파에 대한 방어는 아직 검증이 부족하므로, 공유 메모리를 도입할 때는 격리 경계를 먼저 정하는 편이 낫다.