概述
Node.js和npm的安全性正变得越来越重要,我正在考虑恶意攻击者和软件包如何对我们的系统造成损害的可能路径。一个非常强大且经常被忽略的功能是可以通过package.json定义二进制文件,包括它们的名称和使用的文件。可以将它用于(覆盖)某些文件或在我们想要在任何地方植入文件?
发现问题
我的测试证实了我最初的假设,即所有这三个都容易受到文件植入和任意文件(覆盖)写入攻击的。
尽管npm和yarn最容易受到攻击,但正如我的测试所总结的那样,pnpm似乎可以阻止许多攻击类型。
在大多数情况下,pnpm似乎无法解析node_modules外部的链接路径。同样,由于pnpm通常使用符号链接来管理依赖关系,因此可以防止符号链接被其他使用它们创建并拥有的软件包覆盖。
问题在于我们可以为文件名称和文件进行符号链接定义任何(有效)路径。
"bin": { "../some/path": "../some/other/path" }
PoC
符号链接.ssh / id_rsa
"keyfile": "/Users/danielruf/.ssh/id_rsa"
这样设置后,恶意应用程序就可以直接访问文件,而无需使用绝对路径和绕过检查所用路径的工具。根据包管理器的安装方式,这也可以作为某种特权绕过。
(覆盖)写入文件
"webpack": "./test.js"
这样webpack用其他方式覆盖文件。这可用于以操纵或恶意版本静默替换干净的文件。如果尚未创建,则会创建它。
植入文件
"/Users/danielruf/Desktop/yyy": "./fake-file"
这将在桌面上生成一个新文件,其中包含来自已安装软件包相对路径的代码。
相对路径和简单路径遍历也可以用来实现相同目的:
"../../../yyy": "./fake-file"
安全修复方案
路径不应在node_modules文件夹之外被解析,以防止大多数此类方法,例如pnpm已经这样做。
而且,不应允许它覆盖由其他依赖项创建的符号链接。在某些情况下,这是可以避免的,但在大多数情况下,程序包管理器允许这样做。用户也不会获得默认情况下已安装文件的信息,因此不清楚后面发生的事情。
关于文件系统访问的限制也应该防止其他方面的攻击。但这是一个普遍的问题,必须在Node.js中解决(表示已经从根开始尝试解决)。
更新
更新到npm(v6.13.4)和yarn(v1.12.1)的最新可用版本,这些版本解决了这些问题。#npm##pnpm##yarn#