CognitiveSand/scan_litellm_compromise
GitHub: CognitiveSand/scan_litellm_compromise
针对 LiteLLM PyPI 包供应链攻击的跨平台 IOC 检测扫描器,帮助排查 TeamPCP 组织植入的后门与凭证窃取痕迹。
Stars: 1 | Forks: 1
# LiteLLM 供应链攻击扫描器
一个尽力而为的扫描器,**试图检测** 2026 年 3 月 24 日发布的恶意 LiteLLM PyPI 包 v1.82.7 和 v1.82.8 所留下的入侵指标 (IOC)。此次入侵由 **Endor Labs**、**Datadog Security Labs**、**Snyk** 和 **Sonatype** 的安全研究人员识别,首次公开披露归档为 [GitHub Issue #24512](https://github.com/BerriAI/litellm/issues/24512)。
## 快速开始
### 选项 A:从 PyPI 安装
**Linux / macOS:**
```
# 推荐 — 安装在隔离环境中
pipx install scan-litellm-compromise
scan-litellm
```
如果您没有 pipx:`sudo apt install pipx` (Debian/Ubuntu) 或 `brew install pipx` (macOS)。
或者,在虚拟环境中使用 pip:
```
python3 -m venv /tmp/scanner && /tmp/scanner/bin/pip install scan-litellm-compromise
/tmp/scanner/bin/scan-litellm
```
**Windows:**
```
pip install scan-litellm-compromise
scan-litellm
```
或者使用虚拟环境:
```
py -m venv %TEMP%\scanner && %TEMP%\scanner\Scripts\pip install scan-litellm-compromise
%TEMP%\scanner\Scripts\scan-litellm
```
### 选项 B:从源码运行(无需安装)
**Linux / macOS:**
```
git clone https://github.com/CognitiveSand/scan_litellm_compromise.git
cd scan_litellm_compromise
python3 run_scan.py
```
**Windows** —— 双击 **`run_scan.bat`**,或在终端中运行:
```
git clone https://github.com/CognitiveSand/scan_litellm_compromise.git
cd scan_litellm_compromise
py run_scan.py
```
无需依赖项 —— 仅使用 Python 标准库。
### 命令行选项
| 标志 | 描述 |
|------|-------------|
| `--scan-path DIR` | 将阶段 1(发现)和阶段 4(源代码扫描)限制在特定目录,而不是扫描整个系统。IOC 产物检查(阶段 3)仍会在全系统范围内运行。 |
| `--resolve-c2` | 除了使用硬编码的已知 IP 外,启用对 C2 域名的实时 DNS 查询。请参阅下面的警告。 |
| `--help` | 显示使用信息。 |
**示例:**
```
# 仅扫描特定项目目录
python3 -m scan_litellm_compromise --scan-path /home/user/myproject
# 为 C2 连接检查启用实时 DNS 解析
python3 -m scan_litellm_compromise --resolve-c2
# 结合两者
python3 -m scan_litellm_compromise --scan-path ./myproject --resolve-c2
```
## 视频概述
该扫描器的灵感来源于 [Fahd Mirza 的视频](https://www.youtube.com/watch?v=YoClPk7KqZc),他重点介绍了这一事件 —— 感谢他引起大家的关注。
## 发生了什么
2026 年 3 月 24 日,两个植入了后门的 `litellm` Python 包版本被发布到 PyPI:
- **v1.82.7**(上传时间约 10:39 UTC)—— 恶意代码被注入到 `litellm/proxy/proxy_server.py`(Base64 编码)
- **v1.82.8**(上传时间约 10:52 UTC)—— 添加了一个 `litellm_init.pth` 文件,该文件在 **每次 Python 解释器启动时** 都会执行,无论是否导入了 litellm
这些包在大约 **3 小时** 内可用,随后 PyPI 对其进行了隔离。LiteLLM 的月下载量约为 9500 万次。
### 攻击是如何发生的
攻击者通过污染 LiteLLM CI/CD 流程中使用的 `aquasecurity/trivy-action` GitHub Action,入侵了 BerriAI 的 `PYPI_PUBLISH` token。恶意提交被强制推送到 Trivy action 仓库中 76 个现有版本标签中的 75 个。当 LiteLLM 的 CI 运行时,它获取了攻击者控制的 action,该 action 窃取了 PyPI 发布 token。这由 **Endor Labs**、**Snyk** 和 **StepSecurity** 的研究人员识别并记录。
### 三阶段载荷
**阶段 1 —— 凭证收集器:**
扫描本地文件系统和实时进程环境以查找秘密信息,包括:
- SSH 私钥 (`~/.ssh/`)
- AWS、GCP 和 Azure 凭证
- Kubernetes kubeconfig 和服务账号 token
- 数据库凭证(PostgreSQL、MySQL、Redis)
- CI/CD token(PyPI、npm、Docker registry、GitHub PATs)
- 所有环境变量(捕获 OpenAI、Anthropic 等的 API 密钥)
- `.env` 文件(递归发现)
- Shell 历史、git 凭证、TLS 私钥
- 加密货币钱包
**阶段 2 —— 加密渗透:**
收集的数据使用 AES-256-CBC(随机会话密钥)加密,会话密钥使用硬编码的 RSA-4096 公钥加密。打包文件归档为 `/tmp/tpcp.tar.gz`,并通过 HTTPS POST 发送到 `models.litellm.cloud`。
**阶段 3 —— 持久化后门:**
- 投放 `~/.config/sysmon/sysmon.py`
- 创建 `~/.config/systemd/user/sysmon.service`(“System Telemetry Service”)
- 每 50 分钟轮询一次 `checkmarx.zone/raw` 以获取次级载荷,将其下载到 `/tmp/pglog` 并执行
- 在 `/tmp/.pg_state` 中跟踪状态
### Kubernetes 横向移动
如果发现 Kubernetes 服务账号 token,载荷会将名为 `node-setup-{node_name}` 的 **特权 Pod** 部署到每个节点的 `kube-system` 命名空间中。这些 Pod 挂载主机根文件系统,并在节点级别安装 sysmon 后门。
## 此扫描器试图查找什么
此扫描器尽最大努力检测已知的 IOC。它会自动检测平台(Linux、macOS 或 Windows)并相应地调整扫描路径。
| 阶段 | 查找内容 |
|-------|-------------------|
| 1 | 文件系统中的 litellm 元数据目录(`dist-info` / `egg-info`)(Linux: `/home`, `/opt`, `/usr`, `/srv`, `/var`;macOS: `/Users`, `/opt/homebrew`, `/Library`;Windows: `%USERPROFILE%`, `%APPDATA%`, `Program Files`)。可以使用 `--scan-path` 进行限制。 |
| 2 | 从元数据文件中获取 litellm 版本 —— 无需执行 Python 解释器 |
| 3 | IOC 产物:`litellm_init.pth`、sysmon 持久化、临时暂存文件、C2 网络连接(默认与硬编码的已知 IP 匹配;`--resolve-c2` 启用实时 DNS)、可疑的 Kubernetes Pod。在 Windows 上:还会检查注册表 Run 键和计划任务 |
| 4 | 引用 litellm 的源文件和依赖配置(pyproject.toml、requirements.txt 等),标记任何固定到受损版本的文件 |
## 局限性
- **此扫描器无法检测已被窃取的秘密。** 如果您的凭证已被发送到攻击者的 C2 服务器,没有任何本地扫描可以撤销这一点。无论扫描结果如何,都需要轮换凭证。
- **产物可能已被清理。** 没有 IOC 文件并不意味着系统从未被入侵。
- **扫描器不检查 Docker 镜像层、CI/CD 运行器缓存或远程系统。** 每个环境都必须独立检查。
- **Root 拥有的路径(Linux 上的 `/root`)被排除在外。** 如果您需要扫描这些路径,请使用适当的权限单独运行检查。
- **扫描器无法解密被窃取的数据。** 只有攻击者持有 RSA-4096 私钥。
- **Windows 注册表扫描是尽力而为的。** 扫描器检查常见的 Run 键位置,但无法涵盖所有可能的持久化机制(WMI 订阅、COM 劫持等)。
## 用法
**Linux / macOS:**
```
python3 run_scan.py
# 或者
python3 -m scan_litellm_compromise
# 或者,如果通过 pip 安装:
scan-litellm
```
**Windows —— 双击 `run_scan.bat`**,或在终端中运行:
```
py run_scan.py
```
扫描器会自动检测平台(Linux、macOS 或 Windows),并相应地调整扫描路径、网络命令和持久化检查。
如果发现入侵指标,退出代码为 `1`,否则为 `0`。
有关 `--scan-path` 和 `--resolve-c2`,请参阅 [命令行选项](#command-line-options)。
## 平台支持
| 功能 | Linux | macOS | Windows 10/11 |
|---------|-------|-------|---------------|
| litellm 检测 | `/home`, `/opt`, `/usr`, `/srv`, `/var` | `/Users`, `/opt/homebrew`, `/usr/local`, `/Library` | `%USERPROFILE%`, `%APPDATA%`, `Program Files` |
| Conda/pipx 检测 | `/opt/conda`, `~/.local/share/pipx` | Homebrew Caskroom, `~/.local/share/pipx` | `%LOCALAPPDATA%\Miniconda3`, `%LOCALAPPDATA%\pipx` |
| 持久化检查 | systemd 用户服务 | sysmon 文件(在没有 systemd 的情况下无效) | 注册表 Run 键、计划任务、启动文件夹 |
| 临时产物 | `/tmp/` | `/tmp/` | `%TEMP%` |
| 网络连接 | `ss -tnp` | `lsof -i -P -n` | `netstat -ano` |
| C2 IP 匹配 | 硬编码的已知 IP(可通过 `--resolve-c2` 选择启用实时 DNS) | 相同 | 相同 |
| ANSI 终端颜色 | 原生 | 原生 | 通过虚拟终端处理自动启用 |
### macOS 注意事项
macOS 支持是基于对 TeamPCP 恶意软件在 Darwin 系统上行为的威胁情报分析添加的。**它尚未在实际的 macOS 硬件上进行测试**,因为维护者目前无法使用 Mac。该恶意软件的凭证窃取和 `.pth` 后门已被确认可在 macOS 上运行,但 systemd 持久化机制是无效的(macOS 使用 launchd,而不是 systemd)。如果您在 macOS 上运行此扫描器并遇到问题,请提交 issue。
## 如果检测到入侵
**假设受影响机器上的所有秘密都已受损。** 建议采取以下步骤 —— 此列表并非详尽无遗:
1. **立即轮换凭证** —— SSH 密钥、云提供商凭证 (AWS/GCP/Azure)、API 密钥、数据库密码、CI/CD token、`.env` 文件内容
2. **移除恶意产物** —— 删除 `litellm_init.pth`、sysmon 持久化文件和临时暂存文件(参见上面的特定平台路径)
3. **降级 litellm** —— `pip install litellm==1.82.6`(最后一个已知的安全版本)或在验证安全后升级到超出受损范围的版本
4. **更新固定版本** —— 检查所有 `requirements.txt`、`pyproject.toml` 和 lock 文件中是否有对 1.82.7 或 1.82.8 的引用
5. **检查 Kubernetes 集群** —— 在 `kube-system` 中查找 `node-setup-*` Pod,审计 ClusterRoleBindings
6. **阻止 C2 域名** —— 在 DNS/防火墙级别阻止 `models.litellm.cloud` 和 `checkmarx.zone`
7. **审计云提供商日志** —— 检查 AWS CloudTrail、GCP Audit Logs、Azure Activity Logs 中是否有使用潜在被盗凭证进行的未授权 API 调用
## 公告与参考
| ID | 来源 |
|----|--------|
| PYSEC-2026-2 | [Python Packaging Authority (PyPA)](https://github.com/pypa/advisory-database/blob/main/vulns/litellm/PYSEC-2026-2.yaml) |
| SNYK-PYTHON-LITELLM-15762713 | [Snyk](https://security.snyk.io/vuln/SNYK-PYTHON-LITELLM-15762713) |
| GitHub Issue #24512 | [Initial disclosure](https://github.com/BerriAI/litellm/issues/24512) |
| GitHub Issue #24518 | [Official timeline](https://github.com/BerriAI/litellm/issues/24518) |
### 安全研究与战术分析
- [Endor Labs](https://www.endorlabs.com/learn/teampcp-isnt-done) — 完整攻击时间线与归因
- [Datadog Security Labs](https://securitylabs.datadoghq.com/articles/litellm-compromised-pypi-teampcp-supply-chain-campaign/) — 载荷与产物分析
- [Snyk](https://snyk.io/articles/poisoned-security-scanner-backdooring-litellm/) — IOC 哈希与建议
- [Sonatype](https://www.sonatype.com/blog/compromised-litellm-pypi-package-delivers-multi-stage-credential-stealer) — 分阶段载荷分析
- [StepSecurity](https://www.stepsecurity.io/blog/trivy-compromised-a-second-time---malicious-v0-69-4-release) — Trivy 供应链入侵分析
- [Microsoft Security Blog](https://www.microsoft.com/en-us/security/blog/2026/03/24/detecting-investigating-defending-against-trivy-supply-chain-compromise/) — 检测与防御指导
### 已知 IOC 哈希 (SHA-256)
| 文件 | SHA-256 |
|------|---------|
| `litellm_init.pth` (v1.82.8) | `71e35aef03099cd1f2d6446734273025a163597de93912df321ef118bf135238` |
| `proxy_server.py` (v1.82.7) | `a0d229be8efcb2f9135e2ad55ba275b76ddcfeb55fa4370e0a522a5bdee0120b` |
| `sysmon.py` (dropped backdoor) | `6cf223aea68b0e8031ff68251e30b6017a0513fe152e235c26f248ba1e15c92a` |
## 项目结构
```
scan_litellm_compromise/
__main__.py Entry point for python -m
scanner.py Orchestrator (argparse CLI)
config.py Cross-platform constants, patterns, and known C2 IPs
models.py Typed data structures
formatting.py Terminal output (ANSI with Windows support)
platform_policy.py Platform abstraction (Strategy pattern)
platform_linux.py Linux-specific paths and commands
platform_darwin.py macOS-specific paths and commands
platform_windows.py Windows-specific paths and commands
ioc_windows.py Windows-only IOC checks (Registry, Tasks)
discovery.py Phase 1 — find litellm metadata directories
version_checker.py Phase 2 — read litellm version from metadata
ioc_scanner.py Phase 3 — IOC artifact detection
source_scanner.py Phase 4 — source/config file scanning
report.py Phase 5 — summary and remediation
tests/ pytest test suite (299 tests)
run_scan.py Direct entry point
run_scan.bat Double-click launcher for Windows
```
## 免责声明
此工具按“原样”提供,不附带任何形式的保证。它**试图查找** LiteLLM v1.82.7/v1.82.8 入侵的已知指标,但**无法保证**完全检测。扫描结果干净并不意味着您的系统未受影响。如果您的环境中曾安装过受损版本,哪怕只是短暂安装,请务必始终执行凭证轮换。
标签:Burp Suite 替代, DAST, DNS 解析, GraphQL安全矩阵, IOC检测, IP 地址批量处理, LiteLLM, PyPI漏洞, T1036, T1059.006, T1071, TeamPCP, 供应链攻击, 勒索软件检测, 包管理器安全, 后门检测, 失陷指标, 安全扫描器, 库, 应急响应, 恶意软件分析, 无线安全, 端点安全, 网络信息收集, 网络安全审计, 补丁管理, 逆向工具