Mercury 框架未授权远程代码执行漏洞 (RCE) 深度剖析
字数 1657
更新时间 2026-10-25 20:25:08
Mercury 框架未授权远程代码执行漏洞 (RCE) 深度剖析
一句话结论:Mercury 默认配置启动时若未强制配置鉴权 Token,其内核管理接口完全无身份验证,远程未授权攻击者可匿名创建 Jupyter 内核并经 WebSocket 让内核执行任意代码,服务器直接失陷(CVE-2026-111058,影响 3.2.4 及以下);防御核心是强制 Token、禁止公网直曝、升级版本,并用「匿名可访问面板」作为排查判据。
排版说明:本文基于先知社区复现报告整理,已移除可照抄的利用实现(PoC 脚本、消息构造代码、一键自动化利用流程),仅保留漏洞成因、暴露面特征、影响分析与检测加固建议,并保留原文免责声明立场:仅供安全研究与防御。
漏洞概况
- 编号 CVE-2026-111058,影响 Mercury 3.2.4 及以下版本。
- Mercury 是基于 Python 的框架,用于把 Jupyter Notebook 快速转换为交互式 Web 应用,常被数据团队直接默认启动对外提供演示服务,这正是风险集中场景。
- 成因一句话:内核管理接口缺少访问控制——默认启动且未配置鉴权 Token 时,该接口没有任何身份验证机制,属于典型的「默认不安全的部署面」而非代码层内存缺陷。
成因链解析
- 设计前提错位:框架把「使用者即所有者」当作默认假设,本地 notebook 场景下内核管理接口无需鉴权;一旦被当作 Web 服务部署,这个假设立即失效。
- 缺失的校验:内核管理接口对创建请求不做任何凭证校验,匿名请求即可让服务端拉起一个新的 Jupyter 内核并返回内核标识。
- 协议放大:Jupyter 协议中内核与前端通过 WebSocket 通道通信,消息类型里包含「执行代码」语义;拿到内核标识即等价于拿到该内核的代码执行通道,任意 Python 代码进而可调用系统命令。
- 叠加因素:默认启动时终端会提示内核通信走未加密 TCP,说明这类部署从协议层就未考虑不可信网络,通信可被嗅探劫持——加密缺失与鉴权缺失是同一套默认配置的两面。
本质是 CWE-306(缺少关键功能的身份验证):不是某个参数被绕过,而是整条功能链从入口起就没有设计校验。
影响面
- 未授权远程代码执行,以 Web 服务运行用户身份执行任意系统命令。
- 复现报告演示了从执行身份查询到读取系统敏感文件的完整效果,证明一旦暴露即等价于服务器完全失陷,并可成为横向移动的跳板。
检测与自查(防御视角)
- 暴露面排查:用无凭证的浏览器直接访问服务端口——若未登录即可进入应用面板,即处于本漏洞的受影响状态;这个「匿名可达」判据同样适用于同类框架(Jupyter、Papermill、各类 notebook 转 Web 工具)。
- 接口审计:内核管理类 API 的匿名 POST 创建请求应出现在访问日志中,可直接作为告警规则;健康部署下该类请求应全部被 401/403 拒绝。
- 进程特征:服务进程派生意外的 Python 子内核进程、命令行执行痕迹,是代码执行成功的高置信度信号。
- 配置核查:检查启动参数是否强制携带 Token;检查是否配置了反向代理与来源 IP 限制;留意启动日志中的未加密通信警告。
加固建议
- 强制鉴权:生产部署必须显式启用 Token 鉴权,拒绝任何未授权 API 访问,不把默认配置直接搬上生产。
- 网络隔离:禁止将服务端口直接暴露公网,经防火墙或 Nginx 反向代理限制来源,并在全链路启用 TLS,消除未加密内核通信。
- 版本升级:升级至修复该缺陷的最新安全版本;对暂无法升级的实例,以上两层控制作为补偿。
- 部署习惯:把「默认启动即安全」从团队评审清单里剔除——凡源自本地交互场景的框架,对外部署时鉴权、加密、来源限制三项必须逐项确认。
参考对象
- Mercury 官方版本公告与 CVE-2026-111058 描述
- 先知社区原始复现报告(news/93020)
- Jupyter 内核通信协议文档(服务端鉴权与 TLS 配置章节)
相似文章
相似文章