Un agente con memoria persistente puede ser envenenado por un adversario que solo interactúa por canales normales. Presentamos una defensa de dos capas (provenancia criptográfica + detección por comportamiento) en Python, verificada por auditoría independiente y CI.
Los agentes con memoria persistente (RAG / agentic memory) introducen una superficie de ataque nueva: un adversario que interactúa solo a través de canales normales puede inyectar memorias diseñadas que, al ser recuperadas, desvían el comportamiento futuro del agente — sin tocar pesos del modelo ni código.
El trabajo académico reciente lo confirma de forma reproducible:
La conclusión común: los filtros basados en contenido son evadidos por texto empresarial fluido, y los trust score son maleables. Hace falta origen criptográfico y detección por comportamiento.
KeyRegistry
vincula cada principal a su propia clave. register()
solo se permite en la inicialización de confianza; freeze()
bloquea el registro en runtime para que la lógica del agente no pueda auto-registrarse como principal interno.SensitiveActionGate
Un auditor externo clonó el repo desde cero, instaló, y escribió sus propias pruebas adversariales (no las del repo) para verificar las garantías. Métricas reales:
| Garantía | Resultado |
|---|---|
| Spoof de principal sin su clave | Rechazado (PermissionError) |
| Laundering transitivo (5 niveles) | Nodo sigue untrusted , gate bloquea |
| Mezcla confiable + no confiable en una justificación | Bloquea (basta una no confiable) |
RegistryFrozenError tras freeze() |
|
| Bloquea registro en runtime | |
| Firma reciclada de memoria legítima a maliciosa | Rechazada (atada a entry_id+contenido+source) |
| ASR de ataque externo real (Capa A) | 0.000 |
| AUC Capa B (sin camuflaje) | 0.988 |
| AUC Capa B (con camuflaje del atacante) | 0.978, Recall 0.950 |
El benchmark usa ataques por paráfrasis semántica (no frases regex literales) con generación estocástica de trayectorias y solapamiento de clases, y reporta media ± desviación sobre varias semillas. El camuflaje degrada el AUC y el Recall de forma medible — el benchmark mide generalización, no memorización de plantillas.
Limitación declarada:el ataque de Capa B es una aproximación local de MINJA (paráfrasis + heurística derecall), no el optimizador white-box publicado. El AUC mide robustez contraesteataque, no contra MINJA completo.
git clone https://github.com/amurlaniakea/memlineage.git
cd memlineage
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest -q
python -c "from memlineage.benchmark import run_seeds; print(run_seeds())"
| Componente | Tecnología |
|---|---|
| Criptografía | Ed25519 (cryptography ) |
| Linaje | |
networkx (DAG, max-of-strong-edges) |
|
| Detector | |
scikit-learn RandomForest + regla de invariante |
|
| CI | GitHub Actions + SonarCloud + Code Scanning |
¿Dónde encaja esto en tu stack de agentes? Comentarios abiertos.
Licencia: AGPL-3.0-or-later. Autor: Pedro Sordo Martínez.