有些攻击方式虽然听起来很幼稚,但有时候却也可以生效,比如typosquatting攻击——我们上次看到这种攻击是在去年6月份,这本身也是种很古老的攻击方式。
所谓的typosquatting,主要是通过用户的拼写错误诱导用户访问或下载某个伪装成合法工具的恶意程序——其核心只在于工具名或文件名和原版很像,比如app1e.com,这种类型的钓鱼就是typosquatting。最近 npm 就遭遇了这种攻击。
有人在 npm 上传了不少恶意包
npm的CTO CJ Silverio在博客上发表了一篇文章提到:7月19日-31日期间,名为hacktask的账户发动了typosquatting攻击,此账户发布了一系列package,名称和npm中比较流行的package类似。
这其实就是typosquatting攻击的精髓。而上面提到的npm其实是node.js的package管理工具。开发人员会封装一些常用功能的代码发布到Node.js上,这样其他的人员就可以复用类似功能的代码,而不必重新造轮子。
Silverio在博客中说,这些package的命名绝对是故意、恶意的,目的就是为了欺骗用户,并最终收集到用户数据。好在hacktask发布的所有package都已经从npm移除。安全研究人员暂时发现除了hacktask之外,npm中还没有其它同类typosquatting攻击的package。
这些恶意的package和下载数显示如下:
babelcli: 42
cross-env.js: 43
crossenv: 679
d3.js: 72
fabric-js: 46
ffmepg: 44
gruntcli: 67
http-proxy.js: 41
jquery.js: 136
mariadb: 92
mongose: 196
mssql-node: 46
mssql.js: 48
mysqljs: 77
node-fabric: 87
node-opencv: 94
node-opensl: 40
node-openssl: 29
node-sqlite: 61
node-tkinter: 39
nodecaffe: 40
nodefabric: 44
nodeffmpeg: 39
nodemailer-js: 40
nodemailer.js: 39
nodemssql: 44
noderequest: 40
nodesass: 66
nodesqlite: 45
opencv.js: 40
openssl.js: 43
proxy.js: 43
shadowsock: 40
smb: 40
sqlite.js: 48
sqliter: 45
sqlserver: 50
tkinter: 45
对于此事,Node.js社区建议:
如果你已经下载并已经安装了上面提到的这些package的话,你应该马上删除或替换掉你在命令行环境下存储的各种重要信息。
攻击并不高明
“过去,这样的事大多都是偶然的,我们也见过故意山寨现有库的名字来与原有开发者竞争的情况。但这次,package的命名完全是故意和恶意的,目的就是欺骗用户,从而从他们那里收集有用的信息,“Silverio说。
位于瑞典的开发人员Oscar Bolmsten在一个名为crossenv的package中发现了恶意代码,而人们真正想找的却是cross-env—— 一款当下很流行的用来设置环境变量的脚本。
“通过使用环境变量的方法将身份凭证递交给软件,这样的做法很普遍。所以这是一件很好的事情,”Silverio在接受电话采访时说道。
环境变量还用于存储用户名,密码,token,和连接一些应用程序,云服务,API访问权限的密码。
在攻击者发动的typosquatting攻击中,恶意代码会尝试复制受害者机器上设置的所有环境变量,并将其传输到攻击者控制的服务器npm.hacktask.net上。
crossenv使用的JSON配置文件运行了一个名为package-setup.js的脚本,它将现有的环境变量转换为字符串,然后通过POST请求发送数据。
根据Silverio所说,由hacktask提交的大约40个npm包已从npm删除,现在基本已经清理干净,我们扫描了每个npm package,来寻找恶意使用的安装代码,但是没有发现其他类似hacktask的情况。
Silverio对这次攻击的效果表示了怀疑,她说:“通过拼写错误来将恶意软件倒入注册表的手段并不高明,因为人们更倾向于使用搜索或者复制粘贴已发布的代码。
7月中旬以来,排除因为好奇的关系前往下载,hacktask上传的绝大部分package,每个下载量大约是40次,恶意的crossenv软件包的下载次数最多,为700次,但这里面大多数都被认为是触发了npm镜像服务器的自动下载。
Silverio估计在这段时期只有约50人下载了恶意的crossenv包,她说她还没有发现有开发者由于这次事件导致账户被黑的上报情况。
虽然hacktask的账户已经被封了,但其背后主谋却还未知是谁。
这种攻击有办法预防吗?
当问到npm是否已采取相应的措施来防止其他用户名下的类似攻击时,Silverio表示这种攻击仍然可能无法立即检测到。
她说:“虽然我们在发布的过程中无法随时随刻的掌控一切,但我们建立了一个运行良好的系统”,Silverio称赞了npm社区的警惕性。
尽管如此,Silverio仍表示,npm正在研究如何识别有相似名字的npm package,用来防治今后的typosquatting攻击。npm也正在与安全公司Smyte一起检测发布过的垃圾信息。很明显,垃圾信息的发布者希望搜索引擎检索到README文件,来提高自己的网站排名。
2016年的kiwicon,开发者Jeff Andrews在关于Node.js的安全性的演讲上问了自己这样一个问题:“我使用Node.js或npm,但我怎么保证这么做是安全的呢?”他答道:“根本不能保证。”