Vulnerability Details CVE-2026-39888
PraisonAI is a multi-agent teams system. Prior to 1.5.115, execute_code() in praisonaiagents.tools.python_tools defaults to sandbox_mode="sandbox", which runs user code in a subprocess wrapped with a restricted __builtins__ dict and an AST-based blocklist. The AST blocklist embedded inside the subprocess wrapper (blocked_attrs of python_tools.py) contains only 11 attribute names — a strict subset of the 30+ names blocked in the direct-execution path. The four attributes that form a frame-traversal chain out of the sandbox are all absent from the subprocess list (__traceback__, tb_frame, f_back, and f_builtins). Chaining these attributes through a caught exception exposes the real Python builtins dict of the subprocess wrapper frame, from which exec can be retrieved and called under a non-blocked variable name — bypassing every remaining security layer. This vulnerability is fixed in 1.5.115.
Exploit prediction scoring system (EPSS) score
EPSS Score 0.001
EPSS Ranking 26.2%
CVSS Severity
CVSS v3 Score 9.9
Products affected by CVE-2026-39888
-
cpe:2.3:a:praison:praisonai:0.0.1
-
cpe:2.3:a:praison:praisonai:0.0.18
-
cpe:2.3:a:praison:praisonai:0.0.2
-
cpe:2.3:a:praison:praisonai:0.0.20
-
cpe:2.3:a:praison:praisonai:0.0.21
-
cpe:2.3:a:praison:praisonai:0.0.22
-
cpe:2.3:a:praison:praisonai:0.0.23
-
cpe:2.3:a:praison:praisonai:0.0.24
-
cpe:2.3:a:praison:praisonai:0.0.25
-
cpe:2.3:a:praison:praisonai:0.0.26
-
cpe:2.3:a:praison:praisonai:0.0.27
-
cpe:2.3:a:praison:praisonai:0.0.28
-
cpe:2.3:a:praison:praisonai:0.0.29
-
cpe:2.3:a:praison:praisonai:0.0.30
-
cpe:2.3:a:praison:praisonai:0.0.31
-
cpe:2.3:a:praison:praisonai:0.0.32
-
cpe:2.3:a:praison:praisonai:0.0.33
-
cpe:2.3:a:praison:praisonai:0.0.34
-
cpe:2.3:a:praison:praisonai:0.0.35
-
cpe:2.3:a:praison:praisonai:0.0.36
-
cpe:2.3:a:praison:praisonai:0.0.37
-
cpe:2.3:a:praison:praisonai:0.0.38
-
cpe:2.3:a:praison:praisonai:0.0.39
-
cpe:2.3:a:praison:praisonai:0.0.40
-
cpe:2.3:a:praison:praisonai:0.0.41
-
cpe:2.3:a:praison:praisonai:0.0.42
-
cpe:2.3:a:praison:praisonai:0.0.43
-
cpe:2.3:a:praison:praisonai:0.0.44
-
cpe:2.3:a:praison:praisonai:0.0.45
-
cpe:2.3:a:praison:praisonai:0.0.46
-
cpe:2.3:a:praison:praisonai:0.0.47
-
cpe:2.3:a:praison:praisonai:0.0.48
-
cpe:2.3:a:praison:praisonai:0.0.49
-
cpe:2.3:a:praison:praisonai:0.0.50
-
cpe:2.3:a:praison:praisonai:0.0.51
-
cpe:2.3:a:praison:praisonai:0.0.52
-
cpe:2.3:a:praison:praisonai:0.0.53
-
cpe:2.3:a:praison:praisonai:0.0.54
-
cpe:2.3:a:praison:praisonai:0.0.55
-
cpe:2.3:a:praison:praisonai:0.0.56
-
cpe:2.3:a:praison:praisonai:0.0.57
-
cpe:2.3:a:praison:praisonai:0.0.58
-
cpe:2.3:a:praison:praisonai:0.0.59
-
cpe:2.3:a:praison:praisonai:0.0.61
-
cpe:2.3:a:praison:praisonai:0.0.62
-
cpe:2.3:a:praison:praisonai:0.0.63
-
cpe:2.3:a:praison:praisonai:0.0.64
-
cpe:2.3:a:praison:praisonai:0.0.65
-
cpe:2.3:a:praison:praisonai:0.0.66
-
cpe:2.3:a:praison:praisonai:0.0.67
-
cpe:2.3:a:praison:praisonai:0.0.68
-
cpe:2.3:a:praison:praisonai:0.0.69
-
cpe:2.3:a:praison:praisonai:0.0.70
-
cpe:2.3:a:praison:praisonai:0.0.71
-
cpe:2.3:a:praison:praisonai:0.0.72
-
cpe:2.3:a:praison:praisonai:0.0.73
-
cpe:2.3:a:praison:praisonai:0.0.74
-
cpe:2.3:a:praison:praisonai:0.1.0
-
cpe:2.3:a:praison:praisonai:0.1.1
-
cpe:2.3:a:praison:praisonai:0.1.10
-
cpe:2.3:a:praison:praisonai:0.1.2
-
cpe:2.3:a:praison:praisonai:0.1.3
-
cpe:2.3:a:praison:praisonai:0.1.4
-
cpe:2.3:a:praison:praisonai:0.1.5
-
cpe:2.3:a:praison:praisonai:0.1.6
-
cpe:2.3:a:praison:praisonai:0.1.7
-
cpe:2.3:a:praison:praisonai:0.1.8
-
cpe:2.3:a:praison:praisonai:0.1.9
-
cpe:2.3:a:praison:praisonai:0.2.0
-
cpe:2.3:a:praison:praisonai:1.0.0
-
cpe:2.3:a:praison:praisonai:1.0.1
-
cpe:2.3:a:praison:praisonai:1.0.10
-
cpe:2.3:a:praison:praisonai:1.0.11
-
cpe:2.3:a:praison:praisonai:1.0.2
-
cpe:2.3:a:praison:praisonai:1.0.3
-
cpe:2.3:a:praison:praisonai:1.0.4
-
cpe:2.3:a:praison:praisonai:1.0.5
-
cpe:2.3:a:praison:praisonai:1.0.6
-
cpe:2.3:a:praison:praisonai:1.0.8
-
cpe:2.3:a:praison:praisonai:1.0.9
-
cpe:2.3:a:praison:praisonai:1.5.112