![]()
一个GitHub斩获2万星的开源项目,从"漏洞公开"到"全球大规模利用"只用了不到半天。这不是演习,是云安全公司Sysdig本周监测到的真实攻击时间线。
Marimo,这个被数据科学家和AI从业者广泛使用的Python笔记本环境,在4月8日披露了一个关键漏洞。10小时后,第一批攻击流量已经涌入。12小时内,125个IP地址完成侦察。攻击者用一套精心设计的脚本,在三分钟内完成从入侵到窃取云凭证的全流程。
漏洞机制:一个WebSocket端口的"裸奔"
问题出在Marimo的/terminal/ws端点。这个WebSocket接口本应提供交互式终端功能,却没有设置任何身份验证门槛。任何能连上网络的客户端,都能直接获得一个与Marimo进程同权限的完整shell。
GitHub给这个漏洞打了9.3分(满分10分),编号CVE-2026-39987。影响范围锁定在0.20.4及更早版本。Marimo团队在披露当天就发布了0.23.0修复版,但补丁速度永远追不上武器化速度——这是安全行业的铁律。
攻击面集中在两类部署场景:一是将Marimo作为可编辑笔记本运行,二是使用--host 0.0.0.0参数在共享网络中暴露编辑模式。后者是数据团队协作的常见配置,却恰好把钥匙插在锁孔上。
攻击还原:三分钟的"外科手术"
Sysdig的研究人员完整记录了一次攻击会话。攻击者没有使用自动化蠕虫,而是像外科医生一样精准操作。
第一阶段,验证。连接/terminal/ws,执行一段短脚本确认远程代码执行能力,全程数秒,随即断开。这种"触碰即走"的模式,是为了避免触发监控告警。
第二阶段,侦察。重新连接后,手动输入pwd、whoami、ls等基础命令,快速定位环境。接着遍历目录,专门搜寻SSH相关路径。
第三阶段,收割。攻击者直奔.env文件,提取全部环境变量——云凭证、应用密钥、数据库连接串,一锅端。随后继续翻找工作目录的敏感文件,扫描SSH私钥。从连接到撤离,用时2分47秒。
约一小时后,同一攻击者返回,用完全相同的利用序列发起第二轮会话。Sysdig将其定性为"有条理的操作者"(methodical operator),而非脚本小子。这种人工介入、目标明确的风格,指向有组织的凭证窃取行动,而非 opportunistic 的随机扫描。
为什么是这个项目?
Marimo的定位让它成为高价值目标。作为"响应式Python笔记本",它主打一个特性:代码修改后输出自动更新,无需手动重跑。这对迭代频繁的机器学习实验、数据可视化开发极具吸引力。
![]()
2万GitHub星、1000次fork,意味着相当规模的活跃用户群。更关键的是用户画像:数据科学家、ML工程师、研究员——这群人往往在本地或云服务器上处理敏感数据集,.env文件里躺着AWS密钥、OpenAI API令牌、数据库密码是常态。
一个讽刺的对比:Jupyter Notebook用了十几年才逐步补上安全短板,Marimo作为"现代化替代方案",却在架构层面复刻了类似陷阱。交互式终端的便利性与网络边界的开放性,组合成完美的攻击向量。
10小时窗口:披露即武器化的时代
传统安全叙事里,"漏洞窗口期"通常以天或周计算。Marimo案例把这个单位压缩到了小时。
Sysdig的监测数据显示:披露后10小时内首次利用,12小时内125个IP开始侦察。攻击者不需要等待PoC(概念验证代码)公开——他们直接从厂商的安全公告中提取技术细节,自行编写利用工具。
这揭示了一个被低估的趋势:安全公告本身已成为攻击情报源。写得越详细,武器化越快。厂商在"透明披露"与"给攻击者送弹药"之间走钢丝,而用户往往还没读完公告,扫描流量已经上门。
Marimo的修复版本0.23.0在披露当日发布,但版本号跳跃(从0.20.4直接到0.23.0)暗示了内部可能还有未公开的重构。对于依赖pip install管理环境的Python开发者,升级从来不是"一键解决"——依赖冲突、环境重建、回归测试,每一步都是摩擦。
攻击者赌的就是这个摩擦。
「我们看到的是人工操作而非自动化脚本,」Sysdig研究团队在报告中写道,「攻击者专注于高价值目标:.env凭证和SSH密钥。」这种选择性暴露了一个残酷现实:你的基础设施可能已经被扫描过多次,只是不够"肥"才暂时幸免。
Marimo的终端功能设计本意是提升开发效率,让远程调试像本地一样流畅。但当--host 0.0.0.0把监听端口绑到所有网络接口时,便利变成了敞开的后门。很多用户甚至不知道自己在运行一个网络服务——他们只是在"启动笔记本"。
云凭证的窃取速度尤其值得警惕。三分钟完成收割,意味着攻击者对环境结构有预判,.env文件的位置、常见云服务商的密钥格式、SSH私钥的默认路径,都是肌肉记忆。这不是针对Marimo的首次研究,而是通用云渗透 playbook 的标准章节。
对于已经部署Marimo的团队,检查清单很简短:版本号是否≥0.23.0?是否使用了--host 0.0.0.0?.env文件是否意外提交或暴露在可访问路径?SSH密钥是否使用了passphrase保护?
但真正的难题是下一个Marimo。开源生态的星标数与代码审计深度从未成正比,而"快速启动"的文档示例往往默认绑定0.0.0.0——因为"localhost-only"会让新手教程多写三行解释,降低转化率。
安全与易用的 trade-off,最终由谁来买单?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.