一般来说,在许多NPM包的供应链攻击中,攻击者通常会将恶意指令写入包的安装配置文件,以便在开发人员的电脑上植入恶意软件。但如今出现了一种极为罕见的手法,使得恶意包在上线两个多月后才被发现异常。
安全公司Koi Security披露了一起大规模NPM包攻击行动,代号PhantomRaven。攻击者自今年8月起,共上传了126个恶意包,累计下载量超过8.6万次。这些恶意包会从开发人员的电脑中窃取NPM和GitHub的访问令牌、凭证,以及其他与CI/CD相关的敏感信息。然而,这波攻击引起Koi Security注意的关键在于,其植入恶意代码的方式更为隐蔽,能够绕过NPM生态系统中大部分安全检测工具,至今仍有80个恶意包未被下架。
攻击者是如何实现这一目标的?答案是利用“远程动态依赖”(Remote Dynamic Dependencies,RDD)技术,将恶意代码隐藏在一个未上传至NPM仓库的独立依赖包中。当开发者安装攻击者上传到NPM的主包时,系统会根据安装文件中指定的外部URL,从攻击者控制的服务器下载并安装这个未被NPM监管的恶意依赖包。
这种手法的可怕之处在于,由于依赖包本身并未上架至NPM,因此无论安全扫描工具还是依赖分析工具,都不会检测该依赖包,从而完全忽略其存在。此外,NPM包的官方页面也不会显示这类外部依赖,使得开发者容易误以为只有主包被安装,毫无其他潜在风险。
此外,由于依赖包托管在攻击者掌控的服务器上,攻击者甚至可以根据受害者的IP地址动态返回不同的有效载荷。例如,向使用VPN访问的网络安全研究人员返回无害内容,而向企业网络或云环境则推送真正的恶意代码。攻击者还能“放长线钓大鱼”:先发布无害版本通过企业安全检测,待时机成熟后,再通过后续版本更新推送恶意代码。
这波攻击的另一大威胁在于其全程自动化。一旦开发人员执行npm install命令,系统不仅会自动下载外部依赖包并安装,还会通过预安装(preinstall)脚本自动执行node index.js命令,部署名为PhantomRaven的恶意软件,整个过程没有任何提示或警告,也无需用户交互。
攻击者的目标首先是从.gitconfig、.npmrc文件中的域名信息,以及package.json中的作者字段等数据中,提取开发人员的电子邮件地址。
随后,恶意软件会扫描GitHub Actions、GitLab CI、Jenkins、CircleCI等平台的凭证和令牌,并探测开发环境的系统信息,以判断受感染设备的类型与价值。最终,通过HTTP GET、POST以及WebSocket连接,将窃取的数据外传至攻击者服务器。
值得一提的是,Koi Security指出,攻击者使用的“拼写错误投毒”(Typosquatting)手法也有所不同。这些恶意包的名称并非随机拼写错误,而是基于大型语言模型(LLM)可能产生的“幻觉”特性精心设计。当开发者向GitHub Copilot或ChatGPT等AI助手询问某个包时,LLM可能推荐一个看似合理但实际不存在的包名,攻击者便提前注册这些名称进行投毒。这种利用LLM幻觉进行攻击的手段,Koi Security称之为“Slopsquatting”。