威胁攻击者利用Discord Webhooks构建C2通道,通过npm、PyPI和Ruby软件包实施攻击
威胁攻击者正日益滥用Discord webhooks作为开源软件包内部的隐蔽命令与控制(C2)通道,从而能够在无需搭建专用基础设施的情况下,秘密窃取敏感信息、主机遥测数据和开发者环境数据。 Socket公司的威胁研究团队记录了在npm、PyPI和RubyGems平台上活跃的此类滥用行为。在这些案例中,硬编码的Discord webhook URL充当了只写的“接收器”,通过HTTPS协议将数据虹吸到攻击者控制的频道。 由于webhook的请求数据类似于发往一个广泛允许的域名的普通JSON流量,这些操作常常能绕过边界过滤和基于签名的安全控制。
Discord Webhooks如何成为数据外泄管道
Discord webhooks是一种HTTPS端点,只需持有包含ID和秘密令牌的URL,即可向频道发布消息。 存活的端点通常在成功时返回“204 No Content”,或在设置了“?wait=true”参数时返回“200 OK”。而401、404和429状态码则分别表示令牌无效、webhook已删除或达到速率限制。 关键在于,webhook URL是只写的——防御者无法仅凭URL读取频道的历史记录——这使得关停攻击和追溯调查更加困难,同时降低了攻击者的实施难度和成本。
- 只写访问:Webhook URL仅允许发布消息,无法读取频道历史。
- 最小化身份验证:仅需持有包含ID和秘密令牌的URL。
- 标准HTTP响应:存活的端点返回可预测的状态码以供验证。
- 隐蔽性优势:流量看起来像是发往流行Discord域名的合法JSON数据。
跨生态系统的恶意软件包
在npm上,mysql-dumpdiscord 针对敏感配置文件,如 config.json、.env、ayarlar.js 和 ayarlar.json(土耳其语中意为“设置”),读取并分块处理文件内容后,通过POST请求将其发送到硬编码的Discord webhook。
更为简单的是,nodejs.discord 实现了对 discord.js 的薄封装,可将任意字符串转发到内嵌的webhook URL。虽然有时用于日志记录,但如果在安装脚本或运行时被调用,这种模式很容易变成数据泄露点。
在PyPI上,malinssx 覆盖了 setuptools 的安装命令,在 pip install 过程中静默触发向Discord webhook发送POST请求,并发送一条越南语通知信息。
同一攻击者(账户名 sdadasda232323)发布了完全相同的包(malicus、maliinn),重复使用同一个webhook——这标志着攻击者为逃避单一软件包下架,采用了跨名称的自动化或迭代式投毒策略。
- npm攻击目标:如
.env、config.json等配置文件及土耳其语“ayarlar”设置文件。 - PyPI渗透:在
pip install过程中执行的安装时挂钩。 - RubyGems利用:包括
/etc/passwd和系统元数据在内的主机级数据收集。 - 跨平台持久化:同一威胁攻击者在多个软件包生态系统中部署。
在RubyGems上,sqlcommenter_rails 更进一步,收集主机级信号,包括 /etc/passwd 内容、来自 /etc/resolv.conf 的DNS解析器、用户名、主机名、工作目录和家目录、包元数据,以及通过 api.ipify.org 获取的公网IP地址,然后将整个有效载荷序列化并发送到硬编码的Discord webhook。整个过程会抑制错误,倾向于静默失败而非引发明显异常。
为何此战术有效——以及应对措施
Discord webhook C2改变了供应链攻击的经济模式。它是免费的、快速的,通过TLS协议将流量混入到流行域名的通信中,并且除了持有URL外,无需任何身份验证流程。
当与安装时挂钩、postinstall 脚本或Ruby/Python的安装覆盖功能结合时,这些软件包可以在应用程序运行时控制或终端检测与响应(EDR)介入之前,就从开发者笔记本电脑和CI运行器中窃取敏感信息。
类似的模式也在Telegram、Slack和GitHub的webhooks中被观察到,这突显了攻击者正更广泛地转向“商品化C2即服务”,从而削弱了静态入侵指标(IOC)的价值。
- 经济优势:免费的基础设施消除了托管成本和技术复杂性。
- 规避策略:发往受信任域名的TLS流量绕过了大多数安全控制。
- 时机利用:安装时执行发生在运行时安全监控之前。
- 扩大攻击面:类似模式在Telegram、Slack和GitHub webhooks中涌现。
缓解措施应侧重于行为和出口控制。将webhook端点视为潜在的数据外泄向量,并在可行的情况下,通过DNS和TLS SNI过滤实施允许列表策略。 使用锁文件固定依赖项,要求提供来源/SLSA证明,并通过PR扫描来管理依赖项更新,以标记硬编码的webhook URL、出站网络调用和安装时执行。 扫描软件包差异中的秘密访问,并以最小权限范围轮换开发者凭证。在CI/CD中,默认情况下禁止构建和测试步骤的出站互联网访问,仅授予严格限定范围的例外。 最后,为开发者工作流程配备能够拦截基于webhook外泄模式的软件包信誉和恶意软件检测功能。
入侵指标
| ID | 技术名称 |
|---|---|
| T1005 | 来自本地系统的数据 |
| T1016 | 系统网络配置发现 |
| T1020 | 自动化外泄 |
| T1033 | 账户发现 |
| T1059 | 命令与脚本解释器 |
| T1059.006 | 命令与脚本解释器:Python |
| T1059.007 | 命令与脚本解释器:JavaScript |
| T1071.001 | 应用层协议:Web协议 |
| T1082 | 系统信息发现 |
| T1119 | 自动化收集 |
| T1195.002 | 供应链威胁:入侵软件供应链 |
| T1552.001 | 不安全凭证:文件中的凭证 |
| T1567 | 通过Web服务进行数据外泄 |