# memlineage v0.1.0: defensa de dos capas contra memory poisoning en agentes LLM

> Source: <https://dev.to/magopredator/memlineage-v010-defensa-de-dos-capas-contra-memory-poisoning-en-agentes-llm-5gpa>
> Published: 2026-07-15 02:12:19+00:00

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.*
