恶意软件

STOCKSTAY:一套学会把工作拆开的间谍系统

识别和清除 STOCKSTAY 的默认方法,是把交付对象、负责协调的 cor、产生主机效应的 sys、经 /ws 中继的 net 和原始访问面还原成一次任务,并在确认任一角色后隔离整套关系、保存内存与配置、切断精确出站、修复入口、重建信任并逐项验收。

手绘研究员把三种伪装投递物追到 STOCKSTAY 系统,再沿 net、cor、sys 三种角色设备连接右侧的斜杠 ws 云端中继。
文章导航

研究依据三角色任务重建、投递证据、响应与验收

来源Google 威胁情报组 / CISA / Microsoft / 固定版本技术文档 / SOSEC 复核

1 一次任务把三种进程和一条投递链连在一起

Google 威胁情报组在 2026 年 6 月 26 日公开 STOCKSTAY 时,给出了一个适合直接转成事件响应任务的发现:这个 .NET 间谍系统把远端通信、任务协调和主机操作分给不同进程。文件名从股票工具换成 PDF 阅读器、计算器、驱动和渲染器,职责仍沿用 netcorsys 三个内部角色。单个哈希可以找到第一件物证,完整处置必须把同一用户会话里的三个角色、配置、持久化、交付对象和外部连接同时纳入。

发现任一确认角色后,默认动作是隔离该设备与不可信网络,同时保护仍在内存中的配置、感染 UUID、窗口消息和密钥材料;随后清点同目录、同会话和同一持久化来源的所有 EXE、DLL、配置、LNK、MSI、RAR、ZIP、HTA 与 RDP 对象。持有 WebSocket 的进程消失,只说明当前传输被打断。设备的信任状态要等到整套角色、原始入口、身份影响和主机效应全部有结论后才能恢复。

1.1 先走完一条可观察路径

用一项文件收集任务就能看清这套系统。交付对象先把三个角色和配置放进目标环境。协调进程读取配置,知道远端服务和运行时段;工作进程收到指令后枚举并读取目标文件,在内存中准备结果;联网进程维持外部安全连接,把结果送到 /ws 路径。任务在本机进程之间通过隐藏窗口消息转交,所以文件读取和网络发送通常属于不同进程。

这条路径给出了四组可直接查询的连接点。第一组是交付:邮件、RDP 会话、HTA、安装器或被利用的压缩包怎样把字节带到设备。第二组是本地装配:三个托管进程是否来自同一目录、同一登录会话、同一安装器或同一 Startup/Run 来源。第三组是任务:哪个进程枚举文件、查询 WMI、截屏、改注册表或启动隐藏子进程,附近哪个进程负责本地协调。第四组是外发:哪个进程拥有 DNS、代理、TLS 和 WebSocket 会话,目的地主机、/ws 路径、时段和字节变化是否与主机效应吻合。

调查结论停在证据最后到达的一步。邮件送达只证明目标收到交付物;附件打开或远程图片请求证明发生交互;恶意文件落盘证明投递;进程启动证明执行;三个角色和本地通信出现才证明系统装配;WebSocket 传递任务或响应才证明远程操作;文件、截屏、注册表、WMI 或子进程记录才证明具体主机效应。这个顺序可以防止把二十名收件人写成二十台失陷主机,也能防止因为某个云服务下线就漏掉仍驻留在设备上的组件。

1.2 cor 协调,sys 操作主机,net 负责外部传输

cor 对应 STOCKMARKET,是协调器。它解开磁盘上的伪装配置,管理感染标识、运行节奏和服务地址,再把任务交给其他角色。sys 对应 STOCKTRADER,是产生主机效应的工作进程。net 对应 STOCKBROKER,是能够识别代理设置并持有安全 WebSocket 的传输进程。三个常驻角色不含 MARKETMAKER;它属于交付层,负责下载、解包和建立持久化。

这套分工决定了隔离和狩猎的颗粒度。只按网络连接搜进程会漏掉 sys,只按文件和 WMI 行为搜进程会漏掉 net,只结束一个进程会留下其余角色与重建材料。可靠的家族识别依赖角色关系:同会话、同打包集合或同持久化来源的 .NET 进程,其中一个负责外连,一个负责协调,一个产生与公开命令族相符的效果。

手绘 net、cor、sys 三台设备通过 WM_COPYDATA 管道相连,只有 net 持有 WebSocket 线圈,sys 则连接主机操作工具。
图 1:一次远端任务跨过 net、cor、sys 三个进程;外连、协调和主机效应必须在同一会话中重新关联。

2 本地消息和远端队列共同完成一次任务

完成前面的任务路径后,再看术语会简单得多。IPC 指同一台主机上进程之间的通信;STOCKSTAY 使用 Windows Forms 创建不呈现普通界面的窗口,并借 Windows 消息在角色之间传递数据。C2 指远端命令与控制通道;只有 net 与安全 WebSocket 直接相连,cor 和 sys 通过本地消息接入这条通道。环境绑定则表示配置解密需要目标主机名、域、用户名或已知秘密,使脱离原环境的文件可能保持不透明。

2.1 隐藏窗口承载本地交接,配置决定运行环境

Microsoft 将 WM_COPYDATA 定义为消息 0x004A。发送进程通过 SendMessage 把包含自定义值、字节数和数据指针的 COPYDATASTRUCT 同步交给接收窗口。接收方若要在处理返回后继续使用内容,必须复制到本地缓冲区。这个普通 Windows 功能只有与角色进程、窗口名、用户会话、内容形态和周边效果同时出现时,才构成 STOCKSTAY 证据。

GTIG 的公开规则给出 SMEditorPageSMNetPageStockMarketViewPage 与若干 window_system32_* 名称,并把 wmCopyDatatempStorage、WebSocket 状态和协议方法连在同一个 Broker 规则中。静态字符串可以帮助找样本,实时窗口所有者、同会话角色和同步主机效应能够把“代码可能存在”提升为“本地交接发生”。端点产品没有记录 SendMessage 时,应保留这个盲区,改用内存、窗口枚举、进程时序和效果关联补证。

配置的外层 JSON 伪装成股票行情工具,列出正常交易所 WebSocket 地址,把加密运行字段藏在 SystemConfiguration 中。那些交易所 URL 是伪装材料,没有公开证据显示它们参与恶意中继。解密后的字段包括 internal_id、标成服务端公钥的 internal_key、服务地址、运行间隔、工作时段、休息日和系统属性。多数已分析配置使用主机本地时间周一至周五 09:00—18:00,这是一条历史追查线索,不能成为排除窗口外活动的硬规则。

早期和侦察后的部署使用过不同口令。2023 年单体样本使用目标小写主机名,乌克兰成熟访问案例用域名解开替换配置,2025 年 4 月初始访问包使用硬编码口令。失败的沙箱解密因此需要回到原端点语境。重建或改名设备前,保存准确主机名、域、用户名、大小写、区域、编码、原始配置字节和每组测试输入;一次成功输入只能解释手头文件。

cor 首次运行还会生成感染 UUID 和一对 4096-bit RSA 密钥。UUID用于远端路由,配置中的 internal_id 表示服务端身份,两者不能在看板里合并成一个“主机 ID”。GTIG 说明客户端在首个请求发送公钥,并在生命周期内用密钥对保护出站数据;公开材料没有给出所有模式、填充、存储位置和完整调用路径。内存和受影响构建应承担密钥恢复判断,框架默认值不能代替逆向证据。

2.2 /ws 中继保存路由关系,消息正文保持加密

GTIG 找到的面向受害端控制代码由 server.pymodels.pywtools.py 组成。server.py/ws 扩展 Tornado WebSocketHandlercheck_origin 接受所有来源,openon_close 记录客户端地址,on_message 解开外层 Base64 并处理 JSON 包。Base64 承担文本传输,客户端的 CryptoContainer 负责保护任务正文。

send 动作把 target、sender 和加密 message 写入 SQLite。weather_data 表把收件方、发送方、正文分别命名为 degreespressurewdata,把地址放进 coords,记录创建时间;status 默认为零,GTIG 的公开代码说明没有看到它被使用或返回。recv 按接收身份取出匹配行,返回 target、sender、message、IP 和时间,再删除这些行。第二张 log 表保存消息和时间。

这套队列在隐藏正文的同时保留连接、路由和时间。平台侧可能拥有账号注册、仓库绑定、构建、部署、环境变量、边缘请求、服务删除和计费记录;应用与数据库可能留下 UUID、地址、创建和取回时刻。SQLite 删除先改变逻辑查询结果,主库、WAL、journal、快照或备份仍可能保留页面。采集必须一致复制主库与伴随文件,避免用会触发写入或 checkpoint 的工具打开原件。

X-Forwarded-For 的值需要与平台边缘行为和组织代理日志核对,才能映射到实际设备。成功 WebSocket 升级只证明传输建立;队列行也需要先区分感染 UUID、服务端 internal_id、提交方与取回方,才能判断方向。加密流量附近出现文件读取和内存压缩,可以支持“与收集响应一致”的结论,内容确认仍需端点、帧结构或服务商材料闭合。

手绘透明邮政中继中,send 信封经斜杠 ws 进入 weather_data1.db,recv 后离开,信件内容始终密封。
图 2:/ws 中继能看见收件方、发送方、时间与连接,任务正文仍由客户端密码学层保护。

3 可观察关系决定告警能否升级成事件

STOCKSTAY 的文件名经常变化,交付、cor、sys、net 和中继之间的关系更稳定。调查从已知摘要、YARA 或网络地址进入,随后必须回答交付对象怎样安装角色、三个角色是否在同一会话协作、哪个进程产生效果、哪个进程把结果带出、原始入口是否仍能重新投放。下面这张表是正文唯一的身份与动作映射,后续章节只解释证据,不再重排角色排名。

对象与任务可观察连接公开证据与时间事件动作
交付层:MARKETMAKER、MSI、RDP、HTA、RAR父容器、下载 URL、Run/Startup、安装目录、解包路径和角色集合GTIG 观察;2024 MSI、2025 RDP/HTA/RAR;具体路线置信度随端点执行证据变化保存容器与落盘树;修复对应邮件、远程会话、脚本、解压器或失陷站点
cor / STOCKMARKET:解配置与协调SystemConfiguration、感染 UUID、配置服务和时段、协议方法、兄弟角色GTIG 样本与规则;自 2023 年末分角色;高置信角色定义保存内存和加密原件;记录环境输入;追同会话 net 与 sys
sys / STOCKTRADER:主机操作文件枚举与读取、内存 ZIP、截屏、WMI、注册表、解包、隐藏子进程GTIG 命令分析与方法簇;高置信能力,具体执行须本地遥测按任务效果界定暴露;保存路径、会话、子进程和结果阶段
net / STOCKBROKER:外部传输代理选择、DNS、TLS、WebSocket、/ws、窗口消息和同会话 sys 效果GTIG 样本与规则;自 2023 年末分角色;高置信角色定义切断准确服务;保存进程归属、字节、时长、重连与配置来源
受害端中继:Python/SQLite 队列账号、仓库、部署、send/recv、UUID、数据库行、WAL 与边缘日志GTIG 保存的 2025 年 8 月代码摘要;11 月至少一份样本复用服务名;源码仓库当前不可固定向服务商发对象级保全请求;端点隔离与平台取证并行

3.1 强证据来自不同传感器对上同一任务

最高强度的本地证据把任务接收、准确主机效果、结果构造和 net 传输用共享标识、内容或清晰时序连起来。次一级证据能把角色进程和效果放在同一上下文,加密消息或 IPC 内容仍是空缺。已知样本或完整方法簇命中而无执行记录,只能说明代码身份。邮件主题、扫描服务上传地、孤立云地址或普通库重合则是范围线索,需要主机材料升级。

检测应从任一强节点向左右展开。发现 net 后查同会话托管进程、隐藏窗口、配置、Run/Startup 与 sys 效果;发现 sys 后查谁协调、谁持有 WebSocket、效果对应的文件和用户;发现配置后查父容器、环境输入、服务地址和准确角色;发现投递对象后沿安装树、持久化和首次执行找到三个角色。每条规则都应把下一条查询交给响应人员。

正常软件也会使用 websocket-sharp、Windows Forms、SQLite、托管 AES/RSA、WMI、Run 键、Squirrel3 或 WM_COPYDATA。生产关联需要角色、路径、进程关系、配置和效果收敛。用获批的 .NET WebSocket 客户端、WMI 盘点工具、写 Run 键的签名安装器和屏幕共享软件作负控制,可以验证单个常见行为不会触发最高级别处置。

配置常见的 09:00—18:00 工作日节奏只能帮助排序。关联窗口应依据本地事件测得的任务延迟:截屏到返回可能很短,递归文件选择和内存压缩可能跨越更久。固定五秒会漏掉任务,整日合并又会把无关软件绑在一起。保留原序列,再按命令族和配置节奏校准查询窗口。

3.2 家族判断同时记录身份、角色和来源

准确摘要可以直接确认一个已知对象,完整角色链可以确认当前系统。强方法簇与打包关系可支持“很可能属于”,同时明确缺少执行证据;只有共用库或混淆器重合时保留为“相关材料”。基础设施或诱饵匹配继续作为行动线索。这个分级让每份证据只承担它能证明的主张。

来源同样改变结论。扫描服务文件证明对象在提交前已经存在;公共仓库证明开发或暂存材料;失陷网站日志证明下游取回;邮件遥测证明送达或打开;端点和事件响应材料才能证明组件执行、任务效果与本地范围。样本从德国、荷兰、意大利或波兰上传,没有自动生成相应国家的受害者。

每项家族判断保留文件与父容器摘要、签名、程序集和模块身份、方法 token 或 IL 偏移、配置推导、打包成员、角色、来源、日期和置信度。2025 年 11 月的外部模块化分支尤其依赖包内隶属关系;单独 DLL 可以是遗留物,单独 EXE 也可能缺少关键实现。

4 已验证的交付路线在角色装配处汇合

公开记录包含 RDP、HTA、MSI、失陷网站和利用 WinRAR 漏洞的 RAR。每条路线的入口不同,只有证据到达角色装配时才能汇合到 STOCKSTAY。主题、国家和平台负责提供搜索入口,端点转折负责确定事件阶段。

4.1 RDP 与 HTA 经 MARKETMAKER 安装三种角色

2025 年 4 月 2 日,GTIG 观察到一个已失陷的乌克兰大学邮箱发送远程学习主题邮件,附件 RDP 文件把设备连到行动者仿冒域的 TCP 3389。GTIG 随后看到行动者把 MARKETMAKER 投到客户端;下载器又从遭入侵的乌克兰国家监管局网站取得 docs.zip。包内包含三个角色与 fonts 配置,配置指向 wss://weatherdataai.theworkpc.com/ws。这条链分别包含失陷邮箱、仿冒 RDP 主机、失陷下载站和 C2 服务,四个对象的所有者、保全材料和修复动作不同。

RDP 文件需要逐步证明收件、打开、mstsc.exe 启动、目的地解析、TCP 连接、证书与认证交互、可用远程会话、资源重定向、MARKETMAKER 进入客户端和后续执行。4 月案例由 GTIG 的后续可见性走到安装阶段;本地只看到附件和被拦连接时,结论停在交互与未成功投递,隔离与范围排查仍然成立。

同年计算器行动用 RAR 内的乌克兰语 HTA 触发 JScript,把 styles.dat 改名为 styles.dat.exe 并运行 MARKETMAKER。下载器从另一台失陷的乌克兰 WordPress 服务器取得 EditorToolsPdf.zip,其中 ViewPdf.exeClientMNGR.exeConverterDDSNet.exefonts 分别对应协调、联网、主机操作和配置。HTA 吞掉异常,用户没有看到报错无法支持“没有执行”的判断;需要查询原路径、改名、文件 ID、mshta.exe、COM、子进程、第二阶段请求、解包和角色启动。

2024 年的 Copia.msi 说明安装器本身也属于证据。它把 STOCKSTAY 与正常 ILSpy 文件混装到 %LOCALAPPDATA%/Programs/SMN/,建立 Run 持久化,并通过第一项界面序列动作打开意大利语涉外交诱饵。GTIG 没有确认意大利选举目标,公开材料只支持涉外交兴趣的疑似投放。MSI 表、自定义动作、内嵌二进制、安装日志、配置和持久化次序应一起保存。

4.2 2025 年 11 月 RAR 直接把模块放进 Startup

2025 年 11 月 6 日,行动者从无人机主题 UKR.NET 账号向约二十个乌克兰目标发送唯一文件分享链接,12 日和 14 日继续投递。链接指向利用 CVE-2025-8088 的恶意 RAR,尝试把快捷方式写到用户选择目录之外的 Startup 位置。GTIG 看到约三成收件人打开邮件,无法确认下载和执行人数。收件、打开、下载、解压越界、Startup 写入、登录启动、角色装配和 WebSocket 会话必须使用各自分母。

这条路线的证明对象是实际处理归档的 WinRAR 程序或库、版本与签名、解压根目录、条目名、解析后输出路径、文件创建、LNK 目标和下次登录。越出解压根的写入支持漏洞利用行为,快捷方式启动目标和角色进程支持持久化与执行。NVD 记录把 7.12 及更早版本列为受影响范围,7.13 进入修复边界;软件资产清单无法替磁盘上的便携副本和嵌入式库完成版本验收。

11 月样本将共用行为拆入外部 DLL:MSViewer.exeMSDriver.exeMSRender.exe 分别承担 cor、net、sys,密码学与混淆、IPC、命令处理位于三份相邻模块。多数样本使用 wss://driverx86-adobe.onrender.com/ws,至少一份使用与 8 月公开控制端仓库同名的 wss://google-ai-labs-it.onrender.com/ws。配置出现、DNS 解析、TLS 建连、WebSocket 升级和任务效果仍是不同证据阶段。

诱饵文档的外部图片请求可以证明某个设备或自动化扫描器取得资源,不能直接证明 RAR 载荷执行。User-Agent、源网络、请求时间、邮件安全产品预取、文档进程和端点效果用于区分。唯一链接在服务保留日志时能连接邮件和请求,仍需要端点材料识别实际使用者。

4.3 一台确认主机和一个失陷域属于不同范围

2023 年末的乌克兰事件提供了最强现场上下文。Turla 控制域控并通过恶意组策略投放 WILDDAY、DIAMONDBACK、KAZUAR、脚本和其他后门,GTIG 后续在一台受该域控影响的主机上确认 STOCKSTAY 执行。公开证据对家族感染的直接结论是一台;域控、GPO 和暂存材料说明管理信任已经失陷,所以身份、受管主机和重投路径必须扩大排查。两种范围要同时写入工单。

该事件中先到达的配置无法用已知候选值解开,替换文件用目标域名成功解密并给出 wss://wool-basalt-clock.glitch.me/ws 与工作日时段。第一份可能属于其他环境、默认包、损坏对象或有意无效材料,公开记录没有选择答案。两份原件、到达次序、摘要和测试输入都要保存,不能让成功的第二份替第一份补出用途。

遭入侵的网站也有双重范围。一条事件记录追查它怎样向下游提供 STOCKSTAY:准确路径、内容摘要、请求、客户端和移除时间;另一条追查合法服务器怎样被控制:凭据、脆弱组件、Web shell、账号、日志和其他载荷。GTIG 证明多台乌克兰服务遭滥用,没有公布每台服务器的根因。本地所有者应按自己的证据确定修复入口。

5 主机效应决定数据暴露能写到哪一步

sys 的公开能力覆盖文件与目录、注册表、进程、截屏、WMI 系统盘点和 ZIP。风险评估不能把整份命令词典当成已执行事实。每项影响都要寻找任务到达、系统调用、结果构造、本地转交和 net 外发的对应证据,再把结论停在最后一个确认阶段。

5.1 文件、屏幕、系统和子进程留下不同残迹

Dir 先枚举路径,Get 可以按文件、目录和扩展名选取内容,在内存中构造 ZIP 后编码返回。磁盘没有归档文件,仍可能存在广泛元数据访问、集中读取、压缩调用、内存增长和随后 net 字节突增。暴露陈述应依次区分“文件名被看到、正文被读取、内容被压缩、响应进入返回链、字节确认离开组织、远端确认取回”。每提升一级都需要新的连接。

Put 采用追加写入,最终文件可能由多条任务逐段形成。记录目的路径、文件 ID、偏移、大小、中间态和最终摘要,再查 RunUnpackArchive 是否消费它。Run 默认等待 60 秒、隐藏窗口并重定向标准输出;子进程可能在等待结束后存活或产生后代。原命令行、工作目录、令牌、签名、模块、网络、输出管道、退出码和完整子孙树决定后续范围。

Image 截取当前桌面,可能包含聊天、远程管理、文档、一次性验证码或可见凭据,即使 sys 没有直接读取对应文件。没有恢复图片时,只能根据用户、会话、活动桌面、显示器、锁屏和前台窗口说明可能可见的内容。Sysinfo 经 WMI 收集系统、硬件、语言、用户、磁盘和进程信息;原始字段集合与发起进程比泛化的“发生 WMI”更能支持环境识别和后续任务判断。

MultyTask 会按顺序提交多项任务并丢弃输出,因此主机产生多项效果时,网络返回通道可能保持安静。注册表、文件、进程和解包时间必须按 cor 与本地消息时段归组,不能用响应正文数量给影响设上限。删除类命令还要分开请求、尝试、成功和残留恢复;缺少先前清单的“文件不存在”不能自动归给恶意删除。

5.2 加密限制内容确认,端点与服务商仍能闭合方向

net 发送的加密对象遮住正文,端点侧仍能看到 sys 读过哪些路径、是否产生内存包、cor 何时协调、net 何时发送多少字节。服务商侧若保留提交与取回时刻、UUID、部署和数据库材料,可以进一步确认方向。只有大小相近而缺少标识与时序时,结论保持“与收集响应一致”;端点内容、帧关系或队列取回闭合后,才能写成确认外发。

截屏、未解密配置和任意子进程会扩大未知范围。法律、通知和恢复团队需要一张按证据阶段写成的影响表;“后门具备窃密能力”无法承担通知范围。每条记录包含对象、主机、用户会话、任务窗口、证据来源、最后确认阶段和仍缺材料,后续服务商或备份证据到来时只升级相应行。

公开受害范围同样受证据约束。GTIG 对乌克兰政府和军事目标拥有较强观察,对至少一个涉欧洲外交兴趣案例有材料;德国、荷兰、意大利和波兰的早期上传可能来自开发、操作、安全产品或研究。2025 年 11 月约二十名收件人和约三成打开率描述邮件阶段,下载和执行保持未知。报告中的每个数字都要保留原分母。

GTIG 以高置信度把 STOCKSTAY 生态及相关活动连到 Turla,以中等置信度评估它与 KAZUAR 可能共享部分开发人员或团队,以低置信度讨论备用通道用途。确认角色、持久化、失陷入口和主机效果即可触发隔离、保全与重建;归因用于战略风险判断和情报共享。

6 响应围绕关系保全、精确切断和信任恢复展开

事件负责人要把邮件、端点、网络、身份和服务商的告警汇入同一张任务单。任务单以设备和登录会话为中心,连接原始交付对象、安装树、角色与模块、配置、持久化、本地消息、主机效果、WebSocket 和服务商对象。每个连接都写明来源、时钟、证据链接、负责人和当前置信度。

6.1 保全顺序服从易失性和人员安全

先记录隔离状态并验证所有出站路径,再在安全允许时采集内存、进程、窗口、模块、句柄和网络归属。加密配置与环境值、感染 UUID、公钥材料、本地消息缓冲和内存 ZIP 都可能在终止进程后消失。运行风险要求立即停止时,记录取舍和失去的证据;绝不能为等待回连而让已确认感染设备继续接触生产网络。

邮件团队保存 MIME、认证、链接、附件、Zone.Identifier 和点击或打开记录;端点团队保存容器、目录树、角色、配置、持久化、内存和效果;网络团队保存 DNS、代理解析、CONNECT、TLS、WebSocket、字节和重连;身份团队保存远程会话、令牌、邮箱规则和特权使用;服务商请求则写明准确账号、仓库、服务、部署、主机名、/ws、UTC 时段和三个 Python 文件摘要。

每个重要连接至少拥有一项时间之外的关系键,例如同一用户会话、父容器、共享目录、UUID、配置、窗口标识、进程父子关系、任务大小或平台部署记录。不同系统时钟保留原值、时区和采集时间,再在派生时间线中校准。只剩时间接近时,关系明确标成待验证。

手绘响应台把 RDP、HTA、RAR 投递物连到 net、cor、sys 设备,并接上 WM_COPYDATA、DNS、wss、SHA-256 证据和被隔离端点。
图 3:一张案件关系图把投递、三个角色、本地消息、主机效果和精确出站交给各自负责人。

6.2 清除角色之前,先确认它们怎样回来

根除清单覆盖 MARKETMAKER、cor/net/sys、外部 DLL、配置、Run、Startup、暂存包、MSI 和部署共享或备份中的可运行副本。删除前保留取证副本。若角色来自 RDP 传入、HTA 下载、WinRAR 越界、MSI、恶意 GPO 或失陷网站,对应入口要在同一事件中修复;否则一台重建主机仍可能从不可信管理面或交付面重新获得组件。

域控案件先恢复管理层级、组策略、复制、远程管理和秘密,再重建受影响端点。失陷邮箱撤销会话、OAuth 授权、转发规则和恢复路径;失陷网站保全镜像、检查账号、Web shell、持久化与其他载荷,再修复有证据支持的原始入口。托管平台保全账号与部署后暂停或修复准确恶意服务,组织侧继续行为追查,避免基础设施换名后失去覆盖。

精确网络控制保留准确主机、路径、端口、时间和进程来源。已确认 C2 与下载 URL 可以进入隔离与历史回查,正常交易所伪装 URL 和整个多租户平台不进入默认封锁。平台级临时控制如果因紧急风险启用,必须记录业务影响、负责人、到期、替代检测和缩小条件。

数据影响评估与根除并行。文件、屏幕、系统、凭据和子进程各自列出确认阶段;配置、控制端和日志缺口各自列出会改变哪个决定。这样,重建可以按控制权丢失立即执行,通知范围则继续随证据升级,两条工作不会互相等待。

7 验收证明角色、会话、入口和主机效应均未恢复

结案条件是一组可以被复查的结果。每项包含查询或测试、数据源、范围、时间、结果、证据链接、负责人和日期。绿色状态必须能打开底层对象并解释其含义;告警暂时安静、域名失效或软件清单显示新版本,都不足以独立关闭事件。

7.1 重启和完整旧运行时段是最低观察窗口

端点先验证隔离真实阻断 DNS、TLS、WebSocket、外连 RDP 和直连替代路径,再确认三个角色、MARKETMAKER、外部 DLL、配置、Run/Startup、窗口集合和已知打包对象全部消失。重建后经过一次重启或登录转换,并至少观察一个完整旧运行时段;查询同时覆盖 09:00—18:00 之外的活动。离线资产和日志留存截止写进结果。

入口验收分别进行。WinRAR 和每份 unrar.dll 按实际路径读取版本与签名,并用无害归档验证不能越出所选目录;RDP 用无害文件验证邮件处理、来源警告、目的地策略、资源重定向和出站控制;HTA 验证应用控制与脚本宿主遥测;MSI、邮箱、失陷网站和域控分别确认恶意对象、账号路径、持久化和管理信任已经修复。

历史追查从最早可能访问前开始,延伸到隔离后,覆盖已知摘要、GTIG 规则簇、配置形态、窗口名、角色关系、外部模块和行为关联。公开规则要在合法保存的正样本与正常 websocket-sharp、WMI、安装器、注册表和屏幕共享负控制上测试,并记录规则文本哈希、引擎、范围、命中偏移和留存。只能发现旧摘要的规则继续标为指标覆盖。

由未参与原分析的人使用保存的邮件、容器、配置输入、端点导出、内存记录、网络与服务商材料重演一次任务。对方应能复现角色分类、投递阶段、服务关系、主机效果和暴露结论。依赖个人记忆、过期看板或不可访问临时文件的连接要补证或降级。

7.2 未知项保留负责人、后果和停止条件

无法解密的配置可能隐藏另一条服务地址;缺失内存可能丢掉 UUID、密钥和本地消息;代理留存不足会阻断准确设备与字节方向;服务商没有快照可能抹掉短暂队列;前台窗口上下文缺失会让截屏内容不明;端点没有 WM_COPYDATA 记录会限制直接 IPC 证明。每项未知写清受影响决定、替代来源、负责人、截止和接受后果。

长期准备度用关系覆盖衡量:多少端点能把非浏览器 WebSocket 归到进程,多少能把同会话 sys 效果接回 cor/net,窗口与内存证据保留多久,邮件、端点、代理和身份时钟能否校准,服务商保全需要多少时间,外部 DLL 与配置是否进入集中搜索。每次无害演练从交付开始走到本地交接和出站,记录在哪一段丢失关联键。

完成验收后,组织应能给出简洁结论:入口已修复,管理与身份信任恢复,角色与依赖没有重现,精确会话被切断,历史追查覆盖已知留存,数据影响写到证据最高阶段,剩余未知已被明确接受或继续追查。这组结果才允许设备和账号重新进入可信边界。

8 附录:会改变身份、范围或动作的技术收据

8.1 样本与规则固定角色边界

行动者自行编译的 websocket-sharp.dll,SHA-256 d1e54270433a94aa3d45d888e4c62299bee3480eb2cb4a5489c7dda69d476c3e,从 2022 年时间线延续到多份 Broker 包。它适合连接开发线,仍需包内语境排除正常 websocket-sharp 软件。2023 年 12 月的第一份公开三角色包固定了分工;2024 MSI 和 2025 MARKETMAKER 包又用不同摘要重复相同角色;11 月外部模块化分支说明角色判断必须包含加载模块和包内关系。

GTIG 的 G_Downloader_STOCKSTAY_MARKETMAKER_1 将持久化、下载、解包和代理发现放在同一方法簇;G_Controller_STOCKSTAY_STOCKMARKET_1 用协议方法、定时回调和 SQLite 字符串定位 cor;G_Tunneler_STOCKSTAY_STOCKBROKER_1 把 WebSocket 与 wmCopyData 交接放在一起;STOCKTRADER 规则使用命令处理函数与 FNV1a 模式定位 sys。规则是静态身份证据,执行与影响仍由端点遥测确认。

公开页面存在一处必须保留的角色矛盾:G_Backdoor_STOCKSTAY_STOCKTRADER_3 元数据写入 SHA-256 82707cfdf24dcb762f4615f01e1ba4d3dfdec4abe9cd588558d2634d7e6a5eeb,同一摘要在 GTIG 的 2024 年 2 月物证表中被列为 StockMarketView.exe 调度器。响应人员应以处理函数簇、本地偏移和独立取得的 worker 摘要承担角色判断,在来源澄清前不能把该摘要直接改写成 STOCKTRADER 身份。

面向受害端的 Python 控制文件摘要分别为:server.py f04f43b6f7c2d86109c495179b497f7fb45fd95816623de1b77900f71b4f99edmodels.py 7615140f78d9a0ce31cc9fe8c54c60028a7439cb32526fd97b10afef7145dd78wtools.py b55f3b8a7334af049ba3f70a9ad3fe78574b1e180c68baf9a7110d104387a636。当前没有仍可固定的公开 commit、分支和源码树;恢复副本先与三个摘要比较,再引用副本自己的行号。现阶段可信定位停在 /ws、四个 Tornado 处理函数和两张 SQLite 表。

8.2 家族史和归因只承担范围判断

公开时间线从 2022 年编译库、2023 年单体和三角色拆分,延伸到 2024 年环境绑定与 MSI、2025 年 RDP/HTA/RAR 投递、K1MORPHER 和外部模块。它说明角色关系比文件名耐久,也说明旧明文形态与新混淆形态可以并存。没有行动者维护的语义版本或完整发布清单,本地报告应写具体摘要、角色、依赖、配置、采集来源和时间。

GTIG 以高置信度把观察到的 STOCKSTAY 生态和相关活动归到 Turla;与 KAZUAR 部分共用开发者或团队的判断为中等置信度;备用或替代通道用途为低置信度。Windows-1251、公开 Squirrel3 算法、诱饵主题和单个多租户域各自权重有限,共同部署、专有工具上下文、实现重合和事件链提高综合分量。CISA 对 Snake 与俄罗斯联邦安全局第 16 中心的政府归因提供行动者背景,不能替代 STOCKSTAY 样本和事件证据。

这份报告最终保留一条运营结论:交付对象、cor、sys、net、/ws 中继和原始信任面属于同一项处置任务。文件名、哈希、域名、规则、家族史和归因都服务于这条关系;任何新材料只有在改变角色归属、事件范围、响应动作或验收结果时,才进入主文。

研究记录

9证据、对象与来源

下面保留本文实际使用的标识、时间和原始材料,便于继续调查。

9.1可检索观测值

来自引用材料或本次调查的值,并附有使用这些值所需的上下文。

类型说明操作
SHA-256d1e54270433a94aa3d45d888e4c62299bee3480eb2cb4a5489c7dda69d476c3e行动者自行编译、在多个 STOCKBROKER 包中反复出现的 websocket-sharp.dll;判定仍须结合打包上下文。
SHA-25645bb8d1ab2c13bf4354294e13d3c9be15de625d807301905b98462f43f93e893GTIG 公布的 ViewPdf.exe / STOCKMARKET 样本。
SHA-25680f6c010fd260d0bcf18a4b6a8d62505adbed50d2e615ed9522c4bfd61c00661GTIG 公布的 ClientMNGR.exe / STOCKBROKER 样本。
SHA-25655249f296b63a8bcf911b8bc96de43c1ac2b4a56c150a19d33d892a47e57352cGTIG 公布的 ConverterDDSNet.exe / STOCKTRADER 样本。

9.2研究对象

报告涉及的产品、行为者、技术、受影响对象和控制点。

WebSocket 地址wss://wool-basalt-clock.glitch.me/ws

见于 2024 年 1 月与 2 月配置。

WebSocket 地址wss://weatherdataai.theworkpc.com/ws

见于 2025 年 3 至 4 月 RDP 钓鱼行动。

WebSocket 地址wss://canal1zac1a.onrender.com/ws

见于 2025 年 HTA 或 MSI 相关材料,需按时间与进程上下文验证。

WebSocket 地址wss://driverx86-adobe.onrender.com/ws

2025 年 11 月钓鱼波次多数样本使用。

WebSocket 地址wss://google-ai-labs-it.onrender.com/ws

与公开控制端仓库名相连,至少一份 11 月样本使用。

进程间通信WM_COPYDATA (0x004A)

STOCKSTAY 角色滥用的普通 Windows IPC;须结合进程、窗口、会话与家族材料。

9.3事件时间

  1. 传输库构建反复出现

    后来被多个 STOCKBROKER 样本打包的行动者版 websocket-sharp.dll 带着这个修改时间。

  2. 单体版本被提交

    StockMarketNews.exe 仍把核心行为放在一个程序里,并展示股票主题界面。

  3. 三个角色出现

    从荷兰提交的压缩包包含独立 Market、Broker 与 Trader 程序。

  4. 侦察后部署与意大利诱饵

    乌克兰事件使用域名绑定配置;意大利提交的 MSI 共用 C2,并展示涉外交主题页面。

  5. RDP 钓鱼投放 MARKETMAKER

    失陷大学邮箱和行动者 RDP 服务之后,载荷从遭入侵的乌克兰政府网站下载。

  6. K1MORPHER、HTA 与公共服务

    混淆代码与 KAZUAR 重合,计算器和 MSI 包继续沿用三角色设计。

  7. WinRAR 路径穿越与外部模块

    唯一链接送达 RAR,内含 Startup 快捷方式、模块化 DLL、诱饵与两条 Render C2。

  8. GTIG 公布完整重建

    报告串起开发历史、行动、控制端、归因、指标和 YARA。

  9. SOSEC 验证三角色响应路径

    SOSEC 将已观察投递路线、cor/net/sys 角色、主机效应与中继证据整理成同一响应和验收任务,并逐项保留公开证据边界。

9.4来源与材料

  1. Google 威胁情报组:STOCKSTAY Another Dayhttps://cloud.google.com/blog/topics/threat-intelligence/stockstay-turla-intelligence-gathering
  2. Google 威胁情报:STOCKSTAY IOC 集合https://www.virustotal.com/gui/collection/ed88a43801b5c58b9be27fa74abaa278a48904f3cc1bc905f2d85e32448b96c5/iocs
  3. websocket-sharp:固定版本上游源码树https://github.com/sta/websocket-sharp/tree/42704061c92cd5ce56cf6f4c695f5303b27e1027
  4. Microsoft:WM_COPYDATA 消息https://learn.microsoft.com/en-us/windows/win32/dataxchg/wm-copydata
  5. Microsoft:COPYDATASTRUCThttps://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-copydatastruct
  6. Microsoft:打开 RDP 文件时的安全警告https://learn.microsoft.com/en-us/windows-server/remote/remote-desktop-services/remotepc/understanding-security-warnings
  7. NVD:CVE-2025-8088https://nvd.nist.gov/vuln/detail/CVE-2025-8088
  8. Tornado:WebSocketHandler 文档https://www.tornadoweb.org/en/stable/websocket.html
  9. Render:WebSocket 文档https://render.com/docs/websocket
  10. SQLite:DELETE 语句https://www.sqlite.org/lang_delete.html
  11. Microsoft:Windows Management Instrumentationhttps://learn.microsoft.com/en-us/windows/win32/wmisdk/wmi-start-page
  12. Microsoft:Run 与 RunOnce 注册表键https://learn.microsoft.com/en-us/windows/win32/setupapi/run-and-runonce-registry-keys
  13. MITRE ATT&CK:AppDomainManagerhttps://attack.mitre.org/techniques/T1574/014/
  14. Google:政府背景攻击者警告https://support.google.com/mail/answer/2591015
  15. CISA 与合作机构:追猎俄罗斯情报 Snake 恶意软件https://www.cisa.gov/sites/default/files/2023-05/aa23-129a_snake_malware_2.pdf
  16. Microsoft 威胁情报:KAZUAR 架构https://www.microsoft.com/en-us/security/blog/2026/05/14/kazuar-anatomy-of-a-nation-state-botnet/
  17. Microsoft:威胁行动者命名与 Secret Blizzard 别名https://learn.microsoft.com/en-us/unified-secops/microsoft-threat-actor-naming