¿Cuál es el Top 10 de OWASP para Aplicaciones Agentic?

Una clasificación de los riesgos de seguridad más críticos específicos de los sistemas de agentes de IA que planifican, utilizan herramientas e interactúan con servicios externos de forma autónoma. La edición de 2026 aborda las amenazas emergentes a medida que la IA agéntica pasa de la investigación a los despliegues de producción.

1️⃣ ASI01 - Secuestro de objetivo de agente

Critical

Visión general

Un atacante manipula las metas u objetivos de un agente a través de entradas manipuladas, haciendo que persiga objetivos no deseados. A diferencia de la simple inyección de instrucciones, el secuestro de objetivos puede persistir a través de múltiples pasos de planificación, haciendo que el agente tome una serie de acciones dañinas de forma autónoma.

Riesgo

Los atacantes pueden redirigir agentes autónomos para exfiltrar datos, modificar configuraciones del sistema o realizar cadenas de ataques de varios pasos que son difíciles de detectar porque el agente parece funcionar con normalidad.

Ejemplo de código vulnerable

Python ❌ Bad
# Agent goal is derived directly from untrusted input
def run_agent(user_request: str) -> str:
    goal = f"Complete this task: {user_request}"
    plan = llm.plan(goal)
    for step in plan:
        execute(step)  # No validation of planned steps

Ejemplo de código seguro

Python ✅ Good
import re

ALLOWED_GOALS = ["summarize", "search", "draft_email", "analyze_data"]

def sanitize_goal(user_request: str) -> str:
    # Strip injection patterns
    cleaned = re.sub(r'(?i)(ignore|override|new goal|forget).*', '', user_request)
    return cleaned.strip()

def run_agent(user_request: str) -> str:
    sanitized = sanitize_goal(user_request)
    goal = f"Complete this task: {sanitized}"
    plan = llm.plan(goal)

    # Validate each step against allowed actions
    for step in plan:
        if step.action not in ALLOWED_GOALS:
            raise ValueError(f"Disallowed action: {step.action}")
        if goal_drift_detected(step, sanitized):
            raise ValueError("Goal drift detected, aborting")
    for step in plan:
        execute(step)

Lista de control de las medidas paliativas

2️⃣ ASI02 - Uso indebido y explotación de herramientas

Critical

Visión general

Los agentes con acceso a herramientas externas (APIs, sistemas de archivos, bases de datos, navegadores web) pueden ser manipulados para hacer un mal uso de estas herramientas. El acceso sin restricciones a herramientas permite a los atacantes realizar operaciones no autorizadas a través del agente.

Riesgo

Un agente con acceso ilimitado a la herramienta podría eliminar archivos, enviar solicitudes API no autorizadas, filtrar datos a través de la navegación web o modificar configuraciones críticas del sistema.

Ejemplo de código vulnerable

Python ❌ Bad
# Agent can call any tool without restrictions
def agent_execute(tool_name: str, params: dict):
    tool = tools_registry.get(tool_name)
    return tool(**params)  # No validation or approval

Ejemplo de código seguro

Python ✅ Good
TOOL_ALLOWLIST = {
    "web_search": {"max_calls": 10, "approval": False},
    "send_email": {"max_calls": 1, "approval": True},
    "file_write": {"max_calls": 5, "approval": True},
}

def agent_execute(tool_name: str, params: dict, session) -> str:
    if tool_name not in TOOL_ALLOWLIST:
        return "Error: Tool not permitted"

    config = TOOL_ALLOWLIST[tool_name]
    if session.tool_calls[tool_name] >= config["max_calls"]:
        return "Error: Tool call limit exceeded"

    if config["approval"]:
        if not request_human_approval(tool_name, params):
            return "Action denied by user"

    session.tool_calls[tool_name] += 1
    return tools_registry[tool_name](**params)

Lista de control de las medidas paliativas

3️⃣ ASI03 - Abuso de identidad y privilegios

Critical

Visión general

Los agentes suelen heredar la identidad y los permisos de la cuenta de usuario o servicio que los lanzó. Esta excesiva herencia de privilegios permite a los agentes realizar acciones más allá de lo necesario, creando una amplia superficie de ataque si el agente se ve comprometido.

Riesgo

Un agente comprometido que se ejecute con credenciales de administrador puede acceder a todos los sistemas, modificar permisos y escalar privilegios en toda la organización.

Ejemplo de código vulnerable

Python ❌ Bad
# Agent inherits full user credentials
def create_agent(user_session):
    agent = Agent(
        credentials=user_session.full_credentials,  # All permissions!
        scope="*",
    )
    return agent

Ejemplo de código seguro

Python ✅ Good
def create_agent(user_session, task_type: str):
    # Issue scoped, short-lived credentials for the agent
    scoped_token = auth.create_scoped_token(
        parent_token=user_session.token,
        scopes=TASK_SCOPES[task_type],  # Minimal required permissions
        ttl_minutes=30,
        max_actions=50,
    )

    agent = Agent(
        credentials=scoped_token,
        scope=TASK_SCOPES[task_type],
        audit_log=True,
    )
    return agent

TASK_SCOPES = {
    "summarize": ["read:documents"],
    "draft_email": ["read:contacts", "draft:email"],
    "analyze": ["read:data", "write:reports"],
}

Lista de control de las medidas paliativas

4️⃣ ASI04 - Vulnerabilidades de la cadena de suministro agenética

High

Visión general

Los sistemas de agentes dependen de complementos de terceros, integraciones de herramientas y marcos de agentes compartidos. Los componentes comprometidos o maliciosos en la cadena de suministro de agentes pueden introducir puertas traseras, canales de exfiltración de datos o capacidades no autorizadas.

Python ❌ Bad
# Loading plugins without verification
def load_plugin(plugin_url: str):
    code = requests.get(plugin_url).text
    exec(code)  # Arbitrary code execution!
Python ✅ Good
import hashlib, importlib

TRUSTED_PLUGINS = {
    "search_plugin": "sha256:a1b2c3...",
    "email_plugin": "sha256:d4e5f6...",
}

def load_plugin(plugin_name: str) -> None:
    if plugin_name not in TRUSTED_PLUGINS:
        raise ValueError(f"Untrusted plugin: {plugin_name}")

    module = importlib.import_module(f"plugins.{plugin_name}")
    actual_hash = compute_hash(module.__file__)

    if actual_hash != TRUSTED_PLUGINS[plugin_name]:
        raise ValueError("Plugin integrity check failed")

    module.init(sandbox=True)

Lista de control de las medidas paliativas

5️⃣ ASI05 - Ejecución inesperada de código

Critical

Visión general

Los agentes que pueden generar y ejecutar código (por ejemplo, agentes de análisis de datos, asistentes de codificación) pueden ser engañados para ejecutar código malicioso. Sin un sandboxing adecuado, esto puede llevar a comprometer el sistema, robo de datos o movimiento lateral.

Riesgo

Los agentes que utilizan eval() o exec() en el código generado pueden ser explotados para la ejecución remota de código, permitiendo a los atacantes obtener acceso completo al sistema.

Ejemplo de código vulnerable

Python ❌ Bad
# Agent executes generated code directly
def code_agent(task: str) -> str:
    code = llm.generate_code(task)
    result = eval(code)  # Dangerous!
    return str(result)

Ejemplo de código seguro

Python ✅ Good
import subprocess, tempfile, os

BLOCKED_MODULES = ["os", "subprocess", "socket", "shutil"]

def code_agent(task: str) -> str:
    code = llm.generate_code(task)

    # Static analysis: block dangerous imports
    for mod in BLOCKED_MODULES:
        if f"import {mod}" in code or f"from {mod}" in code:
            raise ValueError(f"Blocked import: {mod}")

    # Execute in sandboxed container with resource limits
    result = sandbox.run(
        code=code,
        timeout=30,
        memory_mb=256,
        network=False,
        read_only_fs=True,
    )
    return result.output

Lista de control de las medidas paliativas

6️⃣ ASI06 - Envenenamiento de la memoria y el contexto

High

Visión general

Los agentes que mantienen una memoria persistente (GAR, historial de conversaciones, preferencias aprendidas) son vulnerables al envenenamiento de la memoria. Los atacantes inyectan contenido malicioso en la base de conocimientos del agente, haciendo que produzca resultados comprometidos en futuras interacciones.

Python ❌ Bad
# Agent stores all interactions without validation
def store_memory(agent_id: str, interaction: str):
    memory_db.insert(agent_id, interaction)  # No filtering
Python ✅ Good
def store_memory(agent_id: str, interaction: str, source: str):
    # Validate content before storing
    if contains_injection_patterns(interaction):
        log.warning(f"Blocked poisoned memory: {agent_id}")
        return

    memory_db.insert(
        agent_id=agent_id,
        content=interaction,
        source=source,
        provenance=compute_provenance(source),
        timestamp=now(),
        ttl_days=30,  # Auto-expire old memories
    )

def retrieve_memory(agent_id: str, query: str) -> list:
    results = memory_db.search(agent_id, query)
    # Filter by provenance score
    return [r for r in results if r.provenance_score > 0.8]

Lista de control de las medidas paliativas

7️⃣ ASI07 - Comunicación insegura entre agentes

High

Visión general

Los sistemas multiagente en los que los agentes se comunican entre sí son vulnerables a la manipulación de mensajes, la suplantación de identidad y las escuchas. Sin las comprobaciones adecuadas de autenticación e integridad, un agente comprometido puede inyectar instrucciones maliciosas en la red de agentes.

Python ❌ Bad
# Agents communicate via plain text messages
def send_to_agent(target: str, message: str):
    channel.send(target, message)  # No auth, no signing
Python ✅ Good
import hmac, json, time

def send_to_agent(target: str, message: str, sender_key: bytes):
    payload = {
        "content": message,
        "sender": agent_id,
        "target": target,
        "timestamp": time.time(),
        "nonce": os.urandom(16).hex(),
    }
    signature = hmac.new(
        sender_key, json.dumps(payload).encode(), "sha256"
    ).hexdigest()
    payload["signature"] = signature

    encrypted = encrypt(json.dumps(payload), target_public_key)
    channel.send(target, encrypted)

def receive_message(data: bytes, private_key) -> dict:
    payload = json.loads(decrypt(data, private_key))
    if not verify_signature(payload):
        raise ValueError("Invalid message signature")
    if is_replay(payload["nonce"]):
        raise ValueError("Replay attack detected")
    return payload

Lista de control de las medidas paliativas

8️⃣ ASI08 - Fallos en cascada

High

Visión general

En los flujos de trabajo multiagente o multipaso, un error o una acción maliciosa en un agente puede propagarse por el sistema, provocando fallos en cascada. Sin límites de error adecuados, un solo paso comprometido puede corromper todo el proceso.

Python ❌ Bad
# Errors propagate without boundaries
def pipeline(data):
    result1 = agent_a.process(data)
    result2 = agent_b.process(result1)  # If agent_a fails or is poisoned...
    result3 = agent_c.process(result2)  # ...error cascades to all
    return result3
Python ✅ Good
from circuitbreaker import circuit

class AgentPipeline:
    def __init__(self):
        self.circuit_breakers = {}

    @circuit(failure_threshold=3, recovery_timeout=60)
    def safe_execute(self, agent, data):
        result = agent.process(data)
        if not validate_output(result):
            raise ValueError("Output validation failed")
        return result

    def pipeline(self, data):
        try:
            r1 = self.safe_execute(agent_a, data)
        except Exception:
            r1 = fallback_a(data)

        try:
            r2 = self.safe_execute(agent_b, r1)
        except Exception:
            r2 = fallback_b(r1)

        return r2

Lista de control de las medidas paliativas

9️⃣ ASI09 - Explotación de la confianza entre humanos y agentes

Medium

Visión general

Los usuarios pueden confiar demasiado en los resultados de los agentes y aprobar acciones sin una revisión adecuada. Los agentes que presentan recomendaciones con gran confianza pero insuficiente fundamento pueden llevar a los usuarios a tomar decisiones perjudiciales. Los atacantes pueden aprovecharse de esta relación de confianza.

Python ❌ Bad
# Agent requests approval without context
def request_action(action: str):
    # "Deploy to production?" - user clicks Yes without review
    return ui.confirm(f"Execute: {action}?")
Python ✅ Good
def request_action(action: str, context: dict) -> bool:
    confidence = context.get("confidence", 0.0)
    risk_level = assess_risk(action)

    approval_request = {
        "action": action,
        "confidence": f"{confidence:.0%}",
        "risk_level": risk_level,
        "reasoning": context["reasoning"],
        "affected_systems": context["systems"],
        "reversible": context.get("reversible", False),
    }

    # Force detailed review for high-risk or low-confidence
    if risk_level == "high" or confidence < 0.8:
        return ui.detailed_review(approval_request)

    return ui.confirm(approval_request)

Lista de control de las medidas paliativas

🔟 ASI10 - Agentes deshonestos

High

Visión general

Los agentes pueden desviarse de su propósito previsto debido a la desalineación de objetivos, la manipulación adversaria o los comportamientos emergentes. Los agentes deshonestos pueden perseguir objetivos que entren en conflicto con las metas de la organización, acumular recursos o resistirse a los intentos de cierre.

Python ❌ Bad
# Agent runs without monitoring or kill switch
def run_agent(task):
    while True:
        agent.step()  # No termination condition
Python ✅ Good
class MonitoredAgent:
    def __init__(self, agent, max_steps=100):
        self.agent = agent
        self.max_steps = max_steps
        self.step_count = 0
        self.behavior_log = []

    def run(self):
        while self.step_count < self.max_steps:
            action = self.agent.next_action()

            # Check for rogue behavior
            if self.is_off_task(action):
                log.alert(f"Rogue behavior: {action}")
                self.shutdown()
                return

            # Check guardrails
            if not guardrails.check(action):
                log.warning(f"Guardrail violation: {action}")
                continue

            self.agent.execute(action)
            self.step_count += 1
            self.behavior_log.append(action)

    def shutdown(self):
        self.agent.stop()
        revoke_credentials(self.agent.id)
        notify_admin(self.behavior_log)

Lista de control de las medidas paliativas

📊 Cuadro recapitulativo

ID Vulnerabilidad Gravedad Mitigación clave
ASI01Secuestro de objetivo de agenteCriticalSaneamiento de entradas, detección de desviación de objetivos, listas de objetivos permitidos
ASI02Uso indebido y explotación de herramientasCriticalListas de herramientas, aprobación humana, límites de tarifa
ASI03Abuso de identidad y privilegiosCriticalCredenciales de alcance, tokens de corta duración, privilegio mínimo
ASI04Vulnerabilidades de la cadena de suministroHighVerificación de firmas de plugins, ejecución en sandbox
ASI05Ejecución inesperada de códigoCriticalContenedores aislados, análisis estático, sin eval()
ASI06Envenenamiento de la memoria y el contextoHighValidación de entrada, seguimiento de procedencia, TTL en memoria
ASI07Comunicación insegura entre agentesHighFirma de mensajes, cifrado, prevención de repeticiones
ASI08Fallos en cascadaHighDisyuntores, validación de salidas, gestores de fallback
ASI09Explotación de la confianza entre humanos y agentesMediumDespliegue de confianza, revisión detallada, confianza progresiva
ASI10Agentes deshonestosHighSupervisión del comportamiento, barandillas, interruptor de corte