文章总结: 朝鲜Lazarus分支TraderTraitor利用假面试进行定向水坑攻击,通过仿冒Terraformprovider投毒,在DevOps工程师电脑上落地FLATROOF和ROOFDECK双后门,窃取云凭证并入侵AWS/GCP。两起案例均以能触达云的笔记本为目标,攻击链完整且工具可复用。建议将云权限工程师列为敏感组监控,禁止用公司电脑参加外部面试,并核查terraform锁文件中的provider域名。
综合评分: 88
文章分类: 恶意软件,威胁情报,红队,渗透测试,供应链安全
定向水坑攻击:朝鲜黑客盗取加密货币的技术分析
原创
APT-101
APT-101
APT-101
2026年9月22日 18:40
陕西
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
本文综合 SentinelOne Labs 2026-09-18 报告《Don’t Call Us, We’ll Call Your APIs|TraderTraitor Backdoors Resurface on Victim With No Crypto Ties》(作者 A. Priego / A. Delamotte / M. Havranek,致谢 Google 与 Mandiant 提供技术细节)与 LayerZero Labs 官方事件报告(layerzero.network)。
01 一次面试,一条命令
招聘消息发来一个 GitHub 链接,说是面试编码题,让求职者跑一下。求职者照着做,terraform init执行完,恶意代码已经在电脑上跑起来了。
水坑攻击(watering hole)是网络攻击里的一种投放方式:攻击者不动目标本身,在目标经常去的地方下毒。经典做法是攻陷目标常访问的网站,往页面里塞恶意代码,等目标自己上门。名字来自自然界——猎人不追猎物,在猎物必经的水坑边守着。
本案例用的是水坑的定向变体。钓点不是网页,是一次假面试:攻击者造一个”面试编码项目”放到求职者手上,等求职者自己打开、自己执行。上一节的画像标准在这里生效——被选中的人,是碰云的人。
这不是假设。2026 年 4 月,LayerZero Labs 披露被入侵,2.92 亿美元从 KelpDAO 被转走(LayerZero 官方事件报告,A 级)。第一步,是一名员工在公司电脑上跑了”面试编码项目”。9 月 18 日,SentinelOne 公开了后续:同一对后门,又在一家与加密货币毫无关系的印度 IT 公司出现。
02 两起事件,同一对后门
KelpDAO 是支持以太坊再质押的 DeFi 协议,LayerZero Labs 提供区块链间跨链资产交换。攻击者拿下 LayerZero 后,编造了一次假铸币事件,配合对验证服务器的 DDoS,让被控服务器批准了非法铸币——2.92 亿美元。
入侵工具是一对 macOS 后门:FLATROOF 和 ROOFDECK,Rust 写的 ARM64 程序,伪装成 SystemUpdate 和 iSync。归属朝鲜 Lazarus 分支 TraderTraitor(也叫 UNC4899、PUKCHONG、Jade Sleet),整个 2026 年都在盯做加密货币交易的组织。
SentinelOne 顺着 telemetry 找到第二个受害者:印度一家 IT 服务公司,与加密无关,一台 Apple Silicon MacBook,属于一位 DevOps 工程师。这台机器几乎每天用 Terraform 和 Ansible 操作 AWS、OVH、OpenStack,装着云凭证和源码访问权限——和 LayerZero 报告里的”Developer1″几乎一样。
03 攻击链:七步,从画像到撤退
两起事件的证据能拼成一条完整攻击链。每步都来自报告可核实的内容;推测处单独标注。
先看全貌:
① 画像选人 ──► ② 假面试接触 ──► ③ 投毒诱饵交付 ──► ④ 执行落地│ GitHub 画像 Contagious lockfile 指向 terraform init│ DevOps/FinTech Interview 话术 仿冒 registry → 恶意 provider 执行│ (hashicorp-aws[.] Cursor 12s 拉起双后门│ com 等 3 个) 剥 quarantine 绕 GK │ ▼ ⑤ 持久化与静默 LaunchAgent(RunAtLoad) 仅随 IDE beacon │ ▼⑥ 侦察/收割/横移 ◄────────────────────────────────────────────────────► ⑦ 换版与撤退keychain 原文/命令历史/浏览器/剪贴板 │ 4·20 换 stripped 版find/zip(AES) 打包 ──► Telegram 外传 │ rm -f 自删旧件API 密钥 ──► AWS/GCP 提权 │ 6 月收手(目标无价值)
上面的链是时间顺序:①到③是攻击者的准备与接触,④落地,⑤维持,⑥收割,⑦退出。①③是入场(社工+供应链),④是突破点(一次代码执行),⑥是收益点(凭证→云),⑦是离场。下面是逐步详解。
- 画像选人。 攻击者从公开渠道挑人。被选中的求职者,GitHub 画像几乎都是 DevOps 或加密/金融科技工程背景。攻击者看的是岗位:谁的电脑能触到云,谁就进候选。报告原文的说法是,目标的价值就是这台笔记本能到达的一切。报告发现多个假项目名(Northwind、Novacart),是假公司还是冒真实公司之名,作者确认不了(C 级)。
- 假面试接触。 假招聘者用 Contagious Interview 的套路联系求职者,这是 DPRK 行动者的老手法。ESET 2026 年初披露,Lazarus 拿同一套东西打过西班牙一家航天公司。
- 投毒诱饵交付。 GitHub 上挂着伪装成目标公司基础设施项目的仓库:gtn-candidate-repo、Northwind-IAC、novacart-interview、terraform-candidate-repo。仓库里带一个被改过的 .terraform.lock.hcl,provider 指向攻击者控制的仿冒域名,共三个:registry.hashicorp-aws[.]com、registry.hashicorp-aws[.]io、registry.hashicorp-terraform[.]io。
锁文件是 Terraform 的供应链信任依据:记录 provider 从哪下载、校验和是多少。受害者执行terraform init,Terraform 以锁文件为准,从仿冒域名把恶意 provider 模块拉下来执行。代码层面查不出问题:锁文件决定依赖从哪里下载,恶意不在代码内容里,在依赖解析环节。
-
执行落地。LayerZero 案例里,员工在公司工作站上装了项目,两个后门随即落地。新受害者这边,3 月 18 日后门已在磁盘,交付方式不可证(C 级);3 月 29 日 05:00:41,工程师用 Cursor 打开自己的工作区 cloudshield,12 秒后,Cursor 以nohup启动了 SystemUpdate 和 iSync(都带伪装参数–type=renderer)。iSync 启动后先被剥掉 quarantine 属性、再 chmod 加执行位——绕 Gatekeeper,无签名校验、无用户提示。
-
持久化与静默。ROOFDECK 写一条 LaunchAgents plist(LoginWindow.plist,运行时插入应用标识符,–type=renderer+ RunAtLoad)。静默策略按真实使用节奏设计:后门只在 Cursor 运行时 beacon,IDE 一关就安静。3 月 30 日到 4 月 19 日,稳定如此。
-
侦察、收割、横移。FLATROOF 带一个 Python 收割模块:浏览器数据(Chrome/Brave/Firefox/Safari)、终端命令历史、已装应用清单、进程快照(ps aux)、软硬件配置(system_profiler)、login.keychain-db 原文拷贝——打包走 Telegram 机器人接口外传。ROOFDECK 用 find 按模式搜高价值文件、clipboard 读改写(含把复制的加密地址换成攻击者地址)、zip 带 AES 打包外传。LayerZero 案例里,攻击者靠这套拿走了组织 API 密钥,提权进了 AWS 和 GCP。
-
换版与撤退。4 月 20 日,即 LayerZero 公开声明的次日,攻击者从 85[.]137.56.10 拉来新版 ROOFDECK(剥离符号、伪装 loginwindow),随后删掉两个旧后门(rm -f 反取证)。是否针对公开发声反应,作者明示只能推测(C 级)。新版 beacon 到 6 月 1 日(grenight[.]com / 85[.]137.56.245);6 月 17 日,loginwindow 被扔进废纸篓。SentinelOne 判断:目标太小,榨不出价值,攻击者收手。
04 技术深潜:两个后门的关键设计
分工一句话:FLATROOF 负责初装收割、拉起下一个;ROOFDECK 是常驻主后门,侦察、横移、外传都在它身上。
FLATROOF(伪装 SystemUpdate):启动即剥掉 ROOFDECK 的 quarantine 属性并 chmod 加执行位——绕 Gatekeeper,无签名校验、无用户提示。自带 Python 收割模块,经 Telegram 机器人接口外传四类数据:浏览器数据、命令历史、系统信息与进程快照、login.keychain-db 原文。
ROOFDECK(伪装 iSync)的四个关键设计:
C2 藏进社交网络:从 api.nostr.watch 拉在线 relay,按配置里的 pubkey 找操作者的 Nostr 资料页,把资料页的”网站”字段当 C2 地址——没有固定域名,地址随资料页可改;
命令验签:每条命令由操作者私钥签名,植入内嵌公钥 RSA-2048 验签后才执行(EncryptedCommand → AgentCommand)。命令面签名在 macOS 恶意软件里少见;
双通道 + 备援:主通道 HTTPS /app_version(内嵌自签证书——mkcert 默认元数据泄露了 Linux QEMU 虚拟机和用户名 ub,这条元数据串出 18 个关联域名);备选 WebSocket pipe-airway;recovery_url 与 Pastebin 死信再做一层备援;
静默与反取证:beacon 只在 IDE 运行时发生;4 月 20 日换成剥离符号的版本并自删旧件;config 命令支持运行期把 C2 重指向。
采集面(收割清单):shell 历史(常含明文口令)、keychain 原文、浏览器会话、剪贴板(2FA/助记词);find 按模式定位高价值文件,zip 带 AES 打包外传。
逻辑图(交付 → 落地 → 收割 → 通信):
[投毒交付] .terraform.lock.hcl -> terraform init -> 恶意 provider | v [落地] FLATROOF(SystemUpdate) --剥quarantine+chmod--> ROOFDECK(iSync) | | [初装收割] 浏览器 / keychain / 历史 / 进程快照 |--- 静默: 仅随 IDE 运行 | |--- 配置: ~/.config/.repl_history +------ Telegram 外传 <------------+--- 采集: find/zip(AES) /clipboard/rssh/PTY [C2 地址] Nostr 资料页(website 字段) [命令下发] /app_version(HTTPS) + RSA 验签
05 两起案例放在一起看
把两起案例的目标放在一起比,差别只在行业:LayerZero Labs 是加密基础设施服务商,印度这家公司是 IT 服务商,与加密无关。共同点更显眼——被入侵的都是同一种终端:DevOps 工程师的笔记本,上面有云凭证和源码访问。
LayerZero 报告里,这名工程师的角色叫 Developer1;新案例里是一位每天用 Terraform 和 Ansible 操作 AWS、OVH、OpenStack 的工程师。报告有一句原文:目标的价值是什么,取决于这台笔记本能到达哪里(the value of the target is whatever their laptop can reach)。
从后门的收割清单也能倒推攻击者要什么。shell 历史里常带明文口令;login.keychain-db 是钥匙串原文;浏览器数据里有会话和自动填充;剪贴板偶尔会经过 2FA 和助记词。收割模块把这四类全打包了——全是凭证类资产。凭证能触到云,入侵跟着进云。LayerZero 案例里,攻击者拿到 API 密钥后确实提权进了 AWS 和 GCP。
个体差异也存在。这家印度公司太小,攻击者判断撑不起继续投入,撤了。同一套工具落在有价值的目标手里会是另一种结果——报告单独写这一次事件,要说明的正是这一点:这套工具并不只为加密目标准备的。
06 对策:防御落点与三组信号
组织侧:
- 把有云权限和源码访问的工程师列为敏感组,单独监控;
- 盯三类信号:home 目录下未签名的二进制、IDE 子进程里未签名的组件、从这两个进程发出的对外连接;
- 明令禁止用公司电脑参加外部面试;面试 take-home、陌生人发的仓库,一律报备后再碰;
- 安全培训补一课:招聘者是攻击面,目标就是员工本人。报告里一位候选人交付时删掉了伪造的 provider 并留言说明——他做对了,个人判断在这里是实际兜底。
开发者侧:
跑任何带.terraform.lock.hcl的项目前,先看 provider 域名:不是 registry.terraform.io 官方域名的,一律当恶意处理;
- 官方仓库上也出现过恶意包,锁文件带进来的东西,来源要查;
- 锁文件不只在面试题里——外包交付的代码、同事转发的 demo、网上教程带下来的项目,来源不明的都先查 provider 域名再跑。
07 收束
回到开头:一次面试邀约,一个开源项目,一条 terraform 命令。两起案例的入口相同——不是边界设备被攻破,是开发终端上执行了一次来源不明的代码。
防御的位置也随之确定:谁能在这台终端上执行代码,谁就该被监控;执行了什么,要有记录和告警。报告给的三组信号——home 目录未签名二进制、IDE 子进程未签名组件、两者发出的对外连接——是这层监控的起点。
留个问题给你:你们团队会审核面试题里的terraform init吗?评论区聊聊你的审查流程。
认同这篇的判断,点个「在看」;转给身边做云和 DevOps 的同事,下次有人发项目来”先跑一下”,他们会看一眼锁文件。
APT#供应链安全#开发者安全#macOS#面试钓鱼
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:APT-101 APT-101
APT-101《定向水坑攻击:朝鲜黑客盗取加密货币的技术分析》