CVE-2026-37751 — ai-maestro: command injection en killSessionSync, sin auth ni interacción (9.8)
La función killSessionSync de 23blocks-OS ai-maestro v0.24.17 arma un comando de shell con input controlado por el atacante y lo ejecuta sin sanitizar. Vector de red, complejidad baja, cero privilegios, cero interacción del usuario: AV:N/AC:L/PR:N/UI:N con impacto alto en las tres patas. Eso es el 9.8 completo, no un score inflado.
Ojo con esto: el orquestador de agentes es justo el componente que suele quedar escuchando en la red interna porque «solo lo llaman nuestros propios workers». Hasta que actualices, segmentá la red, cerrá el endpoint y mirá los logs de ejecución de comandos. Un orquestador comprometido no te cuesta un servicio, te cuesta todos los agentes que despacha.
CVE-2026-80104 — DB-GPT 0.8.0: la subida de skills escribe donde le digas, y la auth devuelve admin siempre (9.3)
Tres fallas encadenadas en el endpoint de subida de skills de DB-GPT 0.8.0 (eosphoros-ai): el handler usa el filename tal cual, sin canonicalizar ni verificar que quede dentro del directorio; el endpoint no pide autenticación; y la función de auth devuelve privilegios de admin sin importar las credenciales. Un payload tipo ../../../tmp/malicious.py escribe donde el proceso tenga permiso.
El salto a ejecución no es teórico: si el módulo Python subido se importa después, el código corre. 9.3 en CVSS v4.0, 9.8 en v3.1. Parche en v0.8.1. Y mientras tanto la lección de siempre: canonicalizá el path ANTES de tocar el filesystem, y una función de auth que devuelve admin en todos los caminos no es auth, es decoración.
CVE-2026-37003 — Agno ≤ 2.5.8: PythonTools y ShellTools mandan lo que dice el LLM directo a exec() y subprocess
En Agno hasta 2.5.8, los componentes PythonTools y ShellTools pasan argumentos generados por el LLM, sin sanitizar, directo a sinks de ejecución: exec(), runpy.run_path() y subprocess.run(). El atacante no necesita credenciales: le alcanza con meter instrucciones en contenido que el agente vaya a procesar — una página web, un documento, un ticket.
Esta es la clase de bug que va a definir el año. La salida del modelo NO es input confiable. Es input de un tercero que casualmente pasa por tu modelo. Actualizá por encima de 2.5.8, validá todo argumento generado por el LLM antes del sink, y corré el proceso del agente en sandbox o container. Las tres cosas, no una.
CVE-2026-82268 — Qwen-Agent ≤ 0.0.34: el parser de documentos acepta cualquier URL y te trae la metadata del cloud (8.7)
SSRF clásico (CWE-918) en el parseo de documentos de Qwen-Agent: la URL que provee el llamador no se valida ni por esquema ni por host. Vía la interfaz Gradio, que va sin autenticación, se manda una ruta de documento que el servidor trata como URL legítima y sale a buscar direcciones internas — incluidos los servicios de metadata del cloud — devolviendo el contenido.
Hay PoC pública y la explotación es trivial. Arreglado en 0.0.35. Si no podés actualizar hoy: autenticación delante de Gradio, restricción del tráfico entrante, o whitelist de salida. Y anotá el patrón: cada vez que un agente acepta «una URL de documento», acabás de darle a un desconocido un cliente HTTP adentro de tu VPC.
CVE-2026-55585 — QWED: expresiones matemáticas a SymPy parse_expr() sin namespace restringido, y el signup abierto por defecto (8.8)
El paquete qwed-verification, anterior a 5.1.2, pasa expresiones matemáticas controladas por el llamador directo a parse_expr() de SymPy sin namespace restringido. Traducción: ejecución arbitraria de Python en el servidor. Los endpoints afectados son POST /verify/math, que acepta cualquier API key de tenant, y POST /verify/batch.
Lo que sube el impacto no es el bug en sí, es la combinación: POST /auth/signup viene habilitado por defecto, así que cualquiera se crea una cuenta de tenant y ya tiene la key que hace falta. En un despliegue multi-tenant compartido, eso es leer y escribir archivos, ejecutar comandos y comprometer a los demás tenants. Actualizá a 5.1.2 y apagá el signup público.
CVE-2026-82640 — browser-use web-ui: las API keys de los proveedores quedan en disco en texto plano (6.8)
browser-use web-ui, de 2.0.0 a 3.0.0, escribe las API keys de LLM configuradas a disco en texto plano, sin cifrado ni restricción de acceso, en archivos JSON de nombre predecible dentro de directorios temporales de settings. CWE-312. Vector local, complejidad baja: cualquiera con lectura sobre esos directorios se lleva tus claves de proveedor.
Un 6.8 no te va a despertar de noche, pero medí el blast radius real: no es la app la que se compromete, es tu factura de OpenAI o Anthropic y todo lo que esas claves puedan tocar. Rotá las keys si corriste alguna de esas versiones en una máquina compartida, y revisá permisos en los directorios de settings.
CVE-2026-82021 — Hermes Agent: el catálogo MCP apunta a ramas mutables, no a commits fijos (9.0)
El catálogo MCP que trae Hermes Agent de NousResearch, versiones 0.18.2 a 0.19.0, referencia repositorios upstream por rama mutable en lugar de por hash de commit fijo. CWE-494, «Download of Code Without Integrity Check». Si alguien compromete uno de esos repos upstream, el payload se propaga solo a todas las máquinas que instalen esa entrada del catálogo, sin que ningún operador haga nada.
Actualizá a 0.19.0 o posterior. Pero el arreglo estructural es otro y aplica a todos: pineá las entradas del catálogo MCP a un SHA de commit específico, exigí firma de commits y limitá el write access a mantenedores de confianza. Una rama es un puntero móvil; confiar en ella es delegarle tu integridad a quien tenga push.
CVE-2026-55557 — browse-mcp: path traversal en download y save_state, con prompt injection como disparador (8.6)
browse-mcp, servidor MCP de navegador headless, antes de 0.8.2: browser_download no valida el directorio de guardado que le pasan, y browser_save_state / browser_load_state aceptan rutas sin validar. CWE-22. El atacante controla la ruta y el contenido, así que puede escribir en ~/.bashrc, en un cron o en entradas de autostart.
La parte interesante es quién dispara el ataque. No hace falta un cliente MCP malicioso: alcanza con un agente autónomo dirigido por prompt injection indirecta desde una página que visitó. La página elige el save_dir. Eso es lo que significa darle al agente un filesystem sin fronteras. Actualizá a 0.8.2, firewall al servidor MCP y monitoreo sobre directorios críticos.
«Resumime esta web» termina en RCE: Rehberger encadena curl, un ZIP y module shadowing contra Claude Code en Auto Mode
Johann Rehberger (wunderwuzzi) mostró que Claude Code corriendo Opus 5 en Auto Mode se puede llevar a ejecutar código del atacante partiendo de un pedido inocente: resumir una página. La cadena son varios pasos que individualmente parecen benignos — el resumen dispara un WebFetch que falla, el fallo empuja a usar curl, el curl redirige a un ZIP hostil, y ahí entra el module shadowing de Python.
El truco fino: el atacante planta un struct.py envenenado, que se ejecuta cuando el modelo escribe su propio decodificador. Los guardrails que se niegan a correr binarios provistos por el usuario no ven nada raro, porque el código lo escribe el modelo. Tasa de éxito del 60–80% según la variante. Demostró calculadora, reconocimiento del sistema, e instancias anidadas de Claude Code con acceso a herramientas propio.
Anthropic describe Auto Mode como una función de conveniencia respaldada por un clasificador best-effort, no como una garantía de seguridad. Rehberger lo resume mejor: no confíes en la salida del modelo. La defensa real es sandbox — SO y red restringidos — no un clasificador.
Tendencias Destacadas
Cambió el objetivo. Las semanas anteriores el bug repetido era el servidor MCP mal atado; esta semana el patrón es el agente que trata la salida del LLM como si fuera código propio. Agno la manda a exec(), browse-mcp deja que una página visitada elija el directorio de escritura, y la cadena de Rehberger contra Claude Code funciona justamente porque el modelo escribe el decodificador que ejecuta el struct.py envenenado. Si tu guardrail pregunta «¿quién escribió este código?» en vez de «¿de dónde vino esta instrucción?», ya perdiste.
Segundo patrón, más aburrido y más caro: la interfaz de administración sin auth. DB-GPT con una función de auth que devuelve admin siempre, Qwen-Agent con Gradio abierto, QWED con signup público habilitado por defecto, ai-maestro escuchando en la red. Ninguno de estos es un bug sofisticado. Son defaults pensados para la demo local que llegaron a producción sin que nadie los revisara. El default correcto para una UI de agente es loopback y auth obligatoria, siempre.
CVE-2026-37751 — ai-maestro: command injection in killSessionSync, no auth, no interaction (9.8)
The killSessionSync function in 23blocks-OS ai-maestro v0.24.17 builds a shell command from attacker-controlled input and runs it without sanitization. Network vector, low complexity, no privileges, no user interaction: AV:N/AC:L/PR:N/UI:N with high impact on all three legs. That is a genuine 9.8, not an inflated score.
Watch this one: the agent orchestrator is exactly the component people leave listening on the internal network because «only our own workers call it». Until you upgrade, segment the network, close the endpoint, and watch your command-execution logs. A compromised orchestrator does not cost you one service, it costs you every agent it dispatches.
CVE-2026-80104 — DB-GPT 0.8.0: skill upload writes anywhere, and the auth function always returns admin (9.3)
Three chained failures in DB-GPT 0.8.0's skill upload endpoint (eosphoros-ai): the handler uses the filename as-is with no canonicalization and no directory boundary check; the endpoint requires no authentication; and the auth function returns admin privileges regardless of credentials. A payload like ../../../tmp/malicious.py writes anywhere the process can reach.
The jump to execution is not theoretical: if the uploaded Python module gets imported later, the code runs. 9.3 on CVSS v4.0, 9.8 on v3.1. Patched in v0.8.1. In the meantime, the usual lesson: canonicalize the path BEFORE touching the filesystem, and an auth function that returns admin on every path is not auth, it is decoration.
CVE-2026-37003 — Agno ≤ 2.5.8: PythonTools and ShellTools pipe LLM output straight into exec() and subprocess
In Agno up to 2.5.8, the PythonTools and ShellTools components pass unsanitized, LLM-generated arguments straight into execution sinks: exec(), runpy.run_path() and subprocess.run(). The attacker needs no credentials — planting instructions in content the agent will process is enough: a web page, a document, a ticket.
This is the bug class that will define the year. Model output is NOT trusted input. It is third-party input that happened to pass through your model. Upgrade past 2.5.8, validate every LLM-generated argument before the sink, and run the agent process in a sandbox or container. All three, not one.
CVE-2026-82268 — Qwen-Agent ≤ 0.0.34: the document parser accepts any URL and fetches your cloud metadata (8.7)
Textbook SSRF (CWE-918) in Qwen-Agent's document parsing: the caller-supplied URL gets no scheme restriction and no host validation. Through the Gradio interface, which ships unauthenticated, you hand it a document path the server treats as a legitimate URL and it goes fetching internal addresses — cloud metadata services included — handing the content back.
A PoC is public and exploitation is trivial. Fixed in 0.0.35. If you cannot upgrade today: put auth in front of Gradio, restrict inbound traffic, or whitelist outbound requests. And note the pattern: every time an agent accepts «a document URL», you just handed a stranger an HTTP client inside your VPC.
CVE-2026-55585 — QWED: math expressions into SymPy parse_expr() with no restricted namespace, and signup open by default (8.8)
The qwed-verification package before 5.1.2 passes caller-controlled math expressions straight into SymPy's parse_expr() with no restricted namespace. Translation: arbitrary Python execution on the server. The affected endpoints are POST /verify/math, which accepts any tenant API key, and POST /verify/batch.
What raises the impact is not the bug itself but the combination: POST /auth/signup is enabled by default, so anyone creates a tenant account and already holds the key they need. In a shared multi-tenant deployment that means reading and writing files, running system commands, and compromising other tenants. Upgrade to 5.1.2 and turn public signup off.
CVE-2026-82640 — browser-use web-ui: provider API keys written to disk in cleartext (6.8)
browser-use web-ui, versions 2.0.0 through 3.0.0, writes configured LLM API keys to disk in cleartext — no encryption, no access restrictions — in predictably-named JSON files inside temporary settings directories. CWE-312. Local vector, low complexity: anyone with read access to those directories walks off with your provider keys.
A 6.8 will not wake you up at night, but measure the real blast radius: it is not the app that gets compromised, it is your OpenAI or Anthropic bill and everything those keys can reach. Rotate the keys if you ran any of those versions on a shared machine, and check the permissions on the settings directories.
CVE-2026-82021 — Hermes Agent: the MCP catalog points at mutable branches, not fixed commits (9.0)
The MCP catalog bundled with NousResearch's Hermes Agent, versions 0.18.2 through 0.19.0, references upstream repositories by mutable branch instead of by fixed commit hash. CWE-494, «Download of Code Without Integrity Check». If someone compromises one of those upstream repos, the payload propagates on its own to every machine installing that catalog entry, with no operator involved.
Upgrade to 0.19.0 or later. But the structural fix is a different one and it applies to everybody: pin MCP catalog entries to a specific commit SHA, require commit signing, and restrict write access to trusted maintainers. A branch is a moving pointer; trusting it means delegating your integrity to whoever holds push.
CVE-2026-55557 — browse-mcp: path traversal in download and save_state, with prompt injection as the trigger (8.6)
browse-mcp, a headless-browser MCP server, before 0.8.2: browser_download does not validate the caller-supplied save directory, and browser_save_state / browser_load_state accept unvalidated paths. CWE-22. The attacker controls both the path and the content, so they can write to ~/.bashrc, a cron job, or autostart entries.
The interesting part is who pulls the trigger. A malicious MCP client is not required: an autonomous agent steered by indirect prompt injection on a page it visited is enough. The page picks the save_dir. That is what handing an agent a borderless filesystem actually means. Upgrade to 0.8.2, firewall the MCP server, and monitor critical directories.
«Summarize this website» ends in RCE: Rehberger chains curl, a ZIP and module shadowing against Claude Code in Auto Mode
Johann Rehberger (wunderwuzzi) showed that Claude Code running Opus 5 in Auto Mode can be walked into executing attacker code from an innocent starting point: summarize a page. The chain is several individually benign-looking steps — the summary triggers a WebFetch that fails, the failure pushes the model toward curl, the curl redirects to a hostile ZIP, and Python module shadowing takes over from there.
The sharp part: the attacker plants a poisoned struct.py that executes when the model writes its own decoder. Guardrails that refuse to run user-supplied binaries see nothing wrong, because the model wrote the code. Success rate of 60–80% depending on the variant. He demonstrated launching Calculator, system reconnaissance, and nested Claude Code instances with their own independent tool access.
Anthropic describes Auto Mode as a convenience feature backed by a best-effort classifier, not a security guarantee. Rehberger puts it better: do not trust the model output. The real defense is a sandbox — restricted OS and network access — not a classifier.
Notable Trends
The target moved. In previous weeks the repeated bug was the badly-bound MCP server; this week the pattern is the agent treating LLM output as if it were its own code. Agno sends it to exec(), browse-mcp lets a visited page pick the write directory, and Rehberger's chain against Claude Code works precisely because the model writes the decoder that executes the poisoned struct.py. If your guardrail asks «who wrote this code?» instead of «where did this instruction come from?», you already lost.
Second pattern, duller and more expensive: the unauthenticated admin surface. DB-GPT with an auth function that always returns admin, Qwen-Agent with Gradio wide open, QWED with public signup enabled by default, ai-maestro listening on the network. None of these is a sophisticated bug. They are defaults designed for the local demo that reached production with nobody reviewing them. The correct default for an agent UI is loopback plus mandatory auth, every time.
CVE-2026-37751 — ai-maestro : injection de commandes dans killSessionSync, sans auth (9.8)
La fonction killSessionSync d'ai-maestro v0.24.17 construit une commande shell à partir d'entrées contrôlées par l'attaquant et l'exécute sans assainissement. Vecteur réseau, complexité faible, aucun privilège, aucune interaction : AV:N/AC:L/PR:N/UI:N avec impact élevé sur les trois axes.
L'orchestrateur d'agents est précisément le composant laissé à l'écoute sur le réseau interne. En attendant la mise à jour : segmentation, fermeture de l'endpoint, surveillance des logs d'exécution.
CVE-2026-80104 — DB-GPT 0.8.0 : l'upload de skills écrit n'importe où, et l'auth renvoie toujours admin (9.3)
Trois failles chaînées dans l'endpoint d'upload de skills de DB-GPT 0.8.0 : nom de fichier utilisé tel quel sans canonicalisation, endpoint sans authentification, et fonction d'auth renvoyant admin quelles que soient les credentials. Un payload ../../../tmp/malicious.py écrit partout où le processus a droit.
Le saut vers l'exécution n'est pas théorique : si le module Python uploadé est importé ensuite, le code s'exécute. Correctif en v0.8.1.
CVE-2026-37003 — Agno ≤ 2.5.8 : PythonTools et ShellTools envoient la sortie du LLM dans exec() et subprocess
Dans Agno jusqu'à 2.5.8, PythonTools et ShellTools transmettent des arguments générés par le LLM, non assainis, vers exec(), runpy.run_path() et subprocess.run(). Aucune authentification requise : il suffit d'injecter des instructions dans un contenu traité par l'agent.
La sortie du modèle n'est PAS une entrée de confiance. Mettez à jour au-delà de 2.5.8, validez chaque argument avant le sink, et isolez le processus.
CVE-2026-82268 — Qwen-Agent ≤ 0.0.34 : le parseur de documents accepte n'importe quelle URL (8.7)
SSRF classique (CWE-918) dans le parsing de documents de Qwen-Agent : l'URL fournie par l'appelant n'est validée ni par schéma ni par hôte. Via l'interface Gradio non authentifiée, le serveur va chercher des adresses internes — services de métadonnées cloud inclus — et renvoie le contenu.
PoC publique, exploitation triviale. Corrigé en 0.0.35.
CVE-2026-55585 — QWED : expressions envoyées à SymPy parse_expr() sans namespace restreint (8.8)
Le paquet qwed-verification avant 5.1.2 transmet des expressions contrôlées par l'appelant à parse_expr() de SymPy sans namespace restreint : exécution Python arbitraire côté serveur, via POST /verify/math et POST /verify/batch.
Aggravant : POST /auth/signup est activé par défaut, n'importe qui obtient donc la clé nécessaire. Mettez à jour vers 5.1.2 et désactivez l'inscription publique.
CVE-2026-82640 — browser-use web-ui : clés API des fournisseurs écrites en clair sur disque (6.8)
browser-use web-ui, versions 2.0.0 à 3.0.0, écrit les clés API LLM configurées en clair sur disque, sans chiffrement ni restriction, dans des fichiers JSON aux noms prévisibles. CWE-312, vecteur local, complexité faible.
Le vrai rayon d'impact n'est pas l'application mais votre facture fournisseur et tout ce que ces clés atteignent. Faites tourner les clés si vous avez utilisé ces versions sur une machine partagée.
CVE-2026-82021 — Hermes Agent : le catalogue MCP pointe vers des branches mutables (9.0)
Le catalogue MCP fourni avec Hermes Agent (0.18.2 à 0.19.0) référence des dépôts upstream par branche mutable plutôt que par hash de commit. CWE-494. Un dépôt upstream compromis propage automatiquement son payload à toutes les machines installant cette entrée.
Mettez à jour vers 0.19.0. Le vrai correctif : épingler les entrées du catalogue à un SHA de commit, exiger la signature des commits, restreindre l'accès en écriture.
CVE-2026-55557 — browse-mcp : path traversal dans download et save_state (8.6)
browse-mcp, serveur MCP de navigateur headless, avant 0.8.2 : browser_download ne valide pas le répertoire de sauvegarde, et browser_save_state / browser_load_state acceptent des chemins non validés. CWE-22. Écriture possible dans ~/.bashrc, un cron ou l'autostart.
Le déclencheur : un agent autonome piloté par prompt injection indirecte sur une page visitée. Mettez à jour vers 0.8.2 et surveillez les répertoires critiques.
« Résume ce site » finit en RCE : Rehberger enchaîne curl, un ZIP et du module shadowing contre Claude Code
Johann Rehberger (wunderwuzzi) a montré que Claude Code sous Opus 5 en Auto Mode peut être amené à exécuter du code attaquant à partir d'une demande anodine : résumer une page. La chaîne enchaîne des étapes bénignes — WebFetch qui échoue, bascule vers curl, redirection vers un ZIP hostile, puis module shadowing Python.
Le point clé : un struct.py empoisonné s'exécute quand le modèle écrit son propre décodeur. Les garde-fous refusant les binaires fournis ne voient rien, car c'est le modèle qui écrit le code. Taux de réussite de 60 à 80 %.
Anthropic décrit Auto Mode comme une commodité adossée à un classificateur best-effort, pas une garantie de sécurité. La vraie défense est le sandbox, pas le classificateur.
Tendances Notables
La cible a bougé. Les semaines précédentes, le bug récurrent était le serveur MCP mal lié ; cette semaine, le motif est l'agent qui traite la sortie du LLM comme son propre code. Agno l'envoie à exec(), browse-mcp laisse une page visitée choisir le répertoire d'écriture, et la chaîne de Rehberger fonctionne précisément parce que le modèle écrit le décodeur qui exécute le struct.py empoisonné. Si votre garde-fou demande « qui a écrit ce code ? » au lieu de « d'où vient cette instruction ? », c'est déjà perdu.
Deuxième motif, plus banal et plus coûteux : la surface d'administration sans authentification. DB-GPT avec une fonction d'auth renvoyant toujours admin, Qwen-Agent avec Gradio ouvert, QWED avec inscription publique par défaut, ai-maestro à l'écoute sur le réseau. Aucun n'est sophistiqué : ce sont des défauts pensés pour la démo locale arrivés en production sans relecture. Le bon défaut pour une UI d'agent est loopback plus auth obligatoire.