去年12月,Eclipse基金会宣布要给Open VSX加上预发布安检——所有VS Code插件必须先过扫描才能上架。三个月后,安全团队Koi Security发现这套系统有个荒诞的漏洞:当服务器压力变大时,安检会自动"下班"。
攻击者不需要黑进任何系统。注册一个免费发布者账号,批量上传恶意插件,就能把数据库连接池挤爆。这时候扫描任务排不进队列,系统却理解为"没配置扫描器",直接放行。
Koi Security研究员Oran Simhony把这个问题命名为"Open Sesame"(芝麻开门)。他在报告中解释:「管道只有一个布尔返回值,同时表示'没有配置扫描器'和'所有扫描器运行失败'。调用方无法区分。所以当扫描器在负载下失败时,Open VSX将其视为'无需扫描',直接放行扩展。」
更麻烦的是,负责重试失败扫描的恢复服务也有同样的毛病。这意味着某些条件下,插件可以跳过整个扫描流程。
一个布尔值的两副面孔
Open VSX的预发布扫描用Java编写,核心逻辑并不复杂:插件上传后,系统启动扫描任务,检查是否包含恶意代码。扫描通过则上架,失败则隔离待审。
问题出在状态返回的设计上。正常情况下,"无扫描器配置"和"扫描器全部崩溃"是两种完全不同的场景——前者是管理员的选择,后者是系统故障。但代码里用同一个布尔值`false`表示两者,调用方拿到`false`后,默认按"无事发生"处理。
这种设计在软件工程里有个专门的名字:fail-open(故障开放)。与安全领域推崇的fail-closed(故障关闭)相反,fail-open意味着出问题时系统倾向于继续运转,而不是停下来。
Simhony指出:「这是一种常见的反模式:fail-open错误处理隐藏在一个为合法'无事可做'场景设计的代码路径后面。」
打个比方:你家的智能门锁在断电时自动解锁——方便你逃生,也方便小偷。Open VSX的扫描系统就是这样一扇"压力越大越敞开"的门。
攻击成本:一个免费账号
Koi Security在2026年2月8日向Eclipse基金会披露了这个漏洞。测试显示,攻击者只需用免费注册的标准发布者账号,向发布端点 flooding 多个恶意.VSIX扩展,就能触发并发负载耗尽数据库连接池。
扫描任务因此无法入队,系统返回`false`,插件被标记为"通过",立即激活并可下载。
整个过程不需要提权、不需要社工、不需要利用其他漏洞。门槛低到让"预发布安检"这个设计目标显得有点讽刺。
Eclipse基金会在上个月发布的0.32.0版本中修复了该问题。考虑到Open VSX同时服务于Cursor、Windsurf等VS Code衍生编辑器的插件市场,这个补丁的覆盖范围相当广。
安检层的阿喀琉斯之踵
Open VSX推出预发布扫描的背景,是恶意插件日益猖獗。2024年,多个安全团队报告了伪装成流行工具的恶意扩展,有些在被下架前已经积累了数千次安装。
基金会试图在"上架前"而非"上架后"解决问题,思路是对的。但Koi Security的测试表明,单层防护的可靠性高度依赖实现细节——一个布尔值的歧义,就能让整套架构变成"压力测试下的自动放行闸机"。
Simhony的总结很克制:「预发布扫描是重要的一层,但它只是一层。管道的设计是合理的,但一个无法区分'无事可做'和'出了问题的'布尔值,把整个基础设施变成了压力下敞开的闸门。」
目前尚无证据表明该漏洞已被野外利用。但Koi Security建议,依赖Open VSX的组织应将多层检测结合起来——静态分析、行为监控、运行时沙箱,而不是把安全押在单一的上架前扫描上。
毕竟,再严密的安检门,如果会在拥挤时自动打开,那它和没有门也没太大区别。
你编辑器里装的插件,上次更新是什么时候?
热门跟贴