Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >下载量和Vue一样大的开源软件被作者恶意破坏,数千款应用受到牵连

下载量和Vue一样大的开源软件被作者恶意破坏,数千款应用受到牵连

作者头像
深度学习与Python
发布于 2022-03-01 03:50:20
发布于 2022-03-01 03:50:20
5170
举报

编译 | 核子可乐、Tina

开源的黑暗面:faker.js 到底发生了什么?

流行开源包“colors”与“faker”的用户们最近刚刚遭遇一场意外,毫无征兆的破坏导致应用程序在使用这些包后开始输出无法理解的乱码数据。这背后的原因竟然是开源软件包的作者 Marak Squires 故意引入了一个无限循环,让数千个依赖于“colors”与“faker”包的应用程序全面失控。

colors.js 是一个用于处理颜色的 JavaScript 库,而 faker.js 是一个用于生成假数据的 JavaScript 库。在构建和测试应用程序时,假数据很有用,faker.js 可以为各个领域生成虚假数据,包括地址、商业、公司、日期、财务、图像或名称。

这两个包特别受开发者欢迎,其中单是 colors 包在 npm 上就拥有每周 2000 多万次下载量,依赖于它的项目近 19000 个。此外,faker 在 npm 上每周下载量也超过 280 万次,相关项目超 2500 个,faker 的受欢迎程度可媲美于 Vue。因为这些开源软件的应用特别广泛,所以这个事件影响也特别深远。

开源革命,还是开源暴动?

这两套高人气开源 npm 包“colors”(在 GitHub 上名为 colors.js)与“faker”(在 GitHub 上名为 faker.js)背后的开发人员故意在代码中引入了错误内容,相应提交进一步对依赖这些包的成千上万应用程序造成影响。

就在昨天,Amazon 云开发工具包(aws-cdk)等开源项目用户,突然发现自己的应用程序开始在控制台上疯狂输出乱码消息。

这些消息中包含大量“LIBERTY LIBERTY LIBERTY”(自由)字样,之后还跑着一大堆非 ASCII 字符:

面对“faker”与“colors”项目倾泻出的垃圾数据,用户感到震惊错愕 (GitHub)

最初,用户怀疑这些项目使用的“colors”与“faker”包遭到了恶意入侵,类似于去年 coa、rc 和 ua-parser-js 等包被攻击者劫持的状况。但事实证明,令 colors 与 faker 陷入混乱的其实是由合法开发者故意提交的错误代码。

开发者 Marak Squires 向 colors.js 包的 v1.4.44-liberty-2 版本中添加了“新的美国国旗模块”,此项变更随后被推送至 GitHub 与 npm。

colors.js 恶作剧提交出自“Marak”之手 (GitHub)

新代码中引入的无限循环会没完没了地运行,任何使用“colors”的应用程序都会在控制台上无休止地输出由非 ASCII 字符序列组成的乱码。

同样的,faker 的恶作剧版本“6.6.6”也被发布到了 GitHub 和 npm 之上。这位开发者还语带嘲讽地表示,“我们注意到 v1.4.44-liberty-2 版本的 colors 中存在一项 Zalgo bug。”“我们正在努力解决这个问题,请大家静待解决方案的发布。”所谓 Zalgo 文本,指的就是因某些故障引发的非 ASCII 字符。

这位开发者的举动似乎是在故意报复,希望反抗那些长期依赖于免费和社区支持软件、但却从不向社区做出回馈的大型企业和其他利用开源项目进行商业化盈利的用户。

2020 年 11 月,Marak 就已经警告称不会再“无偿工作”来支持那些商业巨头,并强调这些业务实体面前只有两条路:要么选择项目分叉,要么以每年“六位数”的薪酬补偿开源开发人员。

这位开发者之前曾写道,“诸位,我不会再用自己的无偿工作来支持那些财富五百强(以及其他小型公司)了。言尽于此。”“所以现在只有两个选择,要么给我发一份年薪六位数的用工合同,要么赶紧分叉项目、找其他人接手。”

有趣的是,我们发现“faker”项目在 GitHub repo 上的 README 页面(https://github.com/marak/Faker.js/)也被 Marak 改掉了,里面赫然出现了“Aaron Swartz 到底经历了什么?”的字样。

Swartz 是一位杰出的开发人员,他帮助建立了 Creative Commons、RSS 和 Reddit。他的贡献对几乎所有的 Web 开发人员都产生了深远的影响。2013 年,年仅 26 岁的 Swartz 在一场法律纠纷中自杀身亡。

为了让所有人都能免费访问信息,这位黑客主义者从麻省理工学院的校园网络 JSTOR 数据库中下载到数百万篇期刊文章。据称,他采用的方法是反复轮换自己的 IP 与 MAC 地址以绕过校方和 JSTOR 设置的技术屏蔽方案。但此番举动也导致 Swartz 面对违反《计算机欺诈与滥用法》的指控,一旦罪名成立,他最高可能被判处 35 年监禁。

事件引发轩然大波

Marak 的大胆举动旋即引发轩然大波,各界纷纷就此事发声。

部分开源软件社区成员赞扬了这位开发者的勇敢行为,但也有人对他的过激举动表示震惊。一位用户在推文中写道,“很明显,colors.js 的作者因为拿不到报酬而抓狂……所以他决定每当有用户加载他的包时都输出一面美国国旗……这是什么脑回路?”

也有人觉得这是“又一个开源开发者造成的流氓案件”,信息安全厂商 VessOnSecurity 则公开指责此举“不负责任”,并强调:“如果你不想有人用免费代码组织商业业务,那别发布这类代码不就好了?这种无差别打击的行为伤害到的不止是大企业,更是每一位使用开源代码的用户。此类行径只会打击用户的版本更新热情,让他们在每次升级时都提心吊胆。”

根据相关报道,GitHub 已经冻结了这位开发者的账户,而群众们对此也是议论纷纷:

NPM 已经将 faker.js 包回滚至先前版本,GitHub 则暂停了我对所有公共及私有项目的访问权限。那可是上百个项目,现在都访问不了了。#AaronSwartz --@marak

软件工程师 Sergio Gómez 回应称,“删改自己的代码也违反到 GitHub 的服务条款了?这是赤裸裸的绑架!我们最好做好分散托管软件源代码的准备。”

另一位用户也发布推文称,“不知道究竟是怎么回事,但我自己所有的项目都托管在 GitLab 的私有实例上,以免遇上类似的状况。永远不要相信任何互联网服务商。”

一位名叫 Piero 的开发者则指出,“Marak 搞乱了 faker 和 colors、影响到无数项目,难道还指望着自己能不受一点牵连?”

需要提醒大家一点,Marak 的此次过激行为发生在不久前影响巨大的 Log4j 漏洞事件之后。作为一套重量级开源库,Log4j 在不同企业及商业实体开发的各类 Java 应用程序当中都有广泛使用。而 Log4shell 漏洞的曝光引发越来越多 CVE,不少开源维护者不得不在休假期间无偿帮助修复这些免费项目。

于是开源业界开始普遍担忧,认为大企业们已经习惯于“压榨”开源成果、不停消耗,但却没有给予足够的回报来支持这些志愿放弃空闲时间来维持关键项目的贡献者。面对网民和 Bug 赏金猎人们的指责之词,也有人愤然回击,强调 Log4j 的维护者们“已经在夜以继日地构建缓解方案,包括修复、撰写文档、提交 CVE 以及回复质询等等。”

有用户在推文中写道,“对于此次 colors.js/faker.js 作者破坏自有软件包的回应,恰恰说明很多企业开发者认为自己在道德上有权无偿享用开源开发者的劳动成果、且无需给出任何回报。”“虽然免费开源软件运动及其目标值得称赞,但它最终让许多非常有才华的人幻想破灭且变得贫穷,因为开源实际上并不是一种可行的商业模式。”

至于开源软件生态到底能不能长久存续,恐怕只有时间能给出答案。

与此同时,这里要提醒 colors 与 faker 两大 npm 项目用户务必使用安全的包版本。比较稳妥的方法是降级至上个版本的 colors(例如 1.4.0)与 faker(例如 5.5.3)。

参考链接:

https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 InfoQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何实现一个new方法
• 创建一个空对象,将它的引用赋给 this,继承函数的原型。 • 通过 this 将属性和方法添加至这个对象 • 最后返回 this 指向的新对象,也就是实例(如果没有手动返回其他的对象)
刘嘿哈
2022/10/25
2470
JavaScript —— New
热身 New 这个关键字 是创建对象的? JS中万物皆是对象。 new 关键字是用来继承的。 => 面向对象的基础 new function DN(name, age) { this.name = name; this.age = age; this.salary = '30k'; } DN.prototype.ability = 100; DN.prototype.sayYourName = function(){ console.log('I am' + this.name); }
FinGet
2019/06/28
5630
前端面试(2)javascript
当使用构造函数创建一个对象后,在这个对象内部包含一个指针,这个指针指向构造函数的 prototype 属性所对应的值,这个指针被称为对象的为原型。
leader755
2022/03/08
1.3K0
前端面试(2)javascript
【THE LAST TIME】一文吃透所有JS原型相关知识点
首先我想说,【THE LAST TIME】系列的的内容,向来都是包括但不限于标题的范围。
Nealyang
2019/11/04
1.1K0
[我的理解]Javascript的原型与原型链
一、原型与原型链的定义 原型:为其他对象提供共享属性的对象     注:当构造器创建一个对象,为了解决对象的属性引用,该对象会隐式引用构造器的"prototype"属性。程序通过constructor.prototype可以直接引用到构造器的"prototype"属性。并且添加到对象原型里的属性,会通过继承与所有共享此原型的对象共享。 原型链:每个由构造器创建的对象,都有一个隐式引用(叫做对象的原型)链接到构造器的"prototype"属性。再者,原型可能有一个非空隐式引用链接到它自己的原型,以此类推,这叫
sam dragon
2018/01/17
9160
[我的理解]Javascript的原型与原型链
深入理解javascript中的继承机制 之 12种继承模式总结原型链法仅从原型继承临时构造器原型属性拷贝所有属性拷贝(浅拷贝)深拷贝原型继承法扩展与增强模式多重继承法寄生式继承借用构造函数:构造器于
之前我们介绍了多种javascript中的继承方式,最后我们开始总结概括这些继承方式,先将javascript中的继承分类,根据不同的条件,可以分成不同的类别。 最常用的我们可以分为这两类:
desperate633
2018/08/22
5090
JavaScript 面向对象
创建函数 Foo 的时候,就会有一个内置的 Foo.prototype 属性,并且这个属性是对象。
零式的天空
2022/03/02
2870
JavaScript继承的实现方式:原型语言对象继承对象原理剖析
对象的继承:A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法。这对于代码的复用是非常有用的。
周陆军
2021/08/14
8400
深入理解JavaScript(一)
2.支持函数式编程(高阶函数、内置的map和reduce)和面向对象编程(对象、继承)的混合编程风格
硬核项目经理
2019/08/06
1.5K0
JavaScript 常用功能总结
小编吐血整理加上翻译,太辛苦了~求赞! 本文主要总结了JavaScript 常用功能总结,如一些常用的JS 对象,基本数据结构,功能函数等,还有一些常用的设计模式。 目录: 众所周知,JavaScript是动态的面向对象的编程语言,能够实现以下效果: 1. 丰富Web 网页功能 2. 丰富Web界面 3. 实现本地或远程存储。 4. 实现分布式网络应用的前端组件,并在后台进行数据存储管理。 5. 使用JavaScript可以实现完整的分布式Web 应用。 JavaScript 中的数据类型 JavaScri
葡萄城控件
2018/01/10
2.7K0
JavaScript 常用功能总结
JavaScript两种继承方式详解
由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念。所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现
疯狂的技术宅
2019/03/27
7100
由浅入深,66条JavaScript面试知识点
来源:https://juejin.im/post/5ef8377f6fb9a07e693a6061
zz_jesse
2020/07/07
1.1K0
由浅入深,66条JavaScript面试知识点
JavaScript学习总结(四)——this、原型链、javascript面向对象
根据题目要求,对给定的文章进行摘要总结。
张果
2018/01/04
1.5K0
JavaScript学习总结(四)——this、原型链、javascript面向对象
涨薪必备Javascript,快点放进小口袋!
摘要: 嗨,新一年的招聘季,你找到更好的工作了吗?小姐姐最近刚换的工作,来总结下面试必备小技能,从this来看看javascript,让我们更深入的了解它。 前言 在JavaScript中,被吐槽最多的this,原型,继承,闭包等这些概念。接下来这篇文章会把我自己对于JavaScript中这些点通过this指向做个总结并分享给大家,希望可以帮助大家更好的了解这些所谓的难点。 一、this this是什么?this的常见使用场景呢? 普通调用,this指向为调用者 call/apply调用,this指向为当前
用户2145235
2018/05/18
7000
由浅入深,66条JavaScript面试知识点
作者:Jake Zhang https://juejin.cn/post/6844904200917221389
用户4456933
2021/06/01
7450
由浅入深,66条JavaScript面试知识点
JS中的面向对象、原型、原型链、继承总结大全
补充: js中说一切都是对象,是不完全的,在js中6种数据类型(Undefined,Null,Number,Boolean,String,Object)中,前五种是基本数据类型,是原始值类型,这些值是在底层实现的,他们不是object,所以没有原型,没有构造函数,所以并不是像创建对象那样通过构造函数创建的实例。关于对象属性类型的介绍就不介绍了。
疯狂的技术宅
2019/03/27
1.5K0
JS中的面向对象、原型、原型链、继承总结大全
【面试】386- JavaScript 面试 20 个核心考点
Javascript是前端面试的重点,本文重点梳理下 Javascript 中的常考基础知识点,然后就一些容易出现的题目进行解析。限于文章的篇幅,无法将知识点讲解的面面俱到,本文只罗列了一些重难点,如果想要了解更多内容欢迎点击https://github.com/ljianshu/Blog。
pingan8787
2019/10/23
4940
【面试】386- JavaScript 面试 20 个核心考点
JS与ES6高级编程学习笔记(三)——JavaScript面向对象编程
面向对象程序编程(Object-oriented programming,缩写:OOP)是用抽象方式构建基于现实世界模型的一种编程模式,JavaScript是一种基于对象(object-based)的语言,支持面向对象编程与函数式编程,但JavaScript的面向对象与其它的面向对象语言有较大差异,ECMAScript中没有类的概念,所以对象也有所不一样。
张果
2022/06/06
7980
JS与ES6高级编程学习笔记(三)——JavaScript面向对象编程
《JavaScript 模式》读书笔记(6)— 代码复用模式3
我们之前聊了聊基本的继承的概念,也聊了很多在JavaScript中模拟类的方法。这篇文章,我们主要来学习一下现代继承的一些方法。
zaking
2020/05/01
5560
ECMA-262-3深入解析第七章:2、OOP ECMAScript 实现
从来没有深入了解ECMA,网上找了一下,发现早在2010年就有大佬 Dmitry Soshnikov 总结了ECMA中的核心内容,我这里只是翻译记录,加深自己的印象。文章原文来自 ECMA-262-3 in detail. Chapter 7.2. OOP: ECMAScript implementation.
踏浪
2021/06/09
6290
推荐阅读
相关推荐
如何实现一个new方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档