Marimo <= 0.20.4 受 /terminal/ws WebSocket 端点中一个预认证 RCE 漏洞的影响。
该端点会检查应用模式和终端支持情况,但在接受 WebSocket 连接之前不会验证身份认证。随后它会创建一个 PTY shell,允许未认证的攻击者以 Marimo 进程的权限执行命令。
与其他调用 validate_auth() 的 WebSocket 端点不同,易受攻击的终端端点直接接受连接:
if app_state.mode != SessionMode.EDIT:
await websocket.close(...)
return
if not supports_terminal():
await websocket.close(...)
return
await websocket.accept()
child_pid, fd = pty.fork()
缺少身份认证检查导致未认证用户可以访问 PTY。
<= 0.20.4附带的 CVE-2026-39987.py 客户端连接到:
/terminal/ws
交互模式:
python3 CVE-2026-39987.py -i
单条命令:
python3 CVE-2026-39987.py "id"
通过替换脚本中的 DEFAULT_HOST 来配置目标。
成功利用可提供未认证的 PTY shell,并能够以 Marimo 服务器用户的身份执行任意命令。