还记得去年年底令全球多数 Java 工程师深夜加班的 Apache Log4j 2 漏洞吗?彼时,发现最初只有 3 个人赞助该开源项目的事实令许多人受到冲击,甚至有人因此感慨道“这就是开源丑陋的一面”:当项目顺利进行时,一切都很好;而一旦项目出问题了,每个人都只会去抱怨项目背后的无偿维护者。
Apache Log4j 2 漏洞发生至今已一月有余,目前尚未彻底平息。不曾想,上周又发生了一起令许多开发者“头秃”的开源事件:无数使用了流行开源 NPM 库 faker.js 和 colors.js 的项目一夜之间突然“变砖”,不断输出满屏乱码,而“罪魁祸首”竟是项目作者 Marak Squires 故意为之。
一、程序出故障?项目作者故意“捣乱”
对许多 JavaScript 和 Node.js 开发者而言,faker.js 和 colors.js 这两个库应该并不陌生:
- faker.js 用于在浏览器和 Node.js 中生成大量虚假数据,在 NPM 上每周下载量近 244 万。
- colors.js,一个实现对颜色进行各种操作和计算的 JavaScript 库,每周下载量约 2314 万。
从每周下载数据可以看出,faker.js 和 colors.js 的应用十分广泛,如 AWS CDK 等许多流行工具均在开发过程中使用了这两个库,一直以来也没有意外发生。因此,上周末有 AWS CDK 用户看到其应用在控制台上不断打印乱码时感到无比震惊:“究竟发生了什么?”
据该用户分享的截图显示,这些乱码包括文本“LIBERTY LIBERTY LIBERTY”以及一系列非 ASCII 字符:
该用户认为这是“由于 faker.js 导致的奇怪输出”,事实证明,Ta 的猜想没错。据 faker.js 的 GitHub 页面显示,该库代码已被全部删除,所有 commit 信息都被改为「endgame」,且 Readme 部分也仅剩下项目作者 Marak Squires 留下的一句话:“What really happened with Aaron Swartz(Aaron Swartz 到底发生了什么)”
(注:Aaron Swartz 是一名出色的开发人员,曾建立 Creative Commons、RSS 和著名社交网站 Reddit,但在 2011 年被指控非法入侵 MIT 和学术数据库 JSTOR 以窃取文件,后于 2013 年自杀。)
不仅如此,有心人应该已经发现了上文 faker.js 下载量图中奇怪的最新版本号“6.6.6”——要知道,与国内普遍的认知不同,圣经中用三个“6”连写表示恶魔的符号,代表以撒单为首的邪恶势力,因此西方国家常将三个“666”视作魔鬼、撒旦等不吉利的象征。
类似事情也发生在了 colors.js 库:Marak Squires 在 v1.4.44-liberty-2 版本中为 colors.js 库添加了一个“new American flag module”并将其发布至 GitHub 和 NPM,而代码中其中引入了一段无限循环,让所有使用了 colors.js 的程序都会在控制台无休止地打印各种非 ASCII 字符的乱码。
事后,Marak Squires 还刻意嘲讽道:“我们注意到,在 v1.4.44-liberty-2 版本的 colors.js 中有一个 Zalgo 漏洞,请相信我们正在努力解决这个问题,很快就会有一个解决方案。”
(注:Zalgo 文本原指用 Unicode 组合字符在字母上过度添加各种符号生成的一种数字文本,常用于恐怖场景以令人毛骨悚然,在此处指代那些非 ASCII 字符的乱码。)
二、挟“开源项目”以令“诸多企业”?一切似乎因“钱”而起
Marak Squires 这番操作打破了许多原以为 NPM 库被破坏的猜想,但转而却令更多人百思不得其解:好好的两个开源项目,为什么Marak Squires 突然要自己搞破坏?
问题似乎始于 2020 年 9 月 Marak Squires 遭遇的一场火灾。当时,Marak Squires 租借的房子突发大火,所有财产几乎被全部烧毁,无奈之下 Marak Squires 在推特上发布求助:
“我在一场公寓火灾中失去了所有东西,几乎无家可归,也无法访问我的大部分帐户,所有的贵金属都不见了。如果有人能给 paypal@marak.com 一点钱,那将帮助我免于在街上冻僵,哈哈。”
在这之后,或许是求助金额尚不足以支持 Marak Squires 的生活,近十天后,他又在 GitHub 上谴责大型公司使用其开源项目却不回馈的行为:
“恕我直言,我不会再用我的免费工作来支持财富 500 强企业了(以及其他较小规模的公司)。
没什么好说的。趁这个机会,你可以给我发一份年薪六位数的合同,或者分叉项目,让别人来做。”
而从这两件事中,我们似乎可以窥见此次 Marak Squires 毫无征兆“自毁”项目的原因:挟“开源项目”以令“诸多企业”,一切似乎又是因“钱”而起。
好在据 The Verge 报道,目前 colors.js 已更新至正常版本,虽然 faker.js 仍未修复,但可降级至之前的 5.5.3 版本来解决问题。而 GitHub 方面似乎也因此暂停了 Marak Squires 的 GitHub 账户:
三、开源开发者该如何自处?
毫无疑问,这起事件再次引起了人们对于开源开发者生存现状的关注,这或许也是 Marak Squires 此次的行动目标:现实中,大量网站、软件和应用均依赖免费的开源项目来创建基本工具和组件,但就如同 Apache Log4j 2 一样,这些开源项目背后维护者的财政困境鲜为人知。
针对此次事件,诸多资深开发者也表达出了各自的看法。
-
资讯安全专家 VessOnSecurity 认为:“这太不负责任了!如果你在发布免费代码时遇到问题,那就不要发布。你破坏自己被广泛使用的项目,不仅伤害了大企业,也伤害了所有使用它的人。这会导致人们害怕更新,因为新版本可能并不安全。”
-
软件工程师 Sergio Gómez 则认为:“从 GitHub 删除他自己的代码居然违反了他们的服务条款?这是道德绑架!我想我们需要开始分散托管免费软件源代码了。”
许多网友也对此各执一词。
-
@ Mike_Walsh:“老实说,这人完全有权破坏自己的工作,尤其是当他利用自己的空闲时间维护这些项目,却没有看到一分红时。为什么大公司就应该从别人的无偿劳动中赚到一大笔钱,甚至这样他们还声称这样做是‘出于对它的热爱’?所以我觉得这样很公平,你对我好我会回报你,但如果你在背后捅了我一刀,也同理。”
-
@GT500:“就我的理解来看,我认为这个人忘记了开源的精神,只是贪婪罢了。如果他想要别人为他的软件付费,那他就不应该在开源许可下发布它。开源的倡导者花了几十年的时间试图让公司使用开源软件,试图说服他们这是免费的、应该使用它,且永远不必为此付费。而这个人的行为会导致什么?我们可能会回到公司只使用垃圾付费软件的黑暗时光,因为他们会觉得已经不能再信任开源项目了。”
从开源中来,到开源中去。可能对很多开源开发者而言,最终目标并不是金钱,更多是希望人们共同参与项目维护,以此回馈社区。那么在你看来,你认为这一矛盾该如何缓解,开源开发者又该如何自处呢?
参考链接:
-
https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/
-
https://www.theverge.com/2022/1/9/22874949/developer-corrupts-open-source-libraries-projects-affected
-
https://web.archive.org/web/20220105101202/https://twitter.com/marak/status/1320465599319990272