
핵심 결론
에이전트가 어떤 내용을 저장했다는 사실만으로 그 기억을 신뢰하거나 재사용 가능한 지식으로 승격해서는 안 됩니다. 쓰기, 지식 승격, 검색, 실제 행동 커밋을 서로 다른 경계로 나누고, 각 단계에서 출처·권위·범위·버전·권한을 다시 확인해야 합니다.
외부 프로젝트의 README를 읽은 코딩 에이전트가 “이 패키지는 항상 전역 설치한다”라는 문장을 작업 요약에 남겼다고 가정해 보겠습니다. 그 문장은 문서의 설명일 수도 있고, 오래된 안내일 수도 있으며, 누군가 넣어 둔 지시일 수도 있습니다. 그런데 다음 세션에서 요약 파일이 자동으로 읽히고 그 문장이 사용자 정책처럼 취급된다면, 한 번의 문서 읽기가 장기 행동 규칙으로 바뀝니다.
문제는 단순히 나쁜 문장을 탐지하지 못했다는 데 그치지 않습니다. 신뢰할 수 없는 입력이 지속 상태에 들어가고, 검증된 지식처럼 권위를 얻고, 특정 질문에서 다시 활성화된 뒤, 부작용 있는 행동으로 이어지는 전체 수명주기가 공격 표면이 됩니다.
15번 글은 여러 작업의 경험을 후보 지식으로 만들고, 반례·검증·승인을 거쳐 Expertise Pack, 즉 검토된 공유 지식 묶음으로 승격하는 과정을 설명했습니다.src_001 16번 글은 검증된 Pack에서 현재 질문에 필요한 Context Bundle, 즉 작업용 문맥 묶음을 만들 때 조건과 반례가 빠지는 문제를 다뤘습니다. 17번 글은 그 문맥을 현재 principal(권한을 행사하는 사용자·조직·에이전트)에게 공개하고 행동에 사용해도 되는지 검증했습니다.
여기서 권한과 신뢰는 서로 다른 질문입니다. authorized ≠ trusted, 다시 말해 읽어도 되는 자료와 믿어도 되는 자료는 같지 않습니다. 읽을 권한이 있는 자료라도 오염됐거나 오래됐을 수 있고, 신뢰할 수 있는 지식이라도 다른 tenant(조직이나 고객별 격리 단위)에는 공개할 수 없습니다. 따라서 권한 검사를 통과한 뒤에도 지식의 출처·권위·적용 범위·revision(특정 버전)을 별도 신뢰 게이트에서 확인해야 합니다.
승격하고 작업 문맥으로 만들 지식 자체를 신뢰할 수 있는가?
이 글에서 제안하는 Memory Promotion Gate(메모리 승격 게이트)와 MemoryTrustReceipt(메모리 신뢰 영수증)는 관련 연구와 기존 지식 승격 구조를 연결한 프로젝트 설계안입니다. 확립된 표준이나 현재 DuckCrab에 구현 완료된 기능은 아닙니다. 실제 DuckCrab·Codex 공격 실험과 사람 평가는 아직 수행하지 않았습니다.
먼저 메모리 오염이 일반적인 프롬프트 인젝션과 어떻게 다른지 살펴보고, 이어서 쓰기·승격·검색·행동의 네 경계를 나눕니다. 마지막에는 이 설계를 안전하게 비교하는 실험 방법을 정리합니다.
기억은 입력을 미래의 상태로 바꿉니다
간접 프롬프트 인젝션은 웹페이지, 문서 또는 도구 결과 안의 지시가 현재 작업에서 실행되는 문제입니다. 지식베이스(KB)는 자료를 모아 둔 저장소이고, RAG는 그 저장소에서 관련 자료를 찾아 답변에 보태는 방식입니다. 지식베이스 오염은 조작된 문서나 예시가 검색돼 답을 바꾸는 문제입니다. 지속 메모리 오염은 이 두 위험을 넘어, 신뢰할 수 없는 내용이 장기 상태로 남아 현재와 미래 작업에서 더 높은 권위를 얻는 문제입니다.
| 구분 | 공격 입력 | 활성화 시점 | 지속 범위 | 핵심 질문 |
|---|---|---|---|---|
| 간접 프롬프트 인젝션 | 웹·문서·도구 결과 속 지시 | 현재 작업에서 읽을 때 | 주로 현재 세션 | 외부 텍스트가 명령으로 실행됐는가 |
| KB·RAG 오염 | 검색 저장소의 조작 문서·예시 | 특정 질의가 검색할 때 | 항목이 저장된 동안 | 오염 항목이 검색과 생성에 영향을 줬는가 |
| 지속 메모리 오염 | 행동 규칙·사용자 선호·요약·지식 파일·메모리 레코드 | 현재 또는 미래 세션에서 로드될 때 | 세션과 작업을 넘어 지속 | 신뢰할 수 없는 상태가 신뢰된 기억 권위를 얻었는가 |
| 승격 오염 | 검증되지 않은 후보 지식 | 여러 에이전트와 작업이 재사용할 때 | 지식 묶음·버전 배포 단위 | 승격 근거와 되돌리기 경계가 충분한가 |
Bad Memory는 Claude Code와 Codex의 파일 기반 지속 상태를 대상으로, AGENTS.md·CLAUDE.md와 참조되는 행동·지식 파일에 이미 들어간 payload(공격용 내용)가 현재와 후속 세션에 영향을 줄 수 있는 설정을 평가했습니다.src_002 From Untrusted Input to Trusted Memory는 네 가지 메모리 쓰기 채널, 아홉 가지 구조 취약점과 여섯 공격 클래스를 정리하고, 기억을 더 적극적으로 쓰고 검색하는 정책이 공격 가능성도 키울 수 있다고 보고했습니다.src_003
AgentPoison은 장기 메모리 또는 RAG 지식베이스의 검색 구조를 이용하는 백도어, 즉 특정 조건에서만 작동하도록 숨겨 둔 공격 경로를 제시했습니다.src_006 MM-PoisonRAG는 텍스트와 이미지처럼 여러 형식을 함께 다루는 멀티모달 지식베이스에서 특정 질의를 노리는 오염과 전역 오염을 평가했습니다.src_008 이 연구들은 같은 시스템을 독립 재현한 결과가 아니며, 모델·과업·검색기·공격자 권한도 서로 다릅니다. 다만 지속 상태와 검색 구조가 공격의 수명과 영향 범위를 넓힐 수 있다는 문제 정의는 여러 환경에서 반복됩니다.

한 기록만 검사하면 조합형 공격과 휴면 공격을 놓칩니다
메모리 쓰기 시점의 필터는 필요합니다. 하나의 메모리 기록에 노골적인 악성 지시가 들어 있는 직접 오염은 규칙, 분류기 또는 일관성 검사로 줄일 수 있습니다. 그러나 쓰기 시점 검사만으로 전체 수명주기를 보호하기는 어렵습니다.
MemPoison은 1,227개 검증 사례에서 다음 세 유형을 구분했습니다.src_004
- 직접 오염: 하나의 기록만 읽어도 공격 의도가 드러납니다.
- 조합형 오염: 각 기록은 정상처럼 보이지만 여러 기록이 함께 검색될 때 공격 의미가 완성됩니다.
- 휴면 오염: 특정 사용자, 질의, 날짜, 이미지 또는 작업 단계에서만 규칙이 활성화됩니다.
쓰기 시점 일관성 검사는 직접 공격을 줄일 수 있었지만, 조합형·휴면 공격을 안정적으로 막지는 못했습니다.src_004 Hidden in Memory와 Visual Inception도 저장된 내용이 이후 대화나 장기 계획에서 뒤늦게 활성화되는 공격을 각각 텍스트와 멀티모달 환경에서 평가했습니다.src_005 src_007
예를 들어 두 기억이 각각 “설치 실패 시 미러를 사용한다”와 “내부 미러는 인증 검사를 생략할 수 있다”라고 기록돼 있다고 가정해 보겠습니다. 두 문장을 따로 보면 일반적인 운영 팁처럼 보일 수 있습니다. 그러나 특정 설치 오류와 함께 검색되면 인증을 우회하는 행동 지시로 합성될 수 있습니다. 따라서 개별 기록과 함께 현재 질문에서 동시에 검색되는 기억 묶음과 활성화 조건도 검사해야 합니다.
반대 근거도 함께 봐야 합니다. 전자건강기록(EHR) 에이전트를 다룬 연구는 현실적인 정상 기억과 검색 조건이 공격 효과를 낮출 수 있으며, 신뢰 임계값을 지나치게 높이면 정상 기억까지 차단할 수 있다고 보고했습니다.src_012 메모리를 전부 끄기보다 정상 작업의 유용성과 보안을 함께 측정해야 합니다.
메모리 안전성을 네 경계로 나눕니다
메모리 오염을 하나의 필터 문제로 보면 어느 단계에서 위험이 통과했는지 알기 어렵습니다. 다음 네 경계를 분리하면 실패 위치와 담당 책임을 더 분명하게 기록할 수 있습니다.
1. 쓰기(Write): 무엇이 장기 상태로 들어가는가
메모리 쓰기는 사용자가 “기억해 줘”라고 요청할 때만 발생하지 않습니다. 대화 종료 요약, 도구 결과 자동 추출, 웹 문서의 지식 노트화, 성공한 작업에서 뽑은 교훈, 다른 에이전트가 넘긴 작업 정보와 검토 의견도 장기 상태가 될 수 있습니다.
이 단계에서는 최소한 다음을 남겨야 합니다.
- 원문과 작성 주체를 다시 찾을 수 있는 참조와 해시
- 사용자 입력, 외부 문서, 도구 결과, 에이전트 요약의 구분
- 사실, 선호, 지시, 정책, 가설과 예시의 구분
- 생성 시점, 유효 기간과 적용 범위
- 자동 저장인지 사용자 승인 저장인지에 대한 기록
문장의 내용만 저장하고 권위를 잃어버리면 외부 README의 지시가 시스템 정책처럼 재사용될 수 있습니다.src_002 src_003
2. 지식 승격(Promotion): 후보가 재사용 권위를 얻는가
저장된 기억과 검증된 지식은 같은 상태가 아닙니다.
stored memory ≠ trusted memory ≠ promoted knowledge즉, 저장된 기억 → 검증된 기억 → 재사용이 승인된 지식은 서로 다른 상태입니다.
후보를 승격할 때는 문장이 자연스러운지, 기존 기억과 모순되지 않는지만 보면 부족합니다. 출처, 지시와 데이터의 경계, 조직·프로젝트·역할별 적용 범위, 최신 버전, 다른 후보와의 조합 위험, 휴면 활성화 조건, 고위험 행동 유도 가능성과 rollback(이전 상태로 되돌리는 절차)을 함께 검사해야 합니다.
3. 검색(Retrieval): 현재 질문에서 다시 믿어도 되는가
과거에 승격을 통과한 지식도 모든 질문에서 그대로 사용해서는 안 됩니다. 현재 조직과 프로젝트에 허용된 기억인지, 오래된 버전이 최신 정책보다 높은 순위로 검색됐는지, 여러 기억이 결합되며 새로운 지시가 만들어지는지 다시 봐야 합니다.
PRA-RAG는 오염된 검색 결과에도 비교적 흔들리지 않는 집계 방법을 제안합니다.src_009 하지만 안전해 보이는 검색 결과의 일부만 고르는 것으로 출처 권위, 승격 승인, 적용 범위와 버전 검사가 끝나는 것은 아닙니다. 검색 방어는 전체 수명주기 가운데 한 경계입니다.
4. 행동 확정(Action commit): 기억에 근거한 행동을 실행해도 되는가
메모리를 읽고 설명을 만드는 것과 파일 수정, 명령줄 실행, 네트워크 접근, 패키지 설치, 로그인 정보 사용 또는 구매를 실제로 수행하는 것은 위험 수준이 다릅니다.
VIGIL은 신뢰할 수 없는 도구 결과가 연속해서 들어오는 환경에서, 추론을 모두 막기보다 사용자 의도와 정책을 확인한 뒤 행동을 확정하는 verify-before-commit(실행 전 재검증) 구조를 제안했습니다.src_010 메모리 전용 방어는 아니지만 다음과 같은 마지막 경계를 설계하는 보조 근거가 됩니다.
기억에 근거한 행동 제안
→ 사용자 의도 확인
→ 정책·권한 확인
→ 근거·지식 버전 확인
→ 예상 부작용 미리 보기
→ 실행 / 보류 / 사람 승인
OWASP Agentic Top 10은 Memory & Context Poisoning을 독립적인 운영 위험으로 분류합니다.src_011 이 분류가 특정 방어의 효과를 증명하는 것은 아니지만, 메모리와 문맥이 이후 추론·행동을 오염시킬 수 있다는 운영 위협 모델을 제공합니다.
프로젝트 제안: 메모리 승격 게이트
앞의 연구와 15번 글의 지식 승격 루프를 연결하면 다음 신뢰 상태를 설계할 수 있습니다.
untrusted_input
→ extracted_candidate
→ quarantined_candidate
→ validated_candidate
→ promoted_knowledge
→ deprecated / revokeduntrusted_input: 사용자·외부 문서·도구·다른 에이전트에서 들어온 원시 입력입니다.extracted_candidate: 재사용할 가치가 있어 구조화했지만 아직 권위를 부여하지 않은 후보입니다.quarantined_candidate: 보안·출처·범위 검토가 더 필요한 후보입니다.validated_candidate: 지정된 근거·반례·정책 검사를 통과한 후보입니다.promoted_knowledge: 검토자와 버전 기록을 가진 재사용 기준본입니다.deprecated / revoked: 오래됐거나 잘못 승격돼 활성 사용에서 제외한 상태입니다.
승격 게이트에는 다음 검사를 포함할 수 있습니다.
- 출처 추적(Provenance): 원문과 작성 주체를 재확인할 수 있는가
- 지시와 데이터의 경계: 외부 문서의 지시문이 상위 명령으로 승격되지 않았는가
- 적용 범위(Scope): 특정 프로젝트·조직·기간의 지식이 전역 규칙으로 확장되지 않았는가
- 모순 검사(Contradiction): 기존 정책·근거·버전과 충돌하는가
- 조합 검사(Composition): 관련 후보와 함께 검색될 때 위험한 의미가 새로 생기는가
- 활성화 조건(Activation): 특정 조건에서만 작동하는 휴면 규칙인가
- 행동 위험(Action risk): 파일·명령줄·네트워크·로그인 정보·구매 같은 행동을 유도하는가
- 되돌리기(Rollback): 잘못 승격됐을 때 영향받는 배포와 검사 기록을 되돌릴 수 있는가
이 항목들은 연구들이 하나의 표준으로 검증한 체크리스트가 아닙니다. 서로 다른 연구가 보여 준 공격 표면과 기존 Expertise Pack의 승격 책임을 결합한 조건부 프로젝트 제안입니다.
MemoryTrustReceipt는 검사 과정을 재현하기 위한 기록입니다
최종 답이나 행동만 저장하면 어떤 기억이 공격 경로가 됐는지 재현하기 어렵습니다. MemoryTrustReceipt는 어떤 기억을 불러왔고, 어떤 검사를 통과하거나 거부했으며, 어떤 행동을 제안했는지 남기는 작업 기록입니다. 여기서 receipt는 영수증처럼 판단에 사용한 재료와 결과를 다시 확인할 수 있게 남긴 기록을 뜻합니다.
memory_trust_receipt:
query_hash:
session_id:
task_class:
loaded_memory_ids:
memory_revisions:
origin_types:
authority_levels:
retrieval_scores:
composition_group:
policy_checks:
permission_checks:
promotion_receipts:
rejected_memory_ids:
rejection_reasons:
proposed_action:
commit_decision:
human_approval:
output_hash:이 기록이 있다고 해서 기억의 내용이 자동으로 참이 되는 것은 아닙니다. 잘못된 자료도 일관되게 기록할 수 있습니다. 또한 조직 정보, 문서 경로와 사용자 선호를 그대로 남기면 감사 로그가 새로운 민감 정보 저장소가 됩니다. 원문 전체 대신 hash(내용이 바뀌었는지 확인하는 짧은 값)와 의미를 드러내지 않는 식별자를 사용하고, 접근 권한과 보존 기간을 별도로 관리해야 합니다.
격리된 모의 작업공간에서 A부터 H까지 비교합니다
이 글의 설계를 검증하려면 실제 운영 AGENTS.md나 공유 지식 묶음에 공격용 내용을 넣지 않고, 실험을 위해 따로 만든 모의 작업공간을 사용해야 합니다. 같은 정상 기억, 정상 작업, 모델, 검색 예산과 행동 권한을 고정하고, 매 실험 뒤 작업공간을 처음 상태로 되돌립니다. 실제 로그인 정보, 외부 네트워크와 패키지 설치도 차단합니다.
| 조건 | 방어 구성 | 확인할 질문 |
|---|---|---|
| A | 메모리 없음 | 메모리 없이 수행한 안전·효용 기준선은 무엇인가 |
| B | 원문 그대로 자동 저장·검색 | 자동 저장과 검색이 공격과 효용을 얼마나 바꾸는가 |
| C | 저장 시점 일관성 검사 | 직접 오염은 줄고 조합·휴면 공격은 남는가 |
| D | 후보 격리 + 사람의 승격 승인 | 후보와 기준본 분리가 잘못된 승인을 줄이는가 |
| E | D + 검색 시점 조합 검사 | 여러 기록의 조합 의미를 잡는가 |
| F | E + 버전·범위·조직 검사 | 오래되거나 다른 범위의 유효한 기억을 거부하는가 |
| G | F + 실행 전 재검증 | 오염된 추론이 무단 행동으로 이어지는 것을 막는가 |
| H | G + 되돌리기·검사 기록 재현 | 잘못 승격된 지식을 되돌리고 경로를 재현할 수 있는가 |
필수 시험 항목에는 하나의 기록에 담긴 직접 오염, 두 기록의 조합, 특정 질문에서만 활성화되는 휴면 규칙, 오래된 정책 버전, 다른 조직의 유효한 기억, 사실처럼 보이는 행동 지시, 정상적인 사용자 선호와 광고성 지시의 경계, 여러 세션에 걸친 누적을 포함합니다.

평가할 때는 공격 성공률 외에도 다음 항목을 함께 봐야 합니다.
- 메모리 쓰기 승인율
- 승격의 잘못된 승인율과 잘못된 거부율
- 오염된 기억이 검색되는 비율
- 여러 세션에 걸친 지속성
- 정상 작업의 유용성
- 권한 없는 행동이 실제로 실행되는 비율
- 되돌리기 완전성
- 검사 기록을 이용한 경로 재현 가능성
- 사람 검토자 사이의 판단 일치도
현재 검증 범위
위 A~H 비교는 발행을 위한 실험 계약이며, 이번 연구에서 실제 DuckCrab·Codex 모델 실험이나 사람 평가는 실행하지 않았습니다. 논문별 공격 성공률과 방어 성능도 서로 다른 모델·과업·메모리 구현·공격자 권한에서 나온 결과이므로 직접 합산하거나 일반화하지 않습니다.
메모리를 끄지 않고 안전하게 쓰는 조건
메모리가 있는 시스템이 항상 더 위험하거나, 강한 필터가 항상 더 안전하다고 결론내릴 수는 없습니다. 정상 기억이 충분하면 공격 기록의 상대적 영향이 낮아질 수 있고, 지나치게 엄격한 필터는 유용한 선호와 경험까지 제거할 수 있습니다.src_012
따라서 운영 판단은 다음 조건을 함께 봐야 합니다.
- 저장과 신뢰, 지식 승격을 서로 다른 상태로 관리합니다.
- 원문, 작성 주체, 적용 범위, 권위 수준과 버전을 내용과 분리해 기록합니다.
- 개별 기록뿐 아니라 함께 검색되는 기억의 조합과 활성화 조건을 검사합니다.
- 검색 시점에 조직·프로젝트·역할·버전을 다시 확인합니다.
- 설명 생성과 부작용 있는 행동 사이에 별도의 실행 승인 단계를 둡니다.
- 정상 기억 보존과 잘못된 거부를 공격 차단율과 함께 측정합니다.
- 사람 승인을 만능 방어로 보지 않고, 검토자들이 같은 공격 자료에 함께 노출됐는지와 판단이 얼마나 일치하는지 감사합니다.
- 잘못 승격된 지식의 사용 중지, 되돌리기와 영향 범위를 재현할 수 있게 합니다.
짧은 세션에서만 쓰고 버리는 메모리, 부작용 없는 단일 문서 요약, 사람이 모든 저장을 직접 승인하는 작은 도구라면 더 단순한 경계로도 충분할 수 있습니다. 여러 세션과 에이전트가 같은 기억을 재사용하고 파일·네트워크·로그인 정보·구매 행동까지 다룬다면, 저장 시점 필터에 승격·검색·행동 검사를 더해야 합니다.
결론: 안전한 에이전트는 기억의 양보다 신뢰 경계를 관리합니다
에이전트가 스스로 개선되려면 기억을 많이 쌓는 것보다, 기억이 권위를 얻고 행동으로 이어지는 경로를 관리해야 합니다. 신뢰할 수 없는 경험이 어떻게 지속 상태가 되는지, 어떤 검증을 거쳐 재사용 권위를 얻는지, 현재 질문에서 언제 다시 활성화되는지, 실제 행동 전에 어디서 멈출 수 있는지를 추적해야 합니다.
신뢰할 수 없는 입력
→ 격리된 지식 후보
→ 검토를 거친 승격
→ 현재 문맥에 맞춘 검색
→ 재검증한 행동 확정15번 글의 지식 승격 루프는 경험을 기준 지식으로 만드는 절차를 제공했습니다. 이번 글의 메모리 신뢰 경계는 그 후보가 공격자의 지시나 범위를 벗어난 기억이 아닌지 확인합니다. 16번 글의 문맥 컴파일 검사는 검증된 지식이 실제 작업 문맥으로 변환되는 동안 손실되지 않는지 확인합니다.
그 다음에는 출력 단계를 확인해야 합니다. 정확하고 신뢰할 수 있는 작업용 문맥 묶음이 전달돼도 모델이 그 근거를 실제 답변에 충실하게 사용하는가? 이 문제는 생성 충실도 회귀라는 별도 경계로 다뤄야 합니다. 저장·승격·문맥 구성·답변 생성을 한 점수로 합치지 않을 때, 어느 단계를 고쳐야 하는지 분명해집니다.
출처
- tteggu의 지식창고. (2026). 15. 에이전트를 고치지 말고 지식을 개선하라: 경험을 공유 지식으로 승격하는 자기개선 루프.
- Gadgil, S. et al. (2026). Bad Memory: Evaluating Prompt Injection Risks from Memory in Agentic Systems. arXiv:2607.14611.
- Dash, P. et al. (2026). From Untrusted Input to Trusted Memory: A Systematic Study of Memory Poisoning Attacks in LLM Agents. arXiv:2606.04329v2.
- Gao, J. et al. (2026). MemPoison: Uncovering Persistent Memory Threats and Structural Blind Spots in LLM Agents. arXiv:2607.14651.
- Pulipaka, S. et al. (2026). Hidden in Memory: Sleeper Memory Poisoning in LLM Agents. arXiv:2605.15338.
- Chen, Z. et al. (2024). AgentPoison: Red-teaming LLM Agents via Poisoning Memory or Knowledge Bases. NeurIPS 2024.
- Qian, J. (2026). Visual Inception: Compromising Long-term Planning in Agentic Recommenders via Multimodal Memory Poisoning. ACL 2026.
- Ha, H. et al. (2026). MM-PoisonRAG: Disrupting Multimodal RAG with Local and Global Knowledge Poisoning Attacks. ACL 2026.
- Tan, X. et al. (2026). PRA-RAG: Provably Robust Aggregation in Retrieval-Augmented Generation against Retrieval Corruption. Findings of ACL 2026.
- Lin, J. et al. (2026). VIGIL: Defending LLM Agents Against Tool-Stream Injection via Verify-Before-Commit. ACL 2026.
- OWASP Gen AI Security Project. (2025). OWASP Top 10 for Agentic Applications for 2026.
- Sunil, B. D. et al. (2026). Memory Poisoning Attack and Defense on Memory Based LLM-Agents. arXiv:2601.05504.