Capa de defensa empaquetada para el ecosistema Agent2Agent (A2A) y los protocolos de
comercio agentico (AP2/ACP). Protege despliegues multi-agentes frente a las clases de
ataque que la investigación de 2025-2026 ya ha cuantificado y que el SDK de referencia
oficial (a2aproject/a2a-python) aún no cierra por defecto.
Alcance honesto (post-auditoría): este shield mitiga las superficies de ataque listadas abajo; no las elimina por sí solo. El server A2A debe usarlo como capa de validación delante de sus operaciones. No es un fork del SDK oficial ni un reemplazo de la autenticación de transporte (TLS/mTLS/OAuth).
- a2aproject/a2a-python issue #786 (OPEN, 2026): SSRF en webhooks de push notification y ausencia de autorización por operación. El mantenedor confirma el gap; el fix de SSRF sigue pendiente (#1023).
- arXiv:2608.23858 — Beyond the Mandate: Security Analysis of AP2 (Google).
- arXiv:2608.24069 — Poisoning Agentic Alpha: vulnerabilidades adversariales en comunicación inter-agentes de trading multi-agent.
- arXiv:2608.02698 / 2604.01151 — colusión encubierta en poblaciones de agentes.
- Parseo del envelope contra el esquema oficial.
- Auth de conexión (asume TLS/OAuth aguas afuera).
- Capability tokens con scope por operación (Ed25519):
sub/resource/actions/jti. Si no se proveecard_public_key, los tokens NO se verifican por firma (degradación documentada; úsalo solo en dev). - SSRF guard en webhooks: bloquea
file:///gopher://, IPs loopback/privadas, metadata cloud (169.254.169.254), con DNS-rebinding protection y IP pinning en el envío real (anti-TOCTOU). El server debe usarsend_push_notification()para disparar el webhook. - Agent Card firmada: canonicalización RFC 8785 (evita bug #1174) + verificación.
- Detección de colusión encubierta black-box en mensajes inter-agentes.
- Traza forense hash-encadenada para attribution. Vive en memoria del proceso; no persiste a disco (limitación conocida, ver SPEC §7).
python -m venv .venv && . .venv/bin/activate
pip install -e .# Auditar un endpoint remoto (hace fetch real del Agent Card) o un snippet local
a2a-defend audit https://tu-agente.example.com/.well-known/agent.json
# Proxy inspector delante del server A2A. Extrae el principal del request
# (Bearer sub / X-A2A-Caller). Con --card-public-key verifica firma de tokens.
a2a-defend serve --listen 127.0.0.1:8080 --upstream https://tu-agente.example.com \
--card-public-key pub.pem [--strict]
# Emitir un capability token de prueba
a2a-defend token --sub agent-a --resource 'a2a://server/*' --actions a2a.send,a2a.getComo biblioteca:
from a2a_core_defense import DefensePipeline, PipelineConfig
from a2a_core_defense.phases.ssrf_guard import send_push_notification
pipe = DefensePipeline(PipelineConfig(strict_card=True, card_public_key=pub_key))
verdict = pipe.inspect(raw_envelope, caller="agent-a", capability_token_raw=token_raw)
# Para disparar un webhook de forma segura (IP fijada):
await send_push_notification(url, payload)serveextrae el principal del request (headerAuthorization: Bearersub oX-A2A-Caller). Ese principal es identidad AUTO-DECLARADA: el proxy no verifica la firma del JWT ni de otro token; si el proxy es el borde de red sin firma verificada aguas arriba, es falsificable. En modo no-estricto (por defecto) una operación sensible sin principal se marca WARN y se deja pasar; con--strictse DENIEGA.- Sin
card_public_key, los capability tokens se aceptan sin verificar firma (degradación documentada para dev). Proporcionar--card-public-keyen producción. - La traza forense (Fase 7) no persiste entre reinicios.
- El pinning anti-TOCTOU del webhook (Fase 4) usa
request.extensions["sni_hostname"]: la conexión TCP va a la IP ya validada y el cert TLS se verifica contra el host real, así que webhooks HTTPS estándar funcionan. Solo se aplica si el server usasend_push_notification()para disparar el webhook, no conhttpx.postcrudo. - El fetch remoto de
auditpasa por el validador SSRF antes dehttpx.get. - No cubre RAG poisoning (véase nicho independiente).
AGPL-3.0-or-later — Copyright (C) 2026 Pedro Sordo Martínez — amurlaniakea@gmail.com
Ver LICENSE.