供应链安全威胁档案周报——W46
原创 威胁情报中心 2026-11-13 18:10 北京

本周 4 起事件分别落在 npm 与桌面端发布、GitHub Actions、PyPI 软件包和第三方云信任。攻击者直接复用合法 CI、被盗 Token 与既有 IAM 角色,因此版本核对之外,还需审查发布提交、生命周期脚本、跨账号角色和凭证暴露范围。
SUPPLY CHAIN / THREAT FILES
W46 2026 | 供应链安全 每周开源供应链安全情报整理 |
04 重点事件 | 04 类攻击面 | 07 天风险切片 |
EDITOR'S NOTE / 本周核心判断
真实签名与合法身份不等于安全,发布凭证和信任关系都必须持续验证。
本周 4 起事件分别落在 npm 与桌面端发布、GitHub Actions、PyPI 软件包和第三方云信任。攻击者直接复用合法 CI、被盗 Token 与既有 IAM 角色,因此版本核对之外,还需审查发布提交、生命周期脚本、跨账号角色和凭证暴露范围。
ATTACK SURFACE MAP
四类攻击面地图
01 / FILE 01 包发布与桌面更新 恶意版本、生命周期脚本与节点钱包 | 02 / FILE 02 仓库与 CI/CD GitHub Token、Actions 与云端密钥 |
03 / FILE 03 Python 包与钱包 恶意版本、初始化钩子与链上转账 | 04 / FILE 04 第三方云信任 跨账号角色、AssumeRole 与数据外渗 |
+ / ALL FILES 共同防护重点 验证版本、提交、签名与信任配置 | ! / ALL FILES 本期处置主线 清除载荷、轮换凭证并审计暴露范围 |
阅读方式:A 看情报与影响,B 按痕迹排查,C 按顺序处置。执行文中命令前请结合业务环境核验。
| FILE / 01 | 2026.11.09 |
NPM RELEASE + DESKTOP UPDATE
@ethersphere/bee-js 13.3.0 + Swarm Desktop 0.56.2 供应链投毒事件
Ethersphere 发布管道遭入侵,恶意 npm 包与桌面客户端经合法 CI 构建、签名并触达依赖项目和节点用户。
bee-js / Swarm Desktop / CI 发布
A情报概要SIGNAL / INTELLIGENCE
披露时间:2026年11月09日 / PUBLIC DISCLOSURE
■ 情报来源: / SOURCE REGISTER
| 01 | socket.dev |
| 02 | safedep.io |
| 03 | www.stepsecurity.io https://www.stepsecurity.io/blog/ethersphere-bee-js-13-3-0-compromise |
■ 相关信息: / WHAT HAPPENED
2026年11月9日,Ethersphere发布管道遭入侵,两个GitHub账号被控,攻击者借合法CI发布恶意@ethersphere/bee-js 13.3.0和Swarm Desktop 0.56.2。前者将版本生成脚本改为postinstall远程加载器,从api.frameworkmetrics.xyz获取并执行JavaScript,约75分钟后下架;后者由项目自身CI构建、签名和公证,经自动更新推送给macOS和Windows用户,约8.5小时后移除。加载器与SleepyDuck/EtherDuck共享以太坊合约C2、钱包和第三阶段植入,第二阶段窃取Bee节点config.yaml及swarm.key,第三阶段在macOS和Linux安装solidity持久化Go后门,在Windows静默部署ScreenConnect。SLSA来源证明真实但仅证明构建位置,不能证明源码已审。建议排查相关版本和持久化痕迹,轮换凭据并转移节点钱包资产;维护者应校验发布提交位于受保护分支,并保护发布环境与签名材料。
■ 遭受投毒/有被投毒风险的供应商: / AFFECTED ECOSYSTEM
本次供应链投毒事件里,遭受直接投毒的供应商为 Ethersphere,攻击者攻陷其项目发布机器人账号,向 npm 发布恶意版本 @ethersphere/bee-js@13.3.0,同时放出植入恶意载荷的 Swarm Desktop 0.56.2;所有依赖该 SDK 的上游周边组件(swarm‑cli、bee‑dashboard 等)以及拉取该版本的 npm 依赖链、CI/CD 流水线都属于存在被投毒风险的供应链分支,只要在风险时间窗口内解析、安装并执行了该恶意包或启动过该版本桌面客户端,就有可能触发恶意加载逻辑,进而让使用这些组件的开发者、节点运营者成为受害者。
B落地分析建议TRACE / INVESTIGATION
01风险前提
—npm/yarn/pnpm 开启生命周期脚本(postinstall),在2026‑11‑09 00:09 ~ 01:24 UTC时间窗口执行过@ethersphere/bee-js@13.3.0安装;
—安装 / 自动升级运行过 Swarm Desktop 0.56.2;
—即使 npm 安装报错失败,加载器网络请求依然可能执行,不能以安装成功与否作为未被入侵依据。
02检查 npm 项目环境
01检查 lock 文件是否解析出恶意版本
查找版本号:13.3.0,出现即代表依赖解析到恶意版本。
VERIFY / 排查命令
# npm项目
grep "@ethersphere/bee-js" package‑lock.json
# pnpm项目
grep "@ethersphere/bee‑js" pnpm‑lock.yaml
# yarn
grep "@ethersphere/bee‑js" yarn.lock
02检查本机全局 npm 安装
VERIFY / 排查命令
npm list -g @ethersphere/bee-js
03检查 npm 缓存
查看缓存中是否存在bee‑js‑13.3.0.tgz,存在需要清理缓存。
VERIFY / 排查命令
npm cache ls | grep bee‑js
04检查 npm 日志,确认 postinstall 脚本是否运行
npm 调试日志目录:
—Linux/macOS:~/.npm/_logs/
—Windows:%APPDATA%\npm‑cache\_logs\
搜索日志关键词: postinstall: node scripts/generate‑version.cjs、FrameworkMetrics analytics v2.3.1 is up to date,出现代表第一阶段加载器已经执行。
注意:部分包管理器默认关闭脚本(npm12+、pnpm10+、Bun),不会执行 postinstall;旧版本 npm/yarn classic 默认执行脚本。
03Swarm Desktop 用户检查
01查看应用版本:设置界面查看版本号,如果是 0.56.2,已经处于高风险;
02查看应用日志:
—Linux:~/.local/share/Swarm Desktop/bee‑desktop.log
—macOS:~/Library/Application Support/Swarm Desktop/bee‑desktop.log
—Windows:%LOCALAPPDATA%\Swarm Desktop\bee‑desktop.log 日志中出现 Bee Desktop version: 0.56.2 (production) 代表该恶意版本至少启动过一次。
04系统文件:检查后门持久化痕迹
01Linux 系统检查
a)检查后门目录
若存在 linux_amd64 / linux_arm64、.run.py 则确认后门文件落地。
VERIFY / 排查命令
ls -la ~/.solidity/
b)检查 systemd 用户服务持久化项
VERIFY / 排查命令
ls -la ~/.config/systemd/user/solidity‑langsupport‑runner.service
# 查看服务状态
systemctl --user status solidity‑langsupport‑runner.service
02macOS 系统检查
a)检查后门目录
存在darwin_arm64/darwin_amd64、.run.py / .run.cjs 为恶意文件。
VERIFY / 排查命令
ls -la ~/.solidity/
b)检查 LaunchAgent 持久化
VERIFY / 排查命令
ls -la ~/Library/LaunchAgents/com.solidity.langsupport.runner.plist
# 查看是否加载
launchctl list | grep solidity
03Windows 系统检查
a)检查临时目录恶意暂存文件:查找文件名前缀.stuffed‑ 。路径:%TEMP%
b)检查隐藏后门目录:%LOCALAPPDATA%\.<32位十六进制GUID>\
c)检查恶意 ScreenConnect 服务
VERIFY / 排查命令
Get‑Service | Where‑Object Name‑match "ScreenConnect Client \(5cbe79c9c25524df\)"
d)检查 UAC 劫持相关注册表
若 HKCU\Software\Classes\CLSID\{GUID}\InprocServer32 指向%TEMP%\uac39‑* 路径为入侵痕迹。
05检查网络连接和安全日志
在 DNS、代理、防火墙、EDR 或上网行为管理日志中搜索:
—api.frameworkmetrics.xyz,尤其是 /v1/analytics、/v1/electron、/v1/swarm/report。
—193.57.9.155:4912:文档记录的后门控制地址。
—185.232.84.169:8041:Windows ScreenConnect 中继地址。
—与 rpc.ankr.com、cloudflare-eth.com 等公共以太坊 RPC 的异常进程通信。
当前连接可作为辅助检查,但不能替代历史日志,因为后门会休眠,控制地址也可能变化。
06判断钱包和其他凭据是否暴露
检查 Swarm Desktop 数据目录中是否曾存在:
—config.yaml
—data-dir/keys/swarm.key
如果恶意代码执行期间这两个文件存在,应直接认定钱包密钥及密码已经泄露。同时梳理该用户或 CI 任务可访问的 GitHub、npm、SSH、云平台、代码签名和部署凭据,列入轮换范围。
C处置建议ACTION / RESPONSE
01应急隔离
01断网隔离:立即断开有线 / 无线网络,阻断 C2 通信,防止攻击者下发更多插件、窃取数据或内网横向移动。
02保留现场:不要立即重启或删除文件,先备份可疑文件、进程内存 dump,便于后续溯源。
02清除系统持久化后门
01Linux
EXECUTE / 处置命令
# 停止并删除systemd服务
systemctl --user stop solidity‑langsupport‑runner.service
systemctl --user disable solidity‑langsupport‑runner.service
rm -f ~/.config/systemd/user/solidity‑langsupport‑runner.service
systemctl --user daemon‑reload
# 删除后门文件目录
rm -rf ~/.solidity
02macOS
EXECUTE / 处置命令
# 停止launchagent
launchctl unload ~/Library/LaunchAgents/com.solidity.langsupport.runner.plist
rm -f ~/Library/LaunchAgents/com.solidity.langsupport.runner.plist
rm -rf ~/.solidity
03Windows(PowerShell 管理员)
EXECUTE / 处置命令
# 停止删除恶意ScreenConnect服务
Stop‑Service -Name "ScreenConnect Client (5cbe79c9c25524df)" -ErrorAction SilentlyContinue
sc.exe delete "ScreenConnect Client (5cbe79c9c25524df)"
# 删除临时文件
Remove‑Item $env:TEMP\.stuffed‑* -Recurse -Force -ErrorAction SilentlyContinue
Remove‑Item $env:TEMP\uac39‑* -Recurse -Force -ErrorAction SilentlyContinue
# 遍历删除%LOCALAPPDATA%下的隐藏GUID文件夹
Get‑ChildItem $env:LOCALAPPDATA -Directory -Force | Where‑Object {$_.Name‑match "^\.[0‑9a‑f]{32}$"} | Remove‑Item -Recurse -Force
03钱包资产处置
攻击者会窃取:config.yaml(可能明文保存钱包密码) + swarm.key(以太坊 V3 加密密钥库)。
—不要继续使用原有 swarm.key 密钥,应视为已经泄露;
—在一台确认干净、未被入侵的机器生成全新 Swarm 钱包密钥;
—将原有节点 xDAI、xBZZ、stake、chequebook 资金全部迁移至新钱包;
—旧密钥彻底废弃,不要复用密码。
04清理项目依赖,锁定安全版本
删除项目node_modules、lock 文件,清理 npm 缓存:
EXECUTE / 处置命令
npm cache clean --force
rm -rf node_modules package‑lock.json
修改 package.json,固定@ethersphere/bee-js版本为安全版本13.2.0,禁止解析 13.3.0。
EXECUTE / 处置命令
"@ethersphere/bee-js":"13.2.0"
05凭证轮换
受入侵机器上所有密钥全部视为泄露:
—用户本地 ssh 密钥、API 密钥、云服务商 access key;
—CI 机器:轮换 OIDC 权限、github personal token、各类 CI secrets;
必须在一台干净机器生成新凭证,不能在被攻陷主机生成新密钥。
06系统重建建议
存在 stage‑3 完整远控 shell,攻击者已经获取本机用户权限。最高安全实践:备份业务文档,重装操作系统。单纯删除 IOC 不能 100% 排除攻击者其他潜伏手段。
07CI / 流水线专项处置
01CI 机器如果在受影响时间执行过安装,CI Runner 视为被攻陷;CI 的 OIDC token 权限可能泄露;
02清除 CI 缓存的 node_modules;轮换全部 CI secrets、OIDC 角色信任条件;
03在 CI 开启脚本阻断,限制 npm 生命周期脚本执行;
04检查 CI 日志是否出现FrameworkMetrics analytics v2.3.1 is up to date特征字符串,出现代表 CI 流水线已经运行恶意载荷。
END OF FILE 01 / 04
| FILE / 02 | 2026.11.12 |
GITHUB ACTIONS + SECRET THEFT
WFX‑Phantom(wfx‑loot)攻击
攻击者利用被盗 GitHub Token 植入 wfx 脚本,通过 Actions 与 npm postinstall 窃取云端和开发机凭证。
WFX-Phantom / GitHub Actions / 密钥窃取
A情报概要SIGNAL / INTELLIGENCE
披露时间:2026年11月12日 / PUBLIC DISCLOSURE
■ 情报来源: / SOURCE REGISTER
| 01 | www.aikido.dev |
| 02 | safedep.io https://safedep.io/blog/github-actions-wfx-credential-stealer |
| 03 | www.stepsecurity.io https://www.stepsecurity.io/blog/wfx-phantom-the-github-actions-secret-stealer |
■ 相关信息: / WHAT HAPPENED
WFX‑Phantom 是 2026‑11‑10 爆发的 GitHub Actions 密钥窃取攻击,攻击者利用被盗 GitHub Token 向仓库植入约 1500 行 shell 恶意脚本wfx。攻击存在npm postinstall 钩子传播路径:恶意package.json增加postinstall脚本,执行隐藏脚本.ci‑xxxxxx.sh,开发者本地执行npm install就会在本机运行恶意载荷,并非仅危害 CI 服务器。恶意程序会读取内存、环境变量、各类凭证文件(SSH、云密钥、AI API 密钥、kubeconfig、Vault 凭证、shell 历史等)并外泄,还会配置云平台持久化后门,即便密钥轮换后门依旧有效。
■ 遭受投毒/有被投毒风险的供应商: / AFFECTED ECOSYSTEM
GitHub 是一个在线软件源代码托管服务平台,用于公开程序或软件的代码。使用Git作为版本控制软件,由开发者克里斯·汪斯崔斯(Chris Wanstrath)、P·J·海特(P. J. Hyett)和汤姆·普雷斯顿·沃纳(Thomas Preston-Werner)使用Ruby on Rails编写而成。在2018年,GitHub被微软公司收购。截至2022年6月,GitHub已经有超过5700万注册用户和1.9亿代码库(包括至少2800万开源代码库),事实上已经成为了世界上最大的代码托管网站和开源社区。截至2023年1月26日,已经有超过1亿开发人员使用GitHub。
GitHub Actions 是 GitHub 提供的一种自动化工具,用于在 GitHub 代码仓库中实现软件开发工作流程的自动化。它支持持续集成和持续部署(CI/CD),能够帮助开发者自动化构建、测试和部署代码。通过 GitHub Actions,开发者可以编写一系列的工作流程(workflows),这些工作流程由一个或多个任务(jobs)组成,每个任务又可以包含一个或多个步骤(steps)。
B落地分析建议TRACE / INVESTIGATION
01风险前提
在受攻击时间窗口(2026‑11‑10 UTC 之后)拉取过被入侵仓库代码,并且在仓库目录执行过npm install / npm ci,才存在本机被感染风险;单纯git clone不执行安装命令不会触发恶意脚本执行。
02排查是否拉取过受污染代码仓库
01检查本地 git 仓库历史,确认是否拉取过包含攻击特征的提交
特征提交信息:
—chore: add ci helper
—ci: refresh build cache
—chore: add dependency audit workflow
—ci: restore、ci: cleanup
在本地 git 仓库执行:
VERIFY / 排查命令
git log --grep="chore: add ci helper"
git log --grep="ci: refresh build cache"
git log --grep="chore: add dependency audit workflow"
02检查是否存在恶意脚本文件 在项目目录查找恶意命名模式文件:.ci‑{6位随机字符}.sh
VERIFY / 排查命令
find . -name ".ci-*.sh"
03检查项目package.json脚本段,查看是否存在恶意postinstall钩子
手动打开package.json查看scripts.postinstall;也可命令行检索:
VERIFY / 排查命令
grep -n "postinstall" package.json
grep -n "\.ci-" package.json
恶意postinstall钩子样例:
VERIFY / 排查命令
"postinstall": "sh ./.ci-dwgd2n.sh >/dev/null 2>&1; _r=$?; if [ \"$_r\" -eq 42 ]; then exit 42; fi"
04检查是否安装受污染发布包
受污染公开包列表:
—Packagist:digitalelvis/neuronai‑studio:3.14.3(仅在包目录执行npm install触发,composer install 不会触发)
—Go 模块:github.com/onuragtas/docker‑env v1.0.278 / v1.0.280 /v1.0.282、github.com/vkuznet/gocurl@v0.0.0‑20261111095532‑8d5aad0cb0da;Go 包仅污染 workflow,本地 go build 不会执行恶意代码,对开发者本机无执行风险。
VERIFY / 排查命令
# php项目检查
# 检查npm是否下载该php包下代码并执行npm install
composer show digitalelvis/neuronai‑studio
# Go模块仅做记录,无需本机处置
go list -m github.com/onuragtas/docker‑env
go list -m github.com/vkuznet/gocurl
03本机系统痕迹检查(判断载荷是否已经执行)
恶意脚本执行会创建临时目录:$RUNNER_TEMP/.wfx‑<pid>/、/tmp/wfx‑scan‑<pid>/,在 Linux/macOS 本机对应/tmp/下临时目录,进程会读取/proc/*/mem内存读取密钥(Linux)。
01检查临时目录残留
检查是否存在wfx‑scan‑*、.wfx‑*目录,若存在,提示载荷曾执行。
VERIFY / 排查命令
grep -n "postinstall" package.json
grep -n "\.ci-" package.json
02检查进程审计日志(Linux):是否存在读取进程内存行为
恶意脚本会读取进程内存提取密钥:访问/proc/<pid>/mem
VERIFY / 排查命令
# 需要root,检查最近是否有非调试程序读取/proc/*/mem
grep "/proc/.*/mem" /var/log/audit/audit.log
03检查网络连接日志
VERIFY / 排查命令
# Linux,检查历史连接(需开启网络审计)
grep -E "194.150.166.244|18.143.168.96|153.75.82.159" /var/log/*
# macOS查看最近网络访问,可使用netstat日志或者系统日志
C处置建议ACTION / RESPONSE
01应急隔离
01断开受影响主机对外网络(如虚拟机、开发机),阻止恶意程序继续向外发送数据;
02关闭所有终端,停止 npm、node 相关进程:
EXECUTE / 处置命令
pkill -f node
pkill -f npm
03备份系统日志、bash/zsh 历史、审计日志用于溯源,不要修改原始日志;
04不要直接继续在被感染的 shell 会话操作云控制台,内存中可能残留泄露凭证。新开一台干净机器执行凭证轮换操作。
02清理本地恶意文件
01删除恶意仓库中识别到的.ci‑xxxxxx.sh文件,删除恶意postinstall脚本;
02清除 npm 缓存,删除 node_modules,不要继续在污染 commit 版本执行任何 npm 命令:
EXECUTE / 处置命令
pkill -f node
pkill -f npm
03删除/tmp下所有 wfx 开头的临时目录
EXECUTE / 处置命令
rm -rf /tmp/wfx‑scan‑* /tmp/.wfx‑*
04git 操作:回滚到干净 commit,丢弃恶意提交;不要保留攻击者注入的任何 commit。
EXECUTE / 处置命令
git revert <恶意commit‑hash>
# 或者重置到安全版本
git reset --hard <安全commit>
03全面轮换所有泄露凭证
01GitHub
—撤销全部 Personal Access Token (PAT)、OAuth 授权、SSH 密钥;
—开启账号 2FA 双因素认证;
—检查 GitHub 审计日志,查看异常 push、删除 workflow run 行为;
—检查机器人账号是否存在越权 token
02SSH 密钥
—删除本机所有旧私钥,重新生成 SSH 密钥对;
—将旧公钥从所有服务器、git 平台全部移除
03AWS
—轮换所有 Access Key;
—CloudTrail 审计:搜索会话名以wfx‑ 开头的AssumeRole/CreateAccessKey/UpdateAssumeRolePolicy;
—删除攻击者新增 IAM AccessKey;
—修复被篡改信任策略(禁止"AWS":"*");
—检查 Lambda、IAM 角色后门
04Azure
—检查 Entra ID 应用注册,删除所有名字wfx‑ci‑*的联合身份凭证(该后门可绕过密钥轮换登录 Azure);
—轮换 client secret;
—检查订阅权限异常新增账号;
—审计 Graph API 调用记录
05GCP
—审计 Workload Identity Pool;
—检查GenerateAccessToken、SignJwt异常调用;
—轮换服务账号密钥
06HashiCorp Vault
—撤销全部 GitHub OIDC 登录颁发 token;
—审计 JWT 登录日志
07包管理器(npm/PyPI/Composer)
—撤销发布 token;
—重置账号密码;
—检查是否有异常版本发布;
—拉黑受污染包版本
08AI API 密钥(OpenAI 等)
—全部删除旧 API Key,重新生成;
—检查账号 API 调用记录,确认是否存在攻击者调用
04系统层面处置(开发主机)
01Shell 历史:将~/.bash_history、~/.zsh_history备份后清空,历史记录存在明文密钥风险;
02检查 crontab、systemd 服务,确认攻击者没有植入持久化本地后门:
EXECUTE / 处置命令
crontab -l
systemctl list‑unit‑files --type=service
03如果机器是高价值开发机,且确认恶意脚本完整执行过,最高安全等级建议:备份数据后重装操作系统。因为恶意脚本具备内存读取,无法 100% 确认是否留下其他隐蔽后门。
05上游仓库联动(仓库维护者)
01检查 GitHub 仓库的 Actions 运行记录:寻找缺失的 Workflow run 编号(攻击者执行完会删除 run 日志,run 序号出现跳号是攻击强证据);
02关闭探针 PR:关闭标题docs: dependency audit notes来自wfx‑docs分支的探测 PR,删除wfx‑docs、chore/8位随机字符分支;
03检查 bot 账号权限:如果攻击者使用 bot 账号提交恶意 commit,收回 bot「绕过分支保护」权限;
04通知团队成员:提醒团队所有人,不要拉取、不要在受污染 commit 版本执行npm install,全员自查开发机;
05扫描 git 全部历史:检索 git 历史是否存在 IoC 特征字符串:WF_CALLBACK、WF_TG_BOTS、.ci‑*.sh;
06发布安全通告,锁定受污染包版本,避免其他开发者中招。
END OF FILE 02 / 04
| FILE / 03 | 2026.11.10 |
PYPI + WALLET DRAINER
PyPI 恶意包 fragment‑api‑py 14.4.2会在启动时耗尽 TON 钱包余额
fragment-api-py 恶意版本在客户端初始化时触发隐藏转账逻辑,直接耗尽 TON 钱包资产。
PyPI / fragment-api-py / TON
A情报概要SIGNAL / INTELLIGENCE
披露时间:2026年11月10日 / PUBLIC DISCLOSURE
■ 情报来源: / SOURCE REGISTER
| 01 | safedep.io https://safedep.io/blog/fragment-api-py-pypi-ton-wallet-drainer |
■ 相关信息: / WHAT HAPPENED
SafeDep披露PyPI上的fragment-api-py软件包14.4.2版本被植入后门,该包是Telegram Fragment市场的Python客户端,为支付功能会保存用户的TON区块链钱包助记词。分析发现恶意版本实为13.0.0旧版代码篡改三个文件后冠以更高版本号发布,以保证升级时优先安装,后门代码于10月12日编写,约四周后上传。攻击者伪装成资金归集功能的函数会硬编码攻击者钱包地址,在客户端正常初始化阶段自动将用户钱包中全部泰达币和几乎全部TON代币以单笔交易转移,仅保留少量手续费。两名受害者共损失约44.8个TON,后门在上传后六小时内即首次得手,其中一名受害者未主动报案而被链上分析发现。发布渠道缺少对应标签且使用长期有效的令牌,无法确定是环境被入侵、凭据被盗还是内部人员所为,事件凸显持有用户密钥的加密工具包需防范发布链被劫持。
■ 遭受投毒/有被投毒风险的供应商: / AFFECTED ECOSYSTEM
PyPI(英语:Python Package Index,简称PyPI)是Python的正式第三方( official third-party)软体套件的软件存储库,它类似于CPAN(Perl的存储库)。一些软件包管理器例如pip,就是默认从PyPI下载软件包。此案例中,攻击者在PyPI官方仓库上传恶意包进行供应链投毒攻击。
由于国内开源镜像站均同步于PyPI官方仓库,所以该问题不仅会通过官方仓库,还可能通过各个开源镜像站影响广大用户。常用的国内镜像列表如下:
—清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
—豆瓣 https://pypi.doubanio.com/simple/
本次攻击中,fragment‑api‑py 开源项目本身成为被投毒的直接上游供应商,攻击者疑似通过窃取项目 PyPI 长期发布 Token、攻陷维护者本地主机或是内部人员途径,绕过 GitHub 代码仓库,无对应 Git 提交与 Tag 的情况下向 PyPI 发布恶意版本 14.4.2,该恶意包基于旧版 13.0.0 篡改植入 TON 钱包窃取后门;PyPI 作为公共包托管平台本身未被攻破,但会分发该恶意构件,企业内部 PyPI 镜像、CI/CD 制品仓库、Docker 镜像缓存若同步拉取并留存 14.4.2 制品,也演变为存在投毒扩散风险的中间供应商;下游使用该库的开发者、业务系统、脚本程序属于受害消费方,只要项目依赖引入该恶意版本,一旦运行并传入 TON 钱包助记词就会触发资产窃取,攻击风险可沿依赖链向下传导至开发机、测试、生产环境。
B落地分析建议TRACE / INVESTIGATION
01风险前提
01Python 环境安装了版本为 14.4.2 的fragment‑api‑py包;
02业务代码实例化FragmentClient时传入了 TON 钱包助记词 seed,使用async with FragmentClient(seed=...);或者调用execute_prepared()接口(不使用 async‑with 也会触发后门);
03程序实际运行过该恶意版本代码(仅安装未运行代码不会触发转账)。
02检查当前安装的 fragment‑api‑py 版本
01方式 1:pip 查询包版本
VERIFY / 排查命令
pip show fragment-api-py | grep Version
# 如果使用python3/pip3环境
pip3 show fragment-api-py | grep Version
02方式 2:扫描锁文件(项目依赖清单,检查是否被引入)
检查项目requirements.txt、pyproject.toml、poetry.lock、requirements-lock.txt、Pipfile.lock,确认是否锁定版本14.4.2。使用 vet 工具扫描:
VERIFY / 排查命令
vet scan -D .
03扫描 site-packages,检索后门特征 IOC
通过恶意代码字符串特征检索 Python 包安装目录,确认是否存在后门代码文件,支持多 Python 环境:
VERIFY / 排查命令
grep -rn "UQAolfC7fyf__0H-1GzG9y5ZtV2CPC7yDno4W2cSVuYlJ6DU\|sweep_wallet_to_self\|_ensure_swept" $(python3 -c 'import site;print(" ".join(site.getsitepackages()))') 2>/dev/null
特征包括:
—攻击者 TON 钱包地址:UQAolfC7fyf__0H‑1GzG9y5ZtV2CPC7yDno4W2cSVuYlJ6DU
—恶意函数名:sweep_wallet_to_self、_ensure_swept
04校验 whl/tar.gz 安装包哈希
恶意包文件哈希 IOC:
| 制品 | SHA256 |
fragment_api_py‑14.4.2‑py3‑none‑any.whl | 24c402f3c47e3d8bc29597d000def922fa507970e47322d6fd7f28a4d253d447 |
fragment‑api‑py‑14.4.2.tar.gz | f046a53fa9007ff4cecc3ca7c5811b3fe44b09905af162d260885d091519531e |
05审计应用运行日志 & TON 链上交易记录
01应用日志
检索程序启动日志,确认是否执行过FragmentClient初始化逻辑;后门函数执行不会输出明显业务日志,日志无法完全确认是否转账;
02链上查询钱包交易记录
使用 tonviewer 查询你业务使用的 TON 钱包地址,检查交易历史:
—是否存在向攻击者地址UQAolfC7fyf__0H‑1GzG9y5ZtV2CPC7yDno4W2cSVuYlJ6DU转出 TON/USDT 记录;
—攻击者收到资金后会进一步归集转发至下游地址UQDJvvpXs4bDBVBwnmchy4nJ‑Y25Ck4RBfHzQI240qlVYbM8。
C处置建议ACTION / RESPONSE
01隔离主机并停止业务
停止相关服务、容器和定时任务,暂时禁止自动部署或自动重启;必要时先进行网络隔离。在处置完成前,不要再次运行带有真实助记词的客户端。
02保留证据
保存以下内容,便于内部调查或向平台报案:
—恶意 wheel/源码包及 FragmentAPI 目录;
—依赖文件、安装日志、应用日志和部署记录;
—异常交易哈希、钱包地址、时间及损失金额;
—相关容器镜像或构建产物。
03卸载恶意包
EXECUTE / 处置命令
pip uninstall -y fragment-api-py
# pip3环境
pip3 uninstall -y fragment-api-py
04清理项目依赖锁文件:
01修改requirements.txt、pyproject.toml,固定版本为安全版本(例如 14.4.1,不要使用pip install -U无约束升级,防止再次拉取恶意版本,虽然已经下架,但缓存 / 私有镜像可能留存);
02重新生成 lock 锁文件,删除本地 pip 缓存中 14.4.2 版本包:
EXECUTE / 处置命令
pip cache remove fragment-api-py==14.4.2
05核查 CI/CD 流水线、构建镜像
检查 docker 镜像、CI 缓存、私有 PyPI 镜像是否缓存 14.4.2 恶意 wheel 包,予以删除;
06安全版本重装
EXECUTE / 处置命令
pip install fragment-api-py==14.4.1
07处理相关密钥和凭据
原 TON 助记词无法通过“修改密码”恢复安全,应直接更换钱包。如果受影响的是构建或发布机器,还应轮换 PyPI API Token、GitHub 凭据及发布工作流中的相关密钥,并检查是否存在异常发布记录。
08验证清理结果后恢复业务
确认以下事项后再恢复服务:
—pip show 不再发现恶意包;
—项目及安装目录中不再出现相关 IOC;
—所有节点均使用重新构建的干净环境;
—钱包已更换,新助记词未接触过受感染设备。
恢复后持续观察应用日志和新钱包交易,不要使用真实资产进行触发测试。
END OF FILE 03 / 04
| FILE / 04 | 2026.11.09 |
CLOUD TRUST + AWS
Qubole 供应链攻击事件
被盗 Qubole 身份凭据滥用跨账号 IAM 信任,将单一供应商失陷扩展为多个客户云环境的数据泄露。
Qubole / AssumeRole / 跨账号信任
A情报概要SIGNAL / INTELLIGENCE
披露时间:2026年11月09日 / PUBLIC DISCLOSURE
■ 情报来源: / SOURCE REGISTER
| 01 | sentra.io https://sentra.io/blog/breaches/inside-the-qubole-supply-chain-attack |
| 02 | www.wiz.io https://www.wiz.io/blog/qubole-cross-account-access-abused-in-the-wild |
| 03 | www.bleepingcomputer.com |
■ 相关信息: / WHAT HAPPENED
10月14日至26日间一名攻击者利用被盗的大数据平台Qubole的AWS身份凭据,通过第三方集成固有的跨账户信任关系实施大规模云入侵。企业常创建跨账户IAM角色并配置信任策略允许Qubole账户扮演,攻击者使用安全令牌服务的AssumeRole接口,假借Qubole身份进入数十家客户的AWS环境,在权限范围内开展侦察,从密钥管理服务及参数仓库窃取机密,利用TruffleHog工具验证发现的各类密钥,随后以机会主义方式下载所有可访问的S3存储桶数据,而非定向窃取,单家客户即有数百万文件被窃。整个攻击路径未突破任何边界,完全依赖客户预配置的合法信任链。AWS回应称自身服务未被入侵,行为符合设计,建议客户审查跨账户角色、移除闲置集成并施加最小权限及来源限制。
■ 遭受投毒/有被投毒风险的供应商: / AFFECTED ECOSYSTEM
本次事件中遭到凭证泄露的供应商为大数据云处理平台Qubole,该攻击并非软件包投毒,属于身份凭证类供应链风险;攻击者窃取了Qubole AWS账号下两枚IAM用户凭证,利用企业客户预先配置、用于对接Qubole的AWS跨账号IAM信任关系(即便配置ExternalId防护),通过sts:AssumeRole接口批量跳转进入客户AWS云环境,大量受害企业早已停用Qubole服务,但未删除对应的IAM信任角色,遗留的信任关系成为攻击入口,只要企业AWS账号存在对Qubole AWS账号(805246085872)的跨账号信任配置,无论当前是否还在使用该厂商服务,均具备被本次攻击利用的风险,攻击者无需攻破客户侧账号,仅凭被盗的供应商身份凭证即可枚举资源、窃取密钥与S3敏感数据,形成一商失陷、多家客户受牵连的供应链危害。
B落地分析建议TRACE / INVESTIGATION
01风险前提
01AWS 账号中存在 IAM 角色信任策略允许 Qubole AWS 账号 ID:805246085872 执行sts:AssumeRole;
02该角色配置了ExternalId用于 Qubole 集成(即便配置 ExternalId,攻击者拿到该值即可绕过,ExternalId 不能作为唯一防护手段);
03该 IAM 角色具备读取 S3、Secrets Manager、SSM Parameter Store、Lambda 配置、数据库快照等敏感权限;
02检索异常 AssumeRole(角色接管)事件
在 CloudTrail 查找如下特征事件,只要命中任意一条,代表存在攻击者活动痕迹:
01userIdentity.accountId = 805246085872(Qubole 源 AWS 账号)且 sourceIP 不是 AWS 官方 IP 段,事件名AssumeRole
02主体 ID 匹配攻击者使用 IAM 用户:
—AIDA3W7DIFLYOLTK63SFS:该主体所有活动均为攻击者行为,出现即告警
—AIDAJYRRH5Y3A7AAJM2HW:该账号有合法业务流量,必须搭配非 AWS 的源 IP 判定,AWS 内网 IP 访问为正常业务
03角色会话名称(sessionName)以quiam‑开头(攻击者固定标记,如quiam‑enum、quiam‑scope‑full)
04攻击相关恶意网络 IOC(CloudTrail 的sourceIPAddress)
| IP 地址 | 归属 | 说明 |
57.129.54.120 | OVH VPS | 攻击者主要 IP,枚举、窃取凭证、下载数据 |
45.83.220.211 | Mullvad VPN | 首轮角色接管 |
185.209.199.73 | Mullvad VPN | 批量横向接管客户角色 |
89.37.63.175 | Mullvad VPN | 后期攻击出口 |
注意:Mullvad 为公共 VPN,仅仅出现该 IP 不等于被入侵;必须同时匹配 Qubole 账号 ID/quiam 会话名才是本次攻击活动。
03检索攻击后续恶意行为
攻击者入侵角色后会执行下面 API,筛选来自可疑会话 ID 的调用:
01凭证窃取行为
—Secrets Manager:ListSecrets、GetSecretValue 读取密钥
—SSM Parameter Store:DescribeParameters、GetParameter 读取加密参数
—Lambda:GetFunctionConfiguration 窃取 Lambda 环境变量密钥
02云资源探测行为
—S3:ListBuckets、ListObjects、HeadObject、GetObject(下载 S3 对象,数据外渗)
—EC2、RDS:DescribeInstances、DescribeDBSnapshots,读取数据库备份快照
03凭证有效性校验
—GetCallerIdentity,User‑Agent 包含TruffleHog:攻击者用来批量验证偷到密钥是否有效;同时会出现 Entra ID、Okta 登录日志带有 TruffleHog UA。
04清点 IAM 信任关系
遍历所有 AWS 账号 IAM 角色信任策略:查找信任策略中 Principal 包含arn:aws:iam::805246085872:root,或者允许该账号执行 sts:AssumeRole 的全部 IAM 角色。
—已经不再使用 Qubole:直接删除角色或者移除信任策略;
—仍然在使用 Qubole:加固信任条件。
05本地主机 / EC2 实例排查(针对恶意 ISO 镜像sso_agent.iso)
攻击者在 OVH 服务器托管恶意可引导 Linux 镜像,SHA‑256: 65f061281c9a712e9502793dc4c5035cae490b84da05f7d4223cefa65ad396e4
—Wiz 暂未发现大规模投放,但仍需排查:检查 EC2、物理服务器是否存在该文件名及哈希的 iso 文件;
—镜像行为:启动后 90 分钟倒计时,收集系统信息,向外网 57.129.54.120:23458 建立 TCP 回连,接收 shell 命令,到期强制重启清除痕迹,偏向针对 Windows 主机;
—检索服务器日志,检查是否有从上述恶意 IP 下载 iso、异常 PXE / 远程引导行为。
C处置建议ACTION / RESPONSE
01阻断攻击访问路径
01移除 Qubole 的 IAM 信任关系
—不再使用 Qubole:直接删除该跨账号 IAM 角色;
—业务还依赖 Qubole:临时修改信任策略,删除805246085872Principal,业务中断,后续完成加固再恢复。
02吊销所有攻击者生成临时会话凭证:AWS IAM 撤销活跃会话,已经颁发的临时 STS 凭证不会自动失效,必须执行吊销。
03安全组、网络 ACL 层面阻断攻击 IOC IP(57.129.54.120等)的入站访问。
02证据保全
01冻结 CloudTrail、S3 访问日志、VPC 流日志,禁止日志过期删除;将日志导出到隔离、不可修改存储桶,用于取证;
02导出所有可疑quiam‑*会话的完整 API 调用记录,记录会话 ID、时间、源 IP、调用的 API;
03如果开启 S3 数据事件日志,导出全部GetObject记录,明确哪些 S3 对象被读取下载;
04导出 Secrets Manager、SSM Parameter Store 的访问审计日志,记录被 GetSecretValue 读取的密钥清单;
05检查是否存在sso_agent.iso恶意镜像,留存文件哈希、下载日志。
03全面轮转泄露密钥 & 凭证
01AWS 侧密钥轮换
—Secrets Manager 中所有被GetSecretValue读取的密钥、数据库密码、API Token;
—SSM Parameter Store 被读取的加密参数;
—Lambda 环境变量里面所有密钥(攻击者通过 GetFunctionConfiguration 拿到),仅仅修改环境变量不会自动生效,需要重新部署 Lambda 函数;
—所有被读取的 AWS Access Key IAM 访问密钥,直接禁用并重新生成。
02外部身份系统密钥
—Entra ID 服务主体 Client Secret(攻击者 Trufflehog 会测试);
—Okta 客户端密钥、OAuth 密钥;
—数据库账号密码、中间件密钥、第三方系统 token。
04评估数据泄露范围
01通过 CloudTrail 加密解密日志:加密 S3 对象下载会产生解密日志,可以确认哪些加密文件被窃取;默认 S3 SSE‑S3 加密没有独立解密日志,泄露文件数量会高于可审计数量;
02梳理被访问 S3 桶内容:区分 PII 个人身份信息、PCI 支付卡、PHI 健康数据、IP 知识产权;
03合规评估:如果包含受监管敏感数据,按照当地法规完成泄露评估,准备事件通报。
05深度狩猎排查横向扩散
01检查所有账号 CloudTrail,查找 Trufflehog 相关 User‑Agent,查找攻击者利用窃取密钥进行横向移动痕迹;
02审计 EC2 实例用户数据(User‑Data),攻击者会抓取此处存储的密钥;
03检查 RDS 快照、备份文件是否被下载;
04全盘检索环境中是否存在sso_agent.iso恶意镜像,排查 PXE / 远程启动日志,确认是否存在本地主机投毒;
05检查所有外部跨账号信任 IAM 角色,防止攻击者利用本次窃取的凭证开辟其他后门。
06事后加固与持续监控
01若业务必须继续使用 Qubole,修改 IAM 角色信任策略增加网络条件限制:aws:SourceIp约束为 Qubole 官方公布出口 IP,拒绝 VPN/VPS 来源;
02严格最小权限原则:Qubole 角色删除不必要权限,禁止读取全部 Secrets Manager、全部 S3 资源;
03开启全组织 CloudTrail,强制开启敏感 S3 桶 S3 数据事件日志;
04配置告警:监控异常sts:AssumeRole、外部 VPN 来源跨账号角色接管、quiam‑*会话名称;
05第三方安全工具:启用数据检测响应 DDR 能力,监控身份异常行为。
END OF FILE 04 / 04
NEXT CHECK / 下周观察清单
把发布与信任链变成可审计项
01 锁定安全依赖版本并清理包管理器缓存
02 审查发布提交、Actions 与生命周期脚本
03 轮换开发、云端和 CI 凭证并保护钱包资产
04 清理闲置 IAM 信任并监测异常 AssumeRole
SUPPLY CHAIN / THREAT FILES / W46
本文转载自微信公众号「奇安信威胁情报中心」,查看原文。版权归原作者所有,如有侵权请联系删除。