如果在诸如 npm 之类的开源注册表上打击对合法软件的攻击和劫持还不够具有挑战性,那么应用程序制造商正越来越多地经历软件自我破坏的后果。开发人员可以随心所欲地改变主意,用他们的开源代码做任何他们想做的事情,大多数时候,无论如何都是“按原样”提供的,没有任何保证。或者,正如今年的增长趋势所看到的那样,开发人员故意破坏自己的软件库作为抗议的一种手段——将软件变成“抗议软件”。
7 月,广泛使用的atomicwrites Python 库 Markus Unterwaditzer 的开发人员暂时从流行的代码注册表 PyPI 中删除了他的代码,此前该网站表示将强制对“关键项目”的维护者进行双因素身份验证——这些项目属于顶级项目。注册表上所有下载的 1%。 Unterwaditzer 的atomicwrites项目符合标准,并且他的帐户需要注册双因素身份验证,他在一篇文章中将其描述为“为了保证少数公司的 SOC2 合规性(以牺牲我的空闲时间)”,这依赖于他的代码。
一些人将此与2016 年的左键盘事件进行了比较,该事件在项目开发人员删除他广泛使用的代码以示抗议后短暂地破坏了大部分互联网。开发人员 Azer Koçulu 与消息应用程序 Kik 发生了商标纠纷,因为他的 npm 包被称为“kik”。在 npm 在争议中站在 Kik 一边后,Koçulu 从 npm 注册表中撤回了他所有的代码——总共273 个模块,包括广受欢迎的左键盘库。这完全在他的能力范围内,但它立即产生了问题。当时,广受欢迎的left-pad包的 下载量已超过 1500 万次,即使在今天,该库仍继续每周下载数百万次。因此,在 2016 年 3 月,当他们的项目因无法找到其应用程序所依赖的左键盘组件而中断时,世界各地的开发人员都感到困惑和震惊。
几年前看似孤立的抗议活动在 2022 年被开发商破坏他们自己的图书馆复活——有时是为了反对大公司,但最近是为了抗议俄罗斯入侵乌克兰。
最近抗议软件的兴起
到 2022 年一周后,成千上万个依赖大量使用的 npm 项目颜色和伪造程序的应用程序崩溃了,并开始在用户的屏幕上打印乱码。劫持和更改这些合法库并不是恶意行为者。事实证明,这些项目的开发人员 Mark Squires 故意破坏了他自己的工作,以向大公司发出抗议信息。
Squires 的抗议是由Log4Shell 安全漏洞引发的,该漏洞使 Log4j 项目维护人员(主要是开源志愿者)在 12 月假期修补严重漏洞。 Squires 早些时候曾对财富 500 强公司在没有提供财务支持或赞助维护的情况下免费使用他的开源代码 表示失望。 Log4Shell 漏洞只会强化这种情绪——在其应用程序中普遍依赖 Log4j 的企业在支持在空闲时间维持这些关键项目的无偿志愿者方面做得还不够。
虽然 Squires 的抗议只是暂时冻结了依赖颜色库的项目,但几个月后,整个抗议软件的趋势随之而来,开发人员破坏了他们自己的项目,他们花了数百小时来反对俄罗斯在乌克兰的战争。
2022 年 3 月,在俄罗斯军队进入乌克兰领土几周后,流行的 npm 项目node-ipc (每周下载超过 100 万次)开始擦除疑似俄罗斯和白俄罗斯开发人员的机器。据称,该项目的开发者 Brandon Nozaki Miller 破坏了代码以破坏安装它的计算机。不用说, node-ipc的破坏版本(现在实际上是恶意软件)已从 npm 注册表中删除。
从那时起,抗议软件主题已经演变成开发商沉迷于更和平的抗议。较新版本的开源项目,如event-source- polyfill 、 es5-ext和styled-components只是显示一条消息,敦促俄罗斯用户采取行动反对战争。因此,这些版本保留在 npm 上,因为它们不违反注册表的政策。
对于开发者来说,发布抗议软件可能也不是一个容易的决定。它对被破坏项目的任何和所有版本进行了额外的审查,并且可能会损害社区对开发人员的信任。他们创作的任何软件,过去或未来,都可以再次被信任吗?
Evan Jacobs是styled-components的主要维护者之一,他告诉 TechCrunch,他的项目有激进主义的历史,“最值得注意的是我们对 [Black Lives Matter] 运动的支持,并建议我们的用户考虑向 Equal Justice Initiative 捐款。”他补充说:“我听说俄罗斯政府开始审查西方新闻网站,并意识到我们有一个独特的机会通过非典型渠道传递简洁、信息丰富的信息:我们的 npm 包安装。”
npm 上的 nestjs-pino 项目的屏幕截图,突出显示了乌克兰马里乌波尔防空洞中等待的儿童照片。图片来源: TechCrunch / 截图。
雅各布斯认为,让俄罗斯人在不受国家干预的情况下获得有关战争的准确消息至关重要。他修改了截至 4 月每月下载量超过 1500 万次的 styled-components ,向俄罗斯用户显示双语消息,总结“俄罗斯军队在乌克兰犯下的许多暴行”。
“有影响吗?我们可能永远不会知道,”雅各布斯说。 “话虽如此,我认为完全值得有机会传播信息并希望能引起俄罗斯软件人员的注意,否则他们可能看不到正在发生的事情。”
另一位开发人员 Mariusz Nowak 是es5-ext项目的创建者,他修改了该库的更高版本,以将俄罗斯和白俄罗斯的用户引导至准确的新闻来源,如 BBC 的 Tor 服务。诺瓦克告诉 TechCrunch 修改代码的决定,称这是因为俄罗斯人“不确定发生了什么,他们受到宣传媒体的影响”,指的是国家对俄罗斯媒体的严格控制。 “这条信息只有在你在俄罗斯安装软件时才会显示,它在世界其他地方并不真正可见,”诺瓦克说。
诺瓦克说,将他的开源库用于激进主义并没有影响他在更广泛的社区中的信誉,但一开始他确实收到了一些愤怒的回应。
雅各布斯和诺瓦克并不是唯一一个重组他们的开源代码来抗议战争的人。软件供应链安全初创公司 Socket告诉 TechCrunch,npm 项目Nestjs-pino是一个受欢迎的 npm 项目,每周下载量超过 100,000 次,它更新了其主要的“自述”文件,以吸引人们对乌克兰持续危机的关注。与软件包捆绑在一起的安装脚本也会在安装后立即打印出控制台消息。
“你不能相信你无法验证的东西”
开源开发人员正在发现新的和创造性的途径,这些途径不再限制他们为他们的项目实施新功能,而是通过修改他们的项目来积极表达他们对更大社会问题的看法。而且,与必须按照付费客户的期望运行的专有代码不同,大多数开源许可证都是相当宽松的——无论是对消费者还是开发者——为他们的代码提供的许可证并不保证开发者不应该做什么并且永远不会使用他们的代码,使抗议软件成为维护者的灰色地带。
事实上,作为 Sonatype 的一名安全研究员,我观察到抗议软件在早期阶段是如何对我们构成挑战的,以及我们如何调整我们的自动恶意软件检测算法,以便现在通过诸如colours和faker之类的项目来捕捉自我破坏。传统上,该系统旨在发现上传到开源存储库的仿冒恶意软件,但诸如恶意劫持或开发人员在没有警告的情况下修改自己的库等情况需要更深入地了解抗议软件的复杂性。
该主题还使主要的开源注册中心(如微软子公司 GitHub 拥有的 npm)在处理这些边缘情况时处于十字路口。
Socket 的创始人 Feross Aboukhadijeh 告诉 TechCrunch,像 GitHub 这样的注册机构处于困境。 “一方面,他们希望支持维护者的言论自由权以及使用他们的平台支持他们所信仰的事业的能力。但另一方面,GitHub 对 npm 用户有责任确保恶意代码不是从 npm 服务器提供的。这有时是一个困难的平衡行为,”Aboukhadijeh 说。
确保您在构建中仅获得经过审查的组件版本的一个简单解决方案是固定您的 npm 依赖版本。这样,即使项目的未来版本遭到破坏或劫持,您的构建仍将继续使用“固定”版本,而不是获取最新的、受污染的版本。但这可能并不总是对所有生态系统都是有效的策略,比如 PyPI,其中组件的现有版本可以重新发布——正如我们在ctx PyPI 项目被劫持的情况下看到的那样。
“围绕‘抗议软件’的对话实际上是关于软件供应链安全的对话。你不能相信你无法验证的东西,”专注于软件供应链安全的初创公司 Chainguard 的联合创始人兼首席执行官 Dan Lorenc 告诉 TechCrunch。
Lorenc 反对防止抗议软件的建议是遵循良好的开源安全卫生和最佳实践,这可以帮助开发人员更轻松、更早地开发抗议软件。 “了解和理解您的依赖关系,对您在环境中使用的开源代码进行定期扫描和审计是一个开始。”
但 Lorenc 警告说,关于抗议软件的辩论可能会招来模仿者,他们会加剧这个问题,并分散开源软件捍卫者的注意力,使其无法专注于解决真正重要的问题——阻止恶意行为者。对于抗议软件,仍然存在未知的未知数。对于抗议软件来说,什么问题太小或太大?
虽然实际上没有人可以规定开源开发人员可以用他们的代码做什么——这是开发人员一直拥有的一种力量,但现在才刚刚开始利用。
原文: https://techcrunch.com/2022/07/27/protestware-code-sabotage/