一项学术研究指出,JavaScript 库的 npm 生态系统要比大多数开发人员想象的更加交织错杂,就像一个纸牌屋,只要攻陷一个就能导致数万个项目崩溃。
德国达姆施塔特技术大学计算机科学系开展的研究分析了整个 npm 生态系统的依赖关系图。
研究人员下载了2018年4月前所有发布的 npm 数据包元数据,并创建了包含676,539个节点和4,543,473个边缘(连接节点的线)的巨大图形。
另外,研究人员还分析了相同数据包的不同版本,不仅查找历史版本(676,,539个数据包中的5,386,239个版本),而且还查看了数据包维护人员 (199,327个 npm 账户)以及影响这些数据包的已知安全漏洞(609个公开报告)。
他们的目标是了如何攻破一个或多个 npm 维护人员账户,或者在 npm 生态系统中如何引发一个或多个数据包中的漏洞;以及一次导致成千上万个 npm 项目内部发生安全事件所需的临界数量。
NPM 数据包的依赖关系太多
研究团队表示,这个临界值的实现较为容易,主要原因在于一般的 npm JavaScript 数据包的依赖关系的数量之多异乎寻常——平均而言,一个数据包要从39个不同的维护人员那里加载79个第三方数据包。
较为流行的数据包的依赖关系数量较低,平均而言它们仅依赖于来自20个其他维护人员的代码,但研究人员认为某些流行的 npm 数据包(600)依靠的是100多个维护人员编写的代码。
研究人员指出,上游数据包具有数量如此之众的依赖关系和第三方开发人员代码是 JavaScript 语言“微数据包”趋势的一个副作用。JavaScript 语言的基本功能被分割到多个仅有几行代码组成的 npm 数据包中。这样产生的负面影响在于,npm 数据包从数十个来源中加载代码,如不加监管,则它们所有都变成了第三方开发人员执行攻击的入口点。
只需攻破20个账户
虽然某些 npm 数据包从太多的数据包和太多的开发人员那里加载代码,但npm 数据包库还存在一个危险的趋势:多个流行 npm 数据包的加固掌握在少数维护人员账户手中。
研究人员指出,“391个影响力较大的维护人员影响1万多个数据包,从而使他们成为主要的攻击目标。如果攻击者设法攻陷其中的任何一个账户,那么整个社区就会遭受严重的安全事件。”
另外,在最坏的场景下,如果多个维护人员勾结或一名黑客获取对大量账户的访问权限,那么只需要攻陷20个流行的 npm 维护人员账户的访问权限就能将恶意代码部署到影响超过一半的 npm 生态系统。
但黑客不一定需要攻破账户,他们可以从现有的 npm 数据包中找到安全缺陷。
鉴于加载到其它230个npm 库中的npm 数据包的平均数量,从流行程度属于中等的数据包中找到漏洞可导致攻击者在数百个其它库中执行代码,而这些库可能用于对关键的业务系统或金融系统。
此外,攻击者并不一定要找到新的漏洞。研究团队扫描发现,40%的 npm 数据包依靠的依赖关系中存在至少一个公开已知的漏洞,这表明,目前很多 npm 数据包以及借此创建的面向用户的 app 均易受攻击。
确保一些账户和数据包的安全
不过,研究团队表示可以采取一种方式规避类似问题。最简单的解决方案是审查开发人员账户并审计流行的 npm 数据包,确保代码是安全的而且来自可信任来源。
研究人员认为审查其中140个最流行的账户以及300个流行的 npm 库应该能够将npm 生态系统中的供应链攻击风险降低一半。
研究团队的研究是从下列针对 npm 生态系统的供应链攻击事件受启发的,如:
2018年11月,一名黑客在事件流 npm 数据包中安装后门,在 BitPay Copay 桌面和移动钱包应用中加载恶意代码并窃取密币。
2018年7月:一名黑客通过恶意代码攻陷了 ESLint 库,他们通过恶意代码窃取了其它开发人员的 npm 凭证。
2018年5月,一名黑客在名为getcookies 的流行 npm 数据包中隐藏了一个后门。
2017年8月:npm 团队删除了被指从其它项目中窃取环境变量、旨在收集项目敏感信息如密码或 API 密钥的38个 JavaScript npm 数据包。
研究人员发布的论文题目为《小世界大风险:关于 npm 生态系统安全威胁的研究报告》,具体可见:
https://www.usenix.org/system/files/sec19-zimmermann.pdf
原文链接
https://www.zdnet.com/article/hacking-20-high-profile-dev-accounts-could-compromise-half-of-the-npm-ecosystem/
声明:本文来自代码卫士,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。