波兰安全研究员Arusekk于9月23日发布长文披露SourceHut构建平台builds.sr.ht存在的蠕虫型存储型XSS漏洞,编号CVE-2026-92973。攻击者只需让一段特定OSC 8 ANSI转义序列出现在任意用户的构建日志里,就可以窃取管理员的CSRF令牌并以受害者身份提交任务、读写部署密钥,波及官方旗舰实例及所有自托管实例。
漏洞根因在pycontribs组织下的ansi2html.py。该库在解析ANSI超链接协议OSC 8时,会把控制序列转成HTML a标签,但解析逻辑并不严格限制属性边界。Arusekk的PoC用一段在URL字段里拼接多余斜杠与属性名的OSC 8序列触发属性注入,渲染出的a标签会带上autofocus、tabindex等事件处理器,触发一个弹窗只是演示,真实载荷可以从攻击者站点动态拉取并执行。任何一个开启JS的访客打开这条构建日志都会立刻中招。
最致命的是这条路径几乎零门槛。攻击者甚至不需要SourceHut账号,只要向开启了CI的公共邮件列表发一封补丁邮件,或者让任何被打印到日志的远端资源包含恶意序列,都能让官方旗舰实例builds.sr.ht上的任意构建任务日志变成攻击载荷。日志页本身就包含CSRF令牌,攻击者再借此提交伪造的清单任务或触发Resubmit build按钮,就能在管理员查看日志的瞬间接管其账号。
从时间线看,这条链路从源头说起其实已潜伏多年。2019年ansi2html被引入builds.sr.ht,2021年9月漏洞形态在上游引入,2022年2月Alpine、7月Arch先后打包受影响版本。Arusekk在2026年7月接触源码、8月1日向SourceHut安全列表与上游同时提交报告,官方于8月4日完成builds.sr.ht侧的输出自动净化作为快速缓解,随后与上游维护者Sorin Sbarnea与Sebastian Pipping协作发布ansi2html 1.9.4等多个PyPI版本。
CVSS评分与防御建议
Arusekk给出的CVSS 4.0向量把机密性与完整性都判为高,且明确标AU自动化为是、恢复性为不可恢复、价值密度为集中,理由是builds.sr.ht单实例托管了大量高价值项目的部署密钥。他同时批评现有CVSS打分对库与普遍生态都太粗糙,认为Web服务的XSS对浏览器和自身服务形成的链式影响,应该用两套打分而不是单一一套。
防御层面,Arusekk建议SourceHut收紧内容安全策略、移除unsafe-inline,在proxy层加CSP头即可立竿见影;更长远则需要把ansi2html重构为有状态转换器,从结构上杜绝属性注入。本次披露还顺带给了IOC:管理员可以grep原始构建日志里的ESC-]8;;https://example.com/"/或ESC-]8;;javascript:序列,确认是否有过异常访问。
终端转义序列本身就是一个屡教不改的老问题。HN评论区里多位开发者指出,OSC 8协议被重新启用用于终端超链接之后,已先后引发多起终端模拟器漏洞,其中一条序列甚至能让模拟器不加任何提示就直接启动浏览器打开指定网址。有开发者表示自己写ansi2html变体时会剥离全部C0、C1控制字符与APC、DCS、OSC、PM序列。行业共识是构建日志几乎不可能在不破坏可用格式的前提下完整净化,只能默认其为不可信输入,这也是Arusekk反复强调纵深防御而非单点修补的原因。