近期一个叫 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 就过滤掉很多风险。
常见问题
Q: Skill Shielder 本身需要安装什么吗?
完全不需要。它是纯 bash 脚本,只用到 macOS / Linux 内置的 grep、find 等基础命令,没有任何外部依赖。一个安全工具如果自己也要 pip install,那就讽刺了。
Q: 扫描结果是 WARN 就代表有问题吗?
不一定。WARN 代表有值得注意的地方,例如使用了 curl POST 或读取了 .env 文件。这些在合法工具中很常见,但你应该确认它们的用途是否合理。只有 CRITICAL(红色)才是真正危险的信号。
Q: 这个工具只能用在 Claude Code 吗?
不是。虽然它设计的初衷是审计 Claude Code 的 skill,但你可以用它扫描任何 GitHub 项目、MCP server、或本地脚本。任何你准备在终端执行的第三方代码,都值得先扫一下。
Q: Pattern-based 扫描能抓到所有攻击吗?
不能。没有任何工具能保证 100% 侦测率。Skill Shielder 是第一道防线,不是万灵丹。但它能抓到绝大多数已知的攻击手法,包括最新的 .pth 文件注入、prompt injection、和 supply chain 投毒。
整理:Penna|小企鹅 Penchan