推荐超级课程:
攻击演示及工作原理
“Shai-Hulud”蠕虫的攻击过程可以概括为以下几个关键步骤:
初始感染: 攻击者通过网络钓鱼等手段窃取了 npm 包维护者的账户凭据。
植入恶意代码: 攻击者利用窃取的凭据,向受害者维护的 npm 包中植入恶意代码,并发布新版本。恶意代码通常位于一个
bundle.js
文件中,并通过package.json
文件的postinstall
脚本来执行。本地凭据窃取: 一旦被感染的 npm 包被下载并安装,
postinstall
脚本就会自动运行。该脚本会在受害者的计算机上(主要针对 Linux 和 macOS 系统)搜索并窃取各种敏感信息,包括:GitHub 令牌
npm 认证令牌
AWS 和 GCP 等云服务凭据
其他环境变量中暴露的密钥
数据外泄与传播:
公开暴露: 恶意软件会将窃取到的凭据打包,并在受害者的 GitHub 账户下创建一个名为 “Shai-Hulud” 的公共仓库,将这些敏感信息公开提交。这不仅是一种数据外泄方式,也是对受害者的公开羞辱。
自我复制: 这是攻击最危险的部分。蠕虫会利用窃取到的 npm 令牌,登录受害者的账户。它会自动识别受害者维护的其他 npm 包,向这些包中注入相同的恶意代码,然后将新版本发布到 npm 注册表上。
连锁反应: 这种机制形成了一个快速、自动化的传播链。一个被感染的包会感染其维护者的所有其他包,这些包又会感染新的开发者,从而像滚雪球一样在整个 npm 生态系统中迅速蔓延。
自我复制机制
Shai-Hulud恶意软件的核心创新在于其通过NpmModule.updatePackage
函数实现了自复制机制。与传统供应链攻击不同,它能够自动识别并感染被入侵开发者维护的其他软件包,从而实现“蠕虫式”传播。
传播过程包括:
- 下载现有软件包压缩包
- 修改
package.json
文件,注入恶意postinstall
脚本 - 嵌入约3.6MB的压缩后
bundle.js
有效载荷 - 重新打包并发布到npm注册表
这一过程无需人工干预,可全自动在npm生态中横向扩散
被盗取密钥示例
以下以Github Token被盗取为例演示你的信息如何泄露的。
到Github上搜索 “Shai-Hulud” 关键字的代码仓库。这个仓库中只有一个
data.json
文件的提交:复制这个
data.json
中的字符串。有一定编程经验的老手可以直接猜出,这个看似一个base64
的字符串!没错!它就是base64
的字符串,只不过是二次encoded的字符串。我们来试着decode一下:
echo <上面拷贝的字符串> | base64 -d | base64 -d
- 可怕的事情你会发现,它盗取了你当前环境的所有:
环境变量:如果你在环境变量中设置了AWS,Google,Azure等云的密钥信息,甚至是生产环境的密钥,那恭喜你,你完蛋了!
各种密钥: Github,AWS, GCP, Npm, Bitcoin, BlockChain
如何防范
为了保护自己免受此类攻击,请立即采取以下行动:
检查可疑账户活动: 检查你的 npm 和 GitHub 账户活动,查找是否有未经授权的包发布或仓库创建。
轮换凭据: 如果你使用了任何受影响的包,请立即轮换所有相关的 npm、GitHub 以及云服务(AWS、GCP 等)凭据。
审查依赖项: 定期审计你的
package.json
文件和package-lock.json
文件,检查是否有可疑的新增或版本号更改。使用安全工具: 考虑使用像 Socket.dev 这样的工具,它们可以分析你的依赖项,并在发现已知的恶意包时发出警告。
保持警惕: 对来自未知来源的 npm 或 GitHub 电子邮件保持警惕,尤其是在要求你更新账户或验证 MFA 信息的邮件中。