ASI06: 메모리 포이즈닝이 독립 위협으로 격상된 이유
OWASP는 2026년 Agentic AI Top 10에서 Memory and Context Poisoning을 ASI06으로 신규 등재했습니다. 에이전트가 대화 기록·벡터 저장소·장기 메모리를 스스로 갱신하는 구조가 보편화되면서, 한 번 오염된 상태가 이후 모든 세션의 판단을 왜곡하는 지속형 위협이 독립 항목으로 분리됐습니다. 단발성 입력 검증만으로는 방어가 성립하지 않는다는 점이 핵심입니다.
쓰기와 발현의 시간 분리
프롬프트 인젝션은 악성 입력이 들어온 그 요청에서 즉시 발현되므로 요청 단위 필터로 상당 부분 차단됩니다. 반면 메모리 포이즈닝은 오염 데이터를 쓰는 시점과 그것이 판단에 반영되는 시점이 분리됩니다. 오늘 심어진 레코드가 몇 주 또는 몇 달 뒤 특정 쿼리 조건에서만 발현되므로, 발현 시점에는 원인 입력이 로그에서 이미 밀려나 사후 추적이 어렵습니다.
MINJA: 임베딩 검사망을 우회하는 간접 주입
MINJA 공격은 외부 관리 권한 없이 정상 쿼리 상호작용만으로 악성 추론 기록을 에이전트 메모리에 심습니다. 표면 텍스트가 정상 대화와 통계적으로 유사해 임베딩 유사도 검사망을 우회하며, 보고된 평균 성공률은 76.8%입니다. 콘텐츠 자체가 아니라 누적된 추론 궤적이 오염되므로 문자열 차단 규칙으로는 탐지되지 않습니다.
A4 분량 상세 가이드: 기획부터 운영까지
기획 단계에서는 메모리 계층을 신뢰 등급으로 분리합니다. 검증된 지식은 읽기 전용, 세션 파생 메모리는 격리 후보로 태깅합니다. 목표 지표는 수치로 고정합니다. 예를 들어 메모리 쓰기 검증 통과율 99% 이상, 오염 의심 레코드 격리까지의 p95 지연 5분 이내, 정기 재검증에서 미분류 오염 레코드 0건을 릴리스 기준으로 삼습니다.
실패 유형은 세 가지로 나눠 복구 분기를 정의합니다. 첫째, 검증 신뢰도가 낮은 쓰기는 즉시 반영하지 않고 격리 큐에 넣어 재시도 또는 사람 확인으로 분기합니다. 둘째, 발현 시점에 출력이 정책과 충돌하면 안전 축약(최소 응답)으로 전환하고 해당 메모리 참조를 차단합니다. 셋째, 동일 레코드가 임계치 이상 재격리되면 자동 롤백을 멈추고 사람 검토를 강제하는 중단 조건을 둡니다.
운영 체크리스트는 표준 로그에서 시작합니다. 모든 메모리 쓰기에 대해 출처 세션 ID, 쓰기 시각, 검증 점수, 발현 시점의 참조 이력을 동일 스키마로 남겨 쓰기-발현 구간을 사후에 이어 붙일 수 있게 합니다. 로그와 메모리 본문에는 PII 마스킹을 적용해 이메일·전화번호·식별자를 저장 전에 치환합니다. 마스킹 누락은 릴리스 차단 사유로 처리합니다.
품질관리는 정기 재검증 배치로 보완합니다. 오래된 레코드를 주기적으로 다시 검사해 발현 지연형 공격의 잠복 구간을 좁히고, 격리·롤백·사람 확인 각 분기의 처리량과 오탐률을 주간 단위로 집계합니다.
지속 개선 루프는 발현 사례에서 시작해 쓰기 시점을 역추적하고, 놓친 검증 규칙을 재검증 배치와 쓰기 필터에 반영합니다. 오탐으로 격리된 정상 레코드는 복원하되 그 패턴을 화이트리스트가 아니라 검증 기준 완화의 근거로만 씁니다. 지표가 기준선 아래로 내려가면 자동 반영 비율을 낮추고 사람 확인 비중을 높이는 방향으로 조정합니다.
실행 요약
메모리 포이즈닝은 쓰기와 발현이 시간적으로 분리된 지속형 공격이므로, 요청 단위 필터가 아니라 쓰기 검증·격리·재검증·롤백을 잇는 상태 관리로 방어합니다. 통과율 99%, 격리 p95 5분, 미분류 오염 0건 같은 수치 기준을 릴리스 게이트로 걸고, 실패 시 재시도·사람 확인·안전 축약·중단 조건으로 분기하는 것이 핵심입니다.