RAG 스토어 오염(Poisoning)을 통해 배운 에이전트 메모리에 관한 교훈
요약
RAG 스토어 오염(Poisoning) 사례를 통해 AI 에이전트 메모리 보안의 중요성을 다룹니다. 오염된 데이터를 탐지하는 대신, 검색된 정보가 모델의 행동을 승인하지 못하도록 권한을 분리하는 설계 전략을 제안합니다.
핵심 포인트
- 오염된 메모리 탐지보다 메모리의 영향력을 제한하는 것이 효과적임
- 검색(Retrieval)과 권한(Authority)을 분리하여 설계해야 함
- 신뢰할 수 없는 정보는 정보 제공용으로만 사용하고 행동 승인은 금지해야 함
- 변환 후에도 유지되는 출처(Provenance) 관리가 보안의 핵심임
대부분의 "AI 메모리 (AI memory)" 관련 논의는 정보를 입력하는 방식에 집중되어 있습니다. 청킹 (chunking), 임베딩 (embeddings), 어떤 벡터 데이터베이스 (vector database)를 사용할지, 긴 대화를 나중에 회상할 수 있는 형태로 어떻게 압축할지 등이 그것입니다. 하지만 이러한 메모리 중 하나가 의도적으로 잘못되었을 때 어떤 일이 발생하는지에 대해서는 거의 논의되지 않습니다. 이는 우리가 로컬 우선 (local-first) 개인 메모리 레이어를 구축하는 동안 계속해서 고민하게 되는 부분입니다. 왜냐하면 사용자를 기억하는 어시스턴트는 거짓말을 기억하도록 설득당할 수도 있는 어시스턴트이기 때문입니다.
핵심 요약 (Key takeaways)
- 오염된 메모리를 탐지하려고 하지 마십시오. 검증되지 않은 메모리가 무엇을 _할 수 있는지_를 제한하십시오.
- "두 개의 독립적인 소스"는 오래되었으나 해결되지 않은 문제인 '허가 없는 멤버십 (permissionless membership)'의 검색(retrieval) 측면에서의 표현입니다. 독립성에는 비용이 따릅니다.
- 결과로부터 얻은 지위는 정체성으로 산 지위보다 강력하지만, 에이전트는 스스로의 숙제를 채점할 수 없습니다.
- 동작당 제한 (per-action cap)은 서서히 스며드는 공격을 막지 못합니다. 누적 예산 (cumulative budget)과 더불어, 되돌릴 수 없는 결과(irreversible tail)에 대해서는 가역적인 인간의 게이트 (reversible human gate)가 필요합니다.
- 모든 것은 아무도 제한하지 않는 하나의 축에 달려 있습니다: 변환 후에도 살아남는 출처 (provenance). 그것이 기본 토대입니다.
이 글은 r/LangChain의 공개 스레드에서 이루어진 논의를 정리한 것으로, 최근 우리가 경험한 기술적 교환 중 가장 훌륭한 것 중 하나가 되었습니다. 이 논의는 한 개발자(오픈 소스 메모리 레이어인 mnemo / agora-mnemo의 유지 관리자)가 더 많은 사람이 해야 할 일을 시도하면서 시작되었습니다. 그는 자신의 RAG 스토어를 직접 오염시켜 보려 시도했고, 무엇이 유지되고 무엇이 유지되지 않았는지에 대해 정직하게 보고했습니다. 약 일주일 동안 그는 각 아이디어를 구축하고, 측정하고, 파괴해 보려 시도했으며, 살아남은 부분들을 출시했습니다. 실험과 출시된 코드에 대한 공로는 그에게 있습니다. 우리의 역할은 주로 프레임워크를 설정하는 것이었습니다.
왜 검색 시점의 오염 방어 (retrieval-time poison defenses)는 실패하는가?
오염된 문서에 대한 순진한(naive) 방어 방식은 오염을 탐지하는 것입니다. 즉, 퍼플렉시티(perplexity)를 계산하거나, 이상치(outliers)를 찾고, 이상한 청크(chunk)를 표시하는 식입니다. 이는 계속해서 실패하는 벽이며, 아주 지루한 이유 때문에 실패합니다. 이 방식은 임베딩 공간(embedding space)에 존재하기 때문에, 인코더(encoder)를 교체하는 순간 무너집니다. 그의 결과는 정확히 그것을 보여주었습니다. 하나의 임베더(embedder)에 맞춰 조정된 방어 기제는 다음 임베더에서 무너졌습니다.
더 멀리 나아가는 재정의는 다음과 같습니다. 당신은 독성 탐지기를 만든 것이 아니라, 검색(retrieval)과 권한(authority)은 두 가지 서로 다른 특권이며, 오직 두 번째 것만이 획득되어야 한다는 사실을 재발견한 것입니다. 대부분의 메모리 스택에서 이 둘은 동일한 것으로 취급됩니다. 만약 어떤 청크가 top-k 결과로 돌아온다면, 그것은 답변을 형성할 권한을 갖게 됩니다. 이 둘을 분리하십시오. 신뢰할 수 없는 콘텐츠는 모델에 정보를 _제공(inform)_하게만 하되, 결코 스스로 행동을 _승인(authorize)_하게 해서는 안 됩니다. 이는 프롬프트 인젝션(prompt injection)에 가장 잘 대응하는 것과 동일한 분리 방식입니다(Google DeepMind의 CaMeL 연구에서 사용된 dual-LLM, capabilities 패턴): 특권을 가진 플래너(planner)는 가공되지 않은 신뢰할 수 없는 텍스트를 절대 직접 다루지 않으며, 신뢰할 수 없는 값은 정책이 허용해야 하는 타입화된 기능(typed capability)을 통해서만 민감한 도구 호출(tool call)에 도달할 수 있습니다.
검색(Retrieval)은 접근 제어(access control)의 쉬운 절반입니다. 어려운 절반은 정보 흐름(information flow)입니다. 저렴한 읽기 작업을 위해 허용된 값이 나중에 신뢰할 수 있는 작업이 소비하는 _컨텍스트(context)_를 오염시킬 수 있습니다. 해결책은 더 나은 권한 계층을 만드는 것이 아니라, 저수위 마크(low-water mark)를 설정하는 것입니다. 작업은 컨텍스트에 포함된 모든 요소의 최소 무결성(integrity)을 상속받습니다. 따라서 단일 출처의 검증되지 않은 메모리가 들어오는 즉시, 해당 작업의 유효 무결성은 떨어지며 '실패 시 차단(fail closed)' 상태가 됩니다. 만약 하나의 오염된 읽기 작업이 전체 작업을 무너뜨리지 못한다면, 당신의 레이블(labels)이 제대로 전파되지 않고 있는 것입니다.
왜 "독립적인 소스"는 실제로 자유롭지 않은가?
권위에 의존하게 되면, 유혹적인 규칙은 "최소 두 개의 독립적인 소스(independent sources)가 동의한다면 그 주장을 신뢰하라"는 것입니다. 여기서 핵심적인 단어는 _독립적인(independent)_입니다. 만약 공격자가 저렴하게 소스를 찍어낼 수 있다면(새로운 도메인, 새로운 문서 ID, 새로운 수집 시간 등), 상호 확인(corroboration)은 시빌 공격(Sybil attack)으로 무너집니다. 즉, 세 개의 기록을 위조하고, 독립성을 위조하여, 당신의 독성(poison)을 승급시키는 것입니다. 그는 이를 측정했습니다. 자체적으로 상호 확인을 제공하는 두 개의 갓 등록된 도메인은 카운트 게이트(count gate)를 무사히 통과했습니다.
이것은 RAG만의 특이한 현상이 아닙니다. "두 개의 독립적인 소스"는 **허가 없는 멤버십(permissionless membership)**의 검색(retrieval) 버전이며, 이는 수십 년 동안 열려 있었습니다. 비잔틴 합의(Byzantine agreement)는 결함이 있는 복제본(replicas)의 비율이 일정 수준 이하일 때만 안전한데, 그 복제본들이 실제로 독립적일 때만 그러하며, 그 독립성은 항상 대역 외(out of band)에서 가정되어 왔습니다. 신뢰할 수 있는 등록기관(registrar) 없이 이를 달성할 수 있었던 유일한 방법은 정체성(identity)을 희소하게 만드는 것이었습니다: 작업 증명(proof of work), 스테이크(stake), 또는 현실 세계의 증명(attestation) 등이 그것입니다. 따라서 설계 질문은 "이 청크(chunk)가 오염되었는가"(인코더에 의존하며 계속해서 깨지는 문제)에서 "무엇이 소스를 생성하는 비용을 높게 만드는가"(사람들이 20년 동안 연구해 온 멤버십 비용 문제)로 전환됩니다.
실험에서 실제로 살아남은 것은 무엇인가?
그는 상호 확인 소스의 비용을 높이는 네 가지 방법(허용 목록 또는 등록기관, 서명된 증명, 작업 증명, 그리고 감쇠가 적용된 스테이크 기반 지위)을 구축하고, 위조된 다중 소스 독성(multi-source poison)에 대해 각각을 측정했습니다. 정직한 결과는 다음과 같이 깔끔하게 분류됩니다:
- 비용만으로는 공격의 가격을 책정할 뿐, 이를 차단할 수는 없습니다. 작업 증명 (Proof of work)과 스테이킹 (staking)은 대칭적인 세금입니다. 정직한 작성자도 동일한 비용을 지불하며, 고전적인 결과(Cheng and Friedman, 2005)에 따르면 어떤 대칭적 평판 함수도 시빌 공격 (Sybil attack)을 방어할 수 없습니다.
- 도움이 되는 것은 비대칭적이며 시스템 외부에서 기원하는 것입니다. 결과 (outcomes) (이 메모리에 따라 행동했을 때 결과가 좋았는가)로부터 얻은 평판 (standing)은 네 가지 중 유일하게 비대칭적인 근원을 가집니다. 잘못된 독성 (poison)은 좋은 결과를 가져올 수 없습니다.
- 하지만 에이전트는 자신의 숙제를 스스로 채점할 수 없습니다. 만약 결과 신호가 내생적 (endogenous)이라면 (예를 들어 MINJA와 같은 공격이 에이전트로 하여금 스스로의 확증을 작성하게 만드는 경우), 전체 시스템은 붕괴합니다. 위조할 수 없는 유일한 결과는 공격자가 실제로 지불해야 하는 실제적인 결과이며, 이는 당신이 틀릴 수도 있다고 감수했던 행동들에 대해서만 관찰할 수 있습니다. 따라서 결과 학습 (outcome-learning)과 행동 게이팅 (action-gating)은 동일한 경계선에 있습니다. 당신은 가역적인 집합 (reversible set)에서 평판을 쌓으며, 높은 이해관계가 걸린 행동 (high-stakes actions)은 결코 학습하지 않고 오직 게이팅 (gating)될 뿐입니다.
명확히 언급할 가치가 있는 밀도(density) 측면의 함정이 있습니다. 오직 재사용되는 메모리만이 평판을 쌓을 수 있으므로, 콜드 롱테일 (cold long tail)은 결코 평판을 축적하지 못하며 영구적으로 상한선 아래에 머물게 됩니다. 평판 게이팅 (standing-gating)은 글로벌한 권한이 아니라 핫패스 (hot-path)의 특권입니다.
행동당 상한선 (per-action cap)을 조용히 무력화하는 공격
우리가 가지고 있다고 믿었던 잔여 위험(residual)은 "폭발 반경(blast-radius) 제한 내에서, 단 한 번의 공격을 수행하는 인내심 있는 잠복자"였습니다. 그것은 틀렸으며, 우리가 여러분이 가장 중요하게 받아들이길 바라는 교정 사항입니다. 개별 항목에 대한 상한선(per-item cap)은 가역성 임계값(reversibility threshold)을 초과할 만큼 합산되는, 개별적으로는 가역적인 쓰기(writes)의 "연쇄(run)"에 대해서는 침묵합니다. 이것은 살라미 전술(salami-slicing)이며, 그는 버전이 누적되어 되돌릴 수 없는 결과로 이어지는 것을 측정했습니다. 이를 제한할 수 있는 유일한 스칼라(scalar)는 행동당 상한선(per-action cap)이 아니라 **소스당 누적 예산(cumulative per-source budget)**입니다. (긴 기간에 걸쳐 작은 상한선을 분할하여 사용하는) 인내심 있는 공격자를 제어할 수 있는 유일한 레버는 **소급적 몰수(retroactive forfeiture)**입니다. 즉, 축적된 권한은 적발 시 소멸되는 채권(bond)이 되며, 따라서 실질적인 비용은 상한선이 아니라 적발 확률의 역수에 따라 결정됩니다.
이러한 요소들을 배치하면 문제의 정직한 형태가 드러납니다. 즉, 잔여 위험을 제거하는 것이 아니라, 그 가격을 책정하고, 제한하며, 되돌릴 수 없는 꼬리 위험(tail risk)에 가역적인 인간 게이트(human gate)를 두는 것입니다. 자동 몰수(Auto-forfeiture)는 기본적으로 꺼져 있습니다. 왜냐하면 공격자가 영향을 미칠 수 있는 오라클(oracle) 환경에서 자동 페널티는 프레이밍 무기(framing weapon)로 사용될 수 있기 때문입니다. (즉, 경쟁자에게 귀속된 나쁜 결과를 유도하여 경쟁자를 자동으로 차단하게 만드는 방식입니다.) 인간은 진실을 판별하는 오라클이 되기 위해 존재하는 것이 아닙니다. 인간은 몰수를 드물고 가역적으로 유지하기 위해 존재하며, 이것이 프레이밍 공격의 힘을 빼는 유일한 속성입니다.
모든 것이 서 있는 바닥
모든 계층을 벗겨내면, 그들은 모두 아무도 제한하지 않았던 하나의 축, 즉 속성(attribution) 위에 조용히 올라타 있습니다. 탐지기(detector), 예산(budget), 그리고 게이트(gate)는 모두 특정 행동을 그 소스(source)에 정확히 할당하고 그것이 비가역적인지 여부를 라벨링할 수 있다고 가정합니다. 단 한 번의 라벨 재지정(relabel)은 다른 세 가지 요소를 저하시키는 것이 아니라, 이들이 모두 동일한 소스 ID를 기반으로 하기 때문에 한꺼번에, 그리고 조용히 무효화합니다. 속성(Attribution)은 네 번째 제어 수단이 아닙니다. 그것은 다른 세 가지가 서 있는 바닥입니다.
교과서적인 암호학(Haber와 Stornetta 계보의 해시 체인 영수증 등)을 사용하면 속성(Attribution)을 _변조 탐지 가능(tamper-evident)_하게 만들 수 있으므로, 사후적인 레이블 재지정(relabeling)이 더 이상 조용히 일어나지 않게 됩니다. 하지만 단일 시스템 내부에서 얻을 수 없는 것은 바로 쓰기 시점에 신뢰할 수 있는(trust at write time) 속성입니다. 만약 공격자가 레이블링 채널을 제어하고 있다면, 레이블의 진실성은 정확히 그들이 제어하는 대상이 됩니다. 이는 쓰기 시점에 공격자가 보유하지 않은 무언가(기원 서명된 출처(origin-signed provenance) 또는 세상에 대한 독립적인 확증)에 레이블을 결합할 때만 이동하며, 그 시점에서 "레이블을 신뢰할 수 있는가"는 다시 "루트(root)를 신뢰할 수 있는가"라는 정체성(identity)의 문제로 귀결됩니다. 탑은 당신이 외부에서 신뢰하기로 선택한 단 하나의 요소 위에서 종료되며, 그 위의 모든 것은 메커니즘입니다.
개인용, 로컬 퍼스트 브레인(local-first brain)에 주는 시사점
우리는 recal을 로컬 퍼스트(local-first) 개인 메모리 계층으로 구축하고 있습니다. 즉, 당신이 실제로 어떻게 작업하는지 관찰하고, 당신의 기기 내에서, 당신이 제어하는 승인 게이트(approve-gate) 뒤에서 작동할 수 있는 무언가입니다. 개인용 메모리는 위의 모든 사항에 대해 더 높은 이해관계(stakes)를 부여합니다. "소스(sources)"는 당신이 캡처한 활동과 노트이며, "되돌릴 수 없는 행동(irreversible actions)"은 당신을 대신해 수행되는 일들이고, 잘못된 메모리를 잡아줄 클라우드 중재 팀도 존재하지 않습니다. 우리가 설계의 중심으로 삼는 교훈은 이 스레드가 얻어낸 결론과 같습니다. 즉, 나쁜 메모리를 탐지하려 하지 말고, 검증되지 않은 메모리가 무엇을 할 수 있는지 게이트를 설정하며, 파괴적인 결과는 가역적인 인간의 게이트 뒤에 두어야 하고, 변환 후에도 살아남는 출처(provenance-that-survives-transformation)를 전체 시스템이 의존하는 기질(substrate)로 취급해야 한다는 것입니다. "해결됨(Solved)"은 언제나 잘못된 단어였습니다. 인코더를 리셋시키는 군비 경쟁을 제한되고, 가격이 책정되며, 감사 가능한(auditable) 리스크로 전환하는 것이 바로 출시 가능한 승리입니다.
FAQ
지식 그래프(knowledge graph)나 더 나은 벡터 데이터베이스(vector database)가 RAG 오염(poisoning)을 해결하나요?
아니요. 둘 다 검색(retrieval)의 개선 사항일 뿐이며, 문제는 검색이 권위(authority)로 취급된다는 점입니다. 해결책은 이 둘을 분리하는 것입니다. 즉, 검색은 광범위하게 하되, 확증되고 출처가 추적된 메모리만이 행동을 유도하도록 해야 합니다.
AI가 생성했거나 오염된 텍스트를 탐지하는 것이 실행 가능한 방어책인가요?
그 자체만으로는 아닙니다. 탐지(Detection)는 임베딩 공간 (embedding space)에 존재하며, 인코더 (encoder)가 변경될 때마다 초기화됩니다. 메모리가 수행할 수 있는 권한을 제어(Gating)하는 것은 탐지와 달리 인코더 전반에 걸쳐 일반화될 수 있습니다.
가장 먼저 구축해야 할 단 하나의 가장 중요한 프리미티브 (primitive)는 무엇인가요?
변환(청킹 (chunking), 요약 (summarization), 재임베딩 (re-embedding)) 과정에서도 살아남는 출처 (Provenance)입니다. 다른 모든 제어 수단(예산 (budgets), 권한 (standing), 슬래싱 (slashing))은 특정 행동이 어떤 소스에서 왔는지 아는 것을 핵심으로 하므로, 귀속 (attribution)이 기본 토대입니다.
이를 위해 블록체인이 필요한가요?
아니요. 여기서 유용한 암호학은 지루하고 오래된 것입니다. 바로 해시 체인 방식의 변조 방지 영수증 (hash-chained, tamper-evident receipts)입니다. 여전히 해결되지 않은 어려운 부분은 변조 방지가 아니라, 쓰기 시점 (write time)에 라벨을 신뢰하는 문제입니다. 이는 합의 네트워크 (consensus network)가 아닌 외부 서명 루트 (external signing root)를 필요로 합니다.
AI의 도움을 받아 작성되었으며 사람이 편집했습니다. 이 내용은 r/LangChain의 실제 공개 스레드를 종합한 것입니다. 실험과 배포된 코드는 mnemo / agora-mnemo 유지 관리자의 것이며, 프레임워크는 공개적으로 협력하여 개발되었습니다. 기술적 주장 (CaMeL, Cheng and Friedman 2005, MINJA, Sybil / Douceur 2002, Haber and Stornetta)은 원문 소스를 통해 확인되었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기