BeaverTail与OtterCookie通过新型JavaScript模块进化
思科Talos发现与朝鲜(DPRK)结盟的威胁组织Famous Chollima发起的新攻击。该组织以冒充招聘机构针对求职者而闻名,诱骗他们安装信息窃取恶意软件以获取加密货币和用户凭证。
在此事件中,尽管该组织并非直接攻击目标,但其一个系统遭到入侵——可能是因为用户被虚假工作机会欺骗,安装了名为"Chessfi"的木马化Node.js应用程序。该恶意软件通过官方NPM存储库上名为"node-nvm-ssh"的Node.js包分发。
Famous Chollima经常使用两种恶意工具BeaverTail和OtterCookie,它们最初是独立但互补的程序。最近的活动中,它们的功能开始融合,Talos还发现了一个用于键盘记录和屏幕截图的新模块。
在搜索相关威胁时,Talos还发现了一个包含BeaverTail和OtterCookie代码的恶意VS Code扩展。虽然不能确定归因于Famous Chollima,但这表明该组织可能正在测试新的恶意软件分发方法。
键盘记录和屏幕截图模块
Talos在此活动中遇到了一个先前未记录的键盘记录和屏幕截图模块。我们找到了2025年4月上传到VirusTotal的早期OtterCookie样本,其中包含该模块。
键盘记录模块使用"node-global-key-listener"包进行键盘记录,“screenshot-desktop"用于截取桌面屏幕截图,“sharp"用于将捕获的屏幕截图转换为网络友好的图像格式。
该模块配置这些包来监听击键,并定期截取当前桌面会话的屏幕截图,将它们上传到OtterCookie命令与控制(C2)服务器。
击键保存在用户的临时子文件夹windows-cache中,文件名为"1.tmp”,屏幕截图保存在同一子文件夹中,文件名为"2.jpeg”。键盘记录器在循环中运行,每秒刷新缓冲区,而屏幕截图每四秒拍摄一次。
Talos还发现了该模块的一个实例,其中剪贴板监控包含在模块代码中,扩展了其窃取剪贴板内容的功能。
键盘记录数据和捕获的屏幕截图使用URL"hxxp[://]172[.]86[.]88[.]188:1478/upload"上传到OtterCookie C2服务器的特定TCP端口1478。
OtterCookie VS Code扩展
在VirusTotal上搜索类似样本时,Talos发现了一个最近上传的VS Code扩展,如果安装在受害者的编辑器环境中,可能会尝试运行OtterCookie。该扩展是一个虚假的就业入职助手,据称允许用户跟踪和管理候选人测试。
虽然Talos不能高度自信地将此VS Code扩展归因于Famous Chollima,但这可能表明威胁行为者正在试验不同的分发向量。该扩展也可能是与Famous Chollima无关的其他行为者(甚至可能是研究人员)实验的结果,因为这与他们通常的TTPs不同。
其他OtterCookie模块
OtterCookie代码部分以包含配置值(如唯一活动ID和C2服务器IP地址)的JSON对象定义开始。OtterCookie代码部分从字符串构建附加模块,这些模块作为子进程执行。在我们分析的攻击中,我们观察到了三个模块,但我们在存储库和VirusTotal中搜索类似样本时还发现了一个附加模块。
远程Shell模块
第一个模块是OtterCookie的基础模块,以检测受感染系统平台和虚拟机检查开始,然后将收集的用户和主机信息报告给OtterCookie C2服务器。
一旦系统信息提交,该模块安装"socket.io-client"包,用于连接到OtterCookie C2服务器的特定端口以等待命令并在循环中执行它们。socket.io-client首先使用HTTP,然后切换到WebSocket协议与服务器通信,我们观察到服务器在TCP端口1418上监听。
最后,根据操作系统,该模块使用macOS上的"pbpaste"或Windows上的"powershell Get-Clipboard"命令定期检查剪贴板内容。它将剪贴板内容发送到专门用于记录OtterCookie活动的C2服务器URL"hxxp[://]172[.]86[.]88[.]188/api/service/makelog"。
文件上传模块
该模块枚举所有驱动器并遍历文件系统,以找到要上传到OtterCookie C2 IP地址特定端口和URL的文件(在此案例中为"hxxp[://]172[.]86[.]88[.]188:1476/upload")。
该模块包含要从搜索中排除的文件夹和文件名列表,以及另一个包含目标文件扩展名和文件名搜索模式的列表,以选择要上传的文件。
“有趣"文件列表包含以下搜索模式:
“.env”, “metamask”, “phantom”, “bitcoin”, “btc”, “Trust”, “phrase”, “secret”, “phase”, “credential”, “profile”, “account”, “mnemonic”, “seed”, “recovery”, “backup”, “address”, “keypair”, “wallet”, “my”, “screenshot”, “.doc”, “.docx”, “.pdf”, “.md”, “.rtf”, “.odt”, “.xls”, “.xlsx”, “.txt”, “.ini”, “.secret”, “.json”, “.ts”, “.js”, “.csv”
加密货币扩展窃取模块
虽然Talos分析的活动未出现此模块,但在VirusTotal上寻找类似文件时发现了它。除了BeaverTail代码针对加密货币浏览器扩展外,此OtterCookie模块还针对一个列表中的扩展,该列表部分与BeaverTail部分有效载荷的加密货币钱包扩展列表重叠。
该加密货币模块针对Google Chrome和Brave浏览器。如果在任何浏览器配置文件中找到任何扩展,扩展文件以及保存的登录和网络数据将上传到C2服务器URL。在Talos发现的样本中,上传C2 URL为"hxxp[://]138[.]201[.]50[.]5:5961/upload”。
OtterCookie进化
OtterCookie恶意软件样本最早由NTT Security Holdings在2024年11月左右观察到,导致2024年12月发布了一篇博客文章。然而,据信该恶意软件自2024年9月左右开始使用。使用名称OtterCookie的动机似乎来自早期样本,这些样本使用HTTP响应cookie的内容传输由响应处理程序执行的恶意代码。这种远程代码加载功能随着时间的推移而发展,包括附加功能。
然而,在2025年4月,Talos开始看到OtterCookie代码中包含附加模块,并使用C2服务器主要用于下载简单的OtterCookie配置和上传被盗数据。
OtterCookie从最初的基本数据收集能力发展到更模块化的设计,用于数据窃取和远程命令执行技术。模块存储在OtterCookie字符串中并动态执行。
最早的版本(对应于NTT研究人员称为v1的版本)包含远程命令执行(RCE)代码,并使用socket.IO包与C2服务器通信。随着时间的推移,OtterCookie模块通过添加窃取和上传文件的代码而发展,最终目标是从硬编码的浏览器扩展列表和保存的浏览器凭证中窃取加密货币钱包。目标浏览器包括Brave、Google Chrome、Opera和Mozilla Firefox。
下一个迭代(称为v2)包括使用Clipboardy包将剪贴板内容发送到远程服务器的剪贴板窃取代码。此版本还以略有不同的方式处理从服务器加载Javascript代码。与v1评估返回的头部cookie不同,服务器生成一个错误,该错误由客户端的错误处理程序处理。错误处理程序简单地将错误响应数据传递给eval函数,在那里它被执行。加载程序代码很小且容易被忽略,加上误报检测的风险,这可能是VirusTotal上OtterCookie加载程序检测不太成功的原因。
2025年2月观察到的v3变体包括将特定文件(文档、图像文件和加密货币相关文件)发送到C2服务器的功能。自2025年4月以来观察到的OtterCookie v4包括虚拟环境检测代码,以帮助攻击者区分沙盒环境的日志和实际感染的日志,表明其专注于规避分析。该代码还包含一些反调试和反日志记录功能。
v4变体改进了先前版本的代码,并更新了剪贴板内容窃取方法。它不再使用Clipboardy库,而是使用标准的macOS或Windows命令来检索剪贴板内容。
重要的是要注意,随着时间的推移,BeaverTail和OtterCookie之间的区别变得模糊,并且在某些攻击中它们的代码合并为一个工具。
OtterCookie v5
Talos在2025年8月观察到的活动使用了最新版本的OtterCookie,我们称之为v5,通过添加键盘记录模块来证明。键盘记录模块包含捕获屏幕截图的代码,这些屏幕截图与键盘击键一起上传到C2服务器。
初始感染向量是托管在Bitbucket上的修改版Chessfi应用程序。ChessFi是一个基于web3的多人在线国际象棋平台,玩家可以互相挑战并押注加密货币于比赛结果。选择与加密货币相关的应用程序来引诱受害者与先前报告的Famous Chollima目标一致。
攻击的第一个迹象是用户安装应用程序的源代码。基于项目的文件夹名称,我们以中等信心评估受害者是通过自由职业市场网站Fiverr被威胁行为者接触的,这与先前的报告一致。在搜索类似样本时,我们还发现了作为Discord对话附件上传给受害者的代码存储库。
感染过程从受害者运行Git克隆存储库开始:
在安装依赖项期间,恶意包从存储库下载并安装。npm安装程序解析恶意包的package.json文件,并找到在安装后运行命令的指令。这是通过解析名为"scripts"的JSON对象的"postinstall"值来执行的。乍一看,postinstall脚本似乎是为了运行测试,将TypeScript文件转译为JavaScript,并可能运行其他测试脚本。
然而,package.json模块安装指令"npm run skip"导致npm调用在"skip"值中指定的命令node test/fixtures/eval。默认的node.js加载约定将尝试加载许多文件名(如果未具体提及),其中之一是index.js。
test/fixtures/eval/index.js内容包含使用文件"test/fixtures/eval/node_modules/file15.js"生成子进程的代码。
最终,file15.js加载文件test.list,这是最终的有效载荷。这种达到有效载荷代码的相当复杂的过程使得毫无戒心的软件工程师很难发现Chessfi应用程序的安装最终会导致恶意代码的执行。
使用test.list,我们终于到达了恶意代码如何运行的最后一个谜题。test.list文件超过100KB长,并使用Obfuscator.io进行混淆。幸运的是,在这种情况下,混淆并未配置为使分析非常困难,借助反混淆器和LLM,Talos能够反混淆其大部分功能,揭示了BeaverTail和OtterCookie的组合。
标准BeaverTail功能
代码中似乎有两个可区分的部分。第一部分与BeaverTail相关,包括枚举各种浏览器配置文件和扩展,以及从C2服务器"23.227.202[.]244"下载Python发行版和Python客户端有效载荷,使用常见的BeaverTail/InvisibleFerret TCP端口1224。代码的第二部分与OtterCookie相关。
BeaverTail部分以一个禁用控制台日志记录的函数开始,转向加载所需模块并按顺序调用函数,以从浏览器扩展列表、加密货币钱包和浏览器凭证存储中窃取数据。
BeaverTail进化
BeaverTail自2023年5月以来被观察到,最初是一个相对较小的下载器组件,设计用于包含在基于Node.js的Javascript应用程序中。BeaverTail也用于影响NPM包存储库中包的供应链攻击,这在先前的研究中已有广泛报道,不在本文讨论范围内。
从一开始,BeaverTail就支持Windows、Linux和macOS,利用了Node.js应用程序可以在不同操作系统平台上运行的事实。
BeaverTail内的其他主要功能是下载InvisibleFerret Python窃取者有效载荷模块和安装远程访问模块(通常是AnyDesk客户端),这将允许攻击者远程控制受感染的机器。信息窃取和远程访问一直是BeaverTail随时间推移的重复操作技术。
在2023年6月发现初始样本后不久,BeaverTail开始使用简单的base64编码字符串和重命名变量,以使检测和分析更加困难。这还包括一种用于将C2 URL编码为混洗字符串的方案,该字符串的切片单独进行base64解码,然后按正确顺序连接以生成最终URL。
尽管BeaverTail通常用Javascript编写,但Talos还发现了几个Javascript C2 IP服务器地址。这些与借助Qt框架创建的C++编译二进制变体共享。
从2023年中开始,到2024年最后一个季度,BeaverTail C2 URL模式稳定在最常用的TCP端口1224和1244周围,而不是早期变体使用的端口3306。威胁行为者似乎很快意识到大多数Windows安装不像Linux发行版和macOS那样预装Python解释器。为了解决这个问题,他们包含了安装Python发行版的代码,通常来自"/pdown" URL路径,需要运行Python InvisibleFerret模块。这种TTP一直持续到今天。
在检测规避方面,Famous Chollima使用几种方法来混淆代码,最常用的是免费Javascript工具Obfuscator.io的不同配置,这确实使恶意代码的分析尤其是检测更具挑战性。
除了混淆Javascript代码外,他们还定期使用各种基于XOR的混淆模式来混淆下载的模块。XORed Python InvisibleFerret模块以唯一的基于用户的字符串赋值开始,后跟一个反向的base64编码字符串,其中包含最终的Python模块代码,该代码也可以进行XOR混淆以进行混淆。
幸运的是,通过使用反混淆工具和LLM来重命名变量和base64解码编码字符串,可以相对轻松地分析新样本。然而,归因于Famous Chollima的团体的操作节奏很高,VirusTotal上全新样本和代码的检测仍然不可靠,允许威胁行为者有足够的时间成功攻击一些受害者。
BeaverTail、OtterCookie和InvisibleFerret功能重叠
OtterCookie代码中存在的所有附加模块与传统上与InvisibleFerret及其基于Python的模块以及BeaverTail代码的某些部分相关的功能很好地对应。将功能转移到Javascript可能允许威胁行为者消除对Python代码的依赖,消除了在Windows上安装完整Python发行版的要求。
覆盖范围
我们的客户可以检测和阻止此威胁的方法如下。
思科Secure Endpoint(以前的AMP for Endpoints)非常适合防止本文中详细介绍的恶意软件的执行。在此免费试用Secure Endpoint。
思科Secure Email(以前的Cisco Email Security)可以阻止威胁行为者作为其活动一部分发送的恶意电子邮件。在此免费试用Secure Email。
思科Secure Firewall(以前的Next-Generation Firewall和Firepower NGFW)设备(如Threat Defense Virtual、Adaptive Security Appliance和Meraki MX)可以检测与此威胁相关的恶意活动。
思科Secure Network/Cloud Analytics(Stealthwatch/Stealthwatch Cloud)自动分析网络流量,并提醒用户每个连接设备上可能不需要的活动。
思科Secure Malware Analytics(Threat Grid)识别恶意二进制文件,并将保护构建到所有思科Secure产品中。
思科Secure Access是基于零信任原则构建的现代云交付安全服务边缘(SSE)。Secure Access提供无缝透明和安全的互联网、云服务或私有应用程序访问,无论您的用户在哪里工作。如果您有兴趣免费试用思科Secure Access,请联系您的思科客户代表或授权合作伙伴。
Umbrella,思科的安全互联网网关(SIG),阻止用户连接到恶意域、IP和URL,无论用户是在公司网络内部还是外部。
思科Secure Web Appliance(以前的Web Security Appliance)自动阻止潜在危险的站点,并在用户访问之前测试可疑站点。
防火墙管理中心的附加保护为您的特定环境和威胁数据提供上下文。
思科Duo为用户提供多因素认证,以确保只有授权人员才能访问您的网络。
开源Snort订阅者规则集客户可以通过下载Snort.org上可供购买的最新规则包来保持最新。
以下Snort2规则可用于此威胁:65336
以下Snort3规则也可用于检测此威胁:301315, 65336
ClamAV检测也可用于此威胁:Js.Infostealer.Ottercookie-10057842-0, Js.Malware.Ottercookie-10057860-0
IOCs
此项研究的IOCs也可在我们的GitHub存储库中找到。
早期OtterCookie f08e3ee84714cc5faefb7ac300485c879356922003d667587c58d594d875294e
BeaverTail进化: 72ebfe69c69d2dd173bb92013ab44d895a3367f91f09e3f8d18acab44e37b26d caad2f3d85e467629aa535e0081865d329c4cd7e6ff20a000ea07e62bf2e4394 8efa928aa896a5bb3715b8b0ed20881029b0a165a296334f6533fa9169b4463b
恶意npm包 2025年8月 83c145aedfdf61feb02292a6eb5091ea78d8d0ffaebf41585c614723f36641d8 -test.list
类似于我们的活动 77aec48003beeceb88e70bed138f535e1536f4bbbdff580528068ad6d184f379 0904eff1edeff4b6eb27f03e0ccc759d6aa8d4e1317a1e6f6586cdb84db4a731 d27c9f75c3f1665ee19642381a4dd6f2e4038540442cf50948b43f418730fd0a 51ddd8f6ff30d76de45e06902c45c55163ddbec7d114ad89b21811ffedb71974 d89c45d65a825971d250d12bc7a449321e1977f194e52e4ca541e8a908712e47 6a9b4e8537bb97e337627b4dd1390bdb03dc66646704bd4b68739d499bd53063 a6914ded72bdd21e2f76acde46bf92b385f9ec6f7e6b7fdb873f21438dfbff1d
VSCode扩展 9e65de386b40f185bf7c1d9b1380395e5ff606c2f8373c63204a52f8ddc01982 dff2a0fb344a0ad4b2c129712b2273fda46b5ea75713d23d65d5b03d0057f6dd - raw.js
C2 URLs hxxp[://]23[.]227[.]202[.]244:1224/uploads hxxp[://]23[.]227[.]202[.]244:1224/pdown hxxp[://]23[.]227[.]202[.]244:1224/client/14/144 hxxp[://]23[.]227[.]202[.]244:1224/payload/14/144 hxxp[://]23[.]227[.]202[.]244:1224/brow/14/144 hxxp[://]23[.]227[.]202[.]244:1224/keys
hxxp[://]172[.]86[.]88[.]188:1418/socket[.]io/ hxxp[://]172[.]86[.]88[.]188:1476/upload hxxp[://]172[.]86[.]88[.]188/api/service/makelog hxxp[://]172[.]86[.]88[.]188/api/service/process/c841b6c4ac4d2e83f16cf7a8bfbec3d7 hxxp[://]138[.]201[.]50[.]5:5961/upload hxxp[://]135[.]181[.]123[.]177/api/service/makelog hxxp[://]144[.]172[.]96[.]35/api/service/makelog hxxp[://]144[.]172[.]112[.]50/api/service/makelog hxxp[://]172[.]86[.]73[.]46 hxxp[://]135[.]181[.]123[.]177 hxxp[://]172[.]86[.]113[.]12
下载URLs hxxps[://]www[.]npmjs[.]com/package/node-nvm-ssh hxxps[://]bitbucket[.]org/dev-chess/chess-frontend[.]git