CVE-2026-40156
Full vulnerability record from the local CVENow database.
Description
PraisonAI is a multi-agent teams system. Prior to 4.5.128, PraisonAI automatically loads a file named tools.py from the current working directory to discover and register custom agent tools. This loading process uses importlib.util.spec_from_file_location and immediately executes module-level code via spec.loader.exec_module() without explicit user consent, validation, or sandboxing. The tools.py file is loaded implicitly, even when it is not referenced in configuration files or explicitly requested by the user. As a result, merely placing a file named tools.py in the working directory is sufficient to trigger code execution. This behavior violates the expected security boundary between user-controlled project files (e.g., YAML configurations) and executable code, as untrusted content in the working directory is treated as trusted and executed automatically. If an attacker can place a malicious tools.py file into a directory where a user or automated system (e.g., CI/CD pipeline) runs praisonai, arbitrary code execution occurs immediately upon startup, before any agent logic begins. This vulnerability is fixed in 4.5.128.
View original CVE JSON
{
"id": "CVE-2026-40156",
"sourceIdentifier": "[email protected]",
"published": "2026-04-10T17:17:13.297",
"lastModified": "2026-10-26T21:10:00.170",
"vulnStatus": "Analyzed",
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "PraisonAI is a multi-agent teams system. Prior to 4.5.128, PraisonAI automatically loads a file named tools.py from the current working directory to discover and register custom agent tools. This loading process uses importlib.util.spec_from_file_location and immediately executes module-level code via spec.loader.exec_module() without explicit user consent, validation, or sandboxing. The tools.py file is loaded implicitly, even when it is not referenced in configuration files or explicitly requested by the user. As a result, merely placing a file named tools.py in the working directory is sufficient to trigger code execution. This behavior violates the expected security boundary between user-controlled project files (e.g., YAML configurations) and executable code, as untrusted content in the working directory is treated as trusted and executed automatically. If an attacker can place a malicious tools.py file into a directory where a user or automated system (e.g., CI/CD pipeline) runs praisonai, arbitrary code execution occurs immediately upon startup, before any agent logic begins. This vulnerability is fixed in 4.5.128."
},
{
"lang": "es",
"value": "PraisonAI es un sistema de equipos multiagente. Previo a la versión 4.5.128, PraisonAI carga automáticamente un archivo llamado tools.py del directorio de trabajo actual para descubrir y registrar herramientas de agente personalizadas. Este proceso de carga utiliza importlib.util.spec_from_file_location y ejecuta inmediatamente código a nivel de módulo a través de spec.loader.exec_module() sin el consentimiento explícito del usuario, validación o sandboxing. El archivo tools.py se carga implícitamente, incluso cuando no se hace referencia a él en los archivos de configuración o no es solicitado explícitamente por el usuario. Como resultado, simplemente colocar un archivo llamado tools.py en el directorio de trabajo es suficiente para desencadenar la ejecución de código. Este comportamiento viola el límite de seguridad esperado entre los archivos de proyecto controlados por el usuario (por ejemplo, configuraciones YAML) y el código ejecutable, ya que el contenido no confiable en el directorio de trabajo se trata como confiable y se ejecuta automáticamente. Si un atacante puede colocar un archivo tools.py malicioso en un directorio donde un usuario o sistema automatizado (por ejemplo, una pipeline de CI/CD) ejecuta praisonai, la ejecución de código arbitrario ocurre inmediatamente al inicio, antes de que comience cualquier lógica de agente. Esta vulnerabilidad se corrige en la versión 4.5.128."
}
],
"affected": [
{
"source": "[email protected]",
"affectedData": [
{
"vendor": "MervinPraison",
"product": "PraisonAI",
"versions": [
{
"version": "< 4.5.128",
"status": "affected"
}
]
}
]
}
],
"metrics": {
"cvssMetricV31": [
{
"source": "[email protected]",
"type": "Secondary",
"cvssData": {
"version": "3.1",
"vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H",
"baseScore": 7.8,
"baseSeverity": "HIGH",
"attackVector": "LOCAL",
"attackComplexity": "LOW",
"privilegesRequired": "NONE",
"userInteraction": "REQUIRED",
"scope": "UNCHANGED",
"confidentialityImpact": "HIGH",
"integrityImpact": "HIGH",
"availabilityImpact": "HIGH"
},
"exploitabilityScore": 1.8,
"impactScore": 5.9
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"timestamp": "2026-04-13T15:29:56.528951Z",
"id": "CVE-2026-40156",
"options": [
{
"exploitation": "poc"
},
{
"automatable": "no"
},
{
"technicalImpact": "total"
}
],
"role": "CISA Coordinator",
"version": "2.0.3"
}
}
]
},
"weaknesses": [
{
"source": "[email protected]",
"type": "Secondary",
"description": [
{
"lang": "en",
"value": "CWE-94"
},
{
"lang": "en",
"value": "CWE-426"
},
{
"lang": "en",
"value": "CWE-829"
}
]
}
],
"configurations": [
{
"nodes": [
{
"operator": "OR",
"negate": false,
"cpeMatch": [
{
"vulnerable": true,
"criteria": "cpe:2.3:a:praison:praisonai:*:*:*:*:*:*:*:*",
"versionEndExcluding": "4.5.128",
"matchCriteriaId": "56CDE5F5-B03C-4C3A-9A92-F61C9DFDA9B1"
}
]
}
]
}
],
"references": [
{
"url": "https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-2g3w-cpc4-chr4",
"source": "[email protected]",
"tags": [
"Vendor Advisory"
]
},
{
"url": "https://github.com/MervinPraison/PraisonAI/security/advisories/GHSA-2g3w-cpc4-chr4",
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"tags": [
"Vendor Advisory"
]
}
]
}