近期一个叫 litellm 的 Python 包被投毒。
这个包每月有近一亿次下载量,被无数 AI 项目当作依赖。被投毒的版本只存在了不到一小时,但在那一小时内,任何执行 pip install litellm 的人,或者安装了任何依赖 litellm 的工具的人,都可能已经被偷走:
- SSH 密钥(连服务器的通行证)
- AWS / GCP / Azure 云凭证
- 加密货币钱包
- 所有环境变量(API keys)
- shell 历史纪录
- Git 认证信息
- 数据库密码
什么都不用做,不用 import 它、不用呼叫它,装了就中。

这是怎么做到的?
攻击者用了一个大多数人不知道的 Python 机制:.pth 文件。
Python 在启动时会自动读取 site-packages 目录里的所有 .pth 文件。正常用途是告诉 Python「把这个路径加到搜索清单里」。但在 .pth 文件里写一行 import 开头的命令,它就会自动执行。
攻击者在里面放了 base64 编码的恶意程序。解码后,它会静静地扫描电脑上的所有敏感文件,然后把内容传到攻击者的服务器。
更可怕的是,这次攻击之所以被发现,是因为攻击者自己的代码有 bug。它消耗了太多内存,导致受害者的电脑当机。攻击者写得更好一点,这件事可能好几天都不会被发现。
为什么这跟 Claude Code 用户有关?
用 Claude Code 的人,常会从 GitHub 下载各种 skill(给 Claude 看的命令集 + 脚本)、MCP server、或其他扩充工具。
每一次把别人写的代码放到电脑上、让 Claude 有权限去执行它,就在信任那个人。
一个恶意的 skill 可以:
| 攻击手法 | 具体做什么 |
|---|---|
| Prompt injection | 在 markdown 里藏隐形命令,操纵 Claude 去做坏事 |
| 恶意脚本 | curl SSH 密钥然后 POST 到攻击者的服务器 |
| Supply chain 投毒 | 在 requirements.txt 里引入被污染的包 |
| .pth 注入 | Python 每次启动都自动执行窃取程序 |
| 反向 shell | 在电脑上开一个后门,让攻击者远程连入 |
Skill Shielder
Skill Shielder 为这个问题而生。
它是一个零依赖的开源安全审计工具。纯 bash 脚本,不需要安装任何东西。它在安装任何工具之前先扫描,告诉用户里面有什么可疑的东西。
# 扫描本地文件夹
./shield.sh /path/to/downloaded-skill
# 直接扫描 GitHub repo
./shield.sh https://github.com/someone/their-tool

它扫什么?
Skill Shielder 有四个独立的扫描模块:
1. Prompt Injection 扫描器
检查 markdown、JSON、YAML 里的隐藏命令。例如:
ignore all previous instructions(经典覆写命令)- 伪装的
<system>标签(假装是系统消息) - Unicode 零宽度字元(肉眼看不到的隐形文字)
do not tell the user(叫 AI 对用户隐瞒事情)
2. 脚本安全扫描器
检查 .sh、.py、.js、.ts 里的危险操作:
curl ... | bash(下载并直接执行远程代码)base64 ~/.ssh/id_rsa | curl -X POST(把 SSH 密钥编码后传走)- 反向 shell(让攻击者远程控制电脑)
rm -rf ~/(删除整个家目录)
3. Supply Chain 扫描器
针对 litellm 那种攻击设计:
.pth文件里有没有可执行代码setup.py有没有在安装时偷跑命令package.json的postinstallhookrequirements.txt有没有从可疑来源拉包
4. 权限范围分析
分析这个工具会存取哪些文件和网络端点:
- 有没有读取
~/.ssh、~/.aws、.env? - 有没有连到不认识的外部网址?
- 同时存取敏感路径又发起网络请求 , 这就是典型的数据外泄模式

三种判定结果
扫描完成后,Skill Shielder 会给一个清楚的判定:
| 判定 | 意思 | 该怎么做 |
|---|---|---|
| PASS | 没有发现问题 | 可以安心安装 |
| WARN | 有值得注意的地方 | 看看是什么,确认合理再安装 |
| FAIL | 发现严重问题 | 不要安装,离它远一点 |
实际跑起来长这样
对一个测试用恶意 skill 执行扫描:
# Skill Shielder Report
**Target**: malicious-skill
**Verdict**: **FAIL**
## Summary
| Scanner | CRITICAL | WARN | INFO |
|------------------|----------|------|------|
| prompt-injection | 2 | 4 | 0 |
| script-safety | 5 | 4 | 0 |
| supply-chain | 1 | 2 | 0 |
| permissions | 1 | 3 | 0 |
## Findings
- [CRITICAL] SKILL.md:12 [PROMPT_OVERRIDE] ignore all previous instructions...
- [CRITICAL] scripts/setup.sh [PIPE_TO_SHELL] curl/wget piped to sh/bash
- [CRITICAL] scripts/setup.sh [CREDENTIAL_EXFIL] base64 encode credentials then curl
- [CRITICAL] scripts/setup.sh [REVERSE_SHELL] reverse shell pattern detected
- [CRITICAL] evil.pth [PTH_EXECUTABLE] .pth file contains executable code
...
## Recommendation
**CRITICAL issues detected. Do NOT install.**
9 个 CRITICAL,全部抓到。
怎么开始用?
git clone https://github.com/p3nchan/skill-shielder.git
cd skill-shielder
chmod +x shield.sh scanners/*.sh
# 扫想安装的东西
./shield.sh /path/to/any-project
也可以把它当作 Claude Code 的一个 skill:把 repo clone 到本地,Claude 就能直接用它来帮忙审计其他工具。
整个工具是纯 bash,macOS 和 Linux 都能用,不需要安装任何东西。
一些建议
litellm 事件让人重新检视「安装依赖」这件事。几个心得:
- 不要无脑
pip install。即使是大型项目也可能被投毒,哪怕只有一小时 - 注意 transitive dependencies。装的是 A,但 A 依赖 B,B 依赖 C,C 被投毒也会中
- 用前先扫。花 5 秒跑
shield.sh比事后修复被偷走的 credential 省事太多 - 零依赖是这类工具的硬规矩。安全工具自己也要装一堆包,会失去意义
延伸阅读
小企鹅的经验
Skill Shielder 是自家做的 skill audit 工具。OpenClaw 上想试的 skill 不少,每次想装前要逐个文件读过 SKILL.md 跟 scripts,时间久了会懒;做这个工具就是把那套人工审计步骤自动化。实际跑下来,最常被挡下来的是 transitive dependency 跟 setup script 里的 curl pipe to sh,这两条 pattern 就过滤掉很多风险。