近日我们监测到 Vue.js 生态中的 vue-cli 包遭遇供应链投毒,而被投毒的 node-ipc 包在 npm 上每周下载量超百万,影响非常广泛。
被投毒的情况如下:
vue-cli 是 Vue.js 开发的标准工具,该工具被广泛应用于 vue 的快速开发
其依赖的 node-ipc 是用于本地和远程进程间通信的一个 js 模块,也用于支持 linux ,windows ,mac 等系统中的 socket 通信。
node-ipc 包的作者近期在 node-ipc 的 10.1.1-10.1.2 版本添加了恶意 JS ,该 JS 会修改俄罗斯和白俄罗斯用户的所有文件为❤️,但不到 24 小时后又删除该恶意 JS ,添加会在用户桌面创建反战宣传标语的 peacenotwar 模块。vuejs 的团队在发现 node-ipc 添加了 peacenotwar 模块后锁定了 vue-cli 依赖的 node-ipc 版本为 9.2.1 ,研究人员随后又发现 node-ipc 的作者此前添加的恶意 JS 存在于 node-ipc 旧版本中。
(问题组件每周下载量截图)
开发者 RIAEvangelist 在 node-ipc 包中添加名为 ssl-geospec.js 的恶意 JS 文件,将 node-ipc 的版本号更新为 10.1.1
删除 ssl-geospec.js 该文件,版本号更新为 10.1.3
开发者 RIAEvangelist 在 node-ipc 包中添加peacenotwar
模块,该模块会在桌面静默添加反战宣传文件
有开发者在论坛中反馈构建过程中发现被创建反战标语文件
Vue-cli 发布5.0.3
版本,在新版本中锁定 vue-cli 依赖的 node-ipc 版本为 9.2.1
研究人员分析发现 node-ipc 的作者不只添加了反战标语,还在旧版本 10.1.1-10.1.2 中添加了恶意 JS 文件删除俄罗斯和白俄罗斯用户文件
当前 npm 已禁止下载包含 peacenotwar 模块的版本,并提示:
npm ERR! 451 Unavailable For Legal Reasons
vue 的开发者 sodatea 针对此事件的回应如下:
node-ipc 9.2.2 增加 peacenotwar 模块,该模块会在未经用户同意的情况下写入 WITH-LOVE-FROM-AMERICA.txt 用户的 Desktop 和 OneDrive 文件夹。
vue-cli 已经发布了 4.5.16 和 5.0.3 来锁定依赖版本。
受影响的用户:在 2022-03-15T05:40:26.758Z 和 2022-03-15T13:17:57.076Z ;期间创建的新项目或者更新了项目依赖的人。
从俄罗斯和白俄罗斯 IP 删除文件的恶意代码不包含在 9.2.2 版本中
我们针对 node-ipc 包中使用的恶意 js 文件进行分析,可以看到多处使用 base64 编码对行为意图进行隐藏
远程 API 地址解码为: https://api.ipgeolocation.io/ipgeo?apiKey=ae511e1627824a968aaaa758a5309154
使用 https 加载远程 API
解密后的字符串,可以看出 c 为国家,e 为俄罗斯,i 为白俄罗斯,其他为文件路径
判断是否为俄罗斯或白俄罗斯,将结果注册为 a
如果是则执行 h 函数
h 函数递归爬取指定目录,将所传入的路径中的文件替换为 base64 编码的 4p2k77iP ,而其解码后为❤️
开源不等于可信,企业需要针对软件供应链建立动态管理机制,及时发现并响应其中可能的风险。
关于该漏洞的检测策略已在墨菲安全的所有工具产品中上线,您可以免费安装使用墨菲安全的 JetBrains IDE 插件、CLI 客户端等对你的项目进行检测,并一键修复。
产品邀请注册: https://www.murphysec.com/register?invite_code=onkXXo
开源仓库: https://github.com/murphysecurity
如果你觉得这个工具对你有用,可以 star 、提 issues 或者参与贡献,我们会挑选一个参与贡献的用户送出机械键盘一份。
1
Vitta 2022-03-16 20:44:03 +08:00
好家伙
|
2
villivateur 2022-03-16 20:56:12 +08:00 via Android 1
好家伙,发推广吧 @Livid
|
3
Livid MOD @villivateur 谢谢。这个主题已经被移动。
|
5
MiketsuSmasher 2022-03-18 09:44:49 +08:00
@ssltest 请问可以转载你的这篇帖子吗?
|
6
ssltest OP @MiketsuSmasher 可以啊
|