问题不在 import
@itsone_ai 读 LiteLLM 事故报告时注意到:恶意包要偷的清单里,出现了 ~/.cursor 和 ~/.claude 这类 AI 工具配置目录。更要命的是触发方式——装上之后,每次启动 Python 都会自己跑,根本不用 import litellm。你让 Agent 「顺手 pip install 一下」,就够了。
LiteLLM 官方事故报告的说法是:受影响的是 10 月 21 日特定时间段内未锁版本安装 LiteLLM 的环境(以及当时使用 1.107.0 / latest 等标签的 Docker 镜像);排查时找 litellm-1.107.0.dist-info、cook.pth、sitecustomize.py,找到即确认暴露,没找到也不代表干净。
@realMagog 补了一句很实用的话:一个文件装下所有 key,正是这类窃取程序最想要的;按工具拆分 key,并锁定版本。
(这次事件里网关日志泄露 GitHub token 的部分,我们之前单独写过:网关日志里躺着 GitHub token。本文只讲装包这一环。)
给 Agent 的装包动作加闸门
Claude Code 的权限规则可以把装包命令设为 ask,每次都让你看一眼再放行(语法见官方 permissions 文档):
{
"permissions": {
"ask": [
"Bash(pip install *)",
"Bash(pip3 install *)",
"Bash(python -m pip install *)",
"Bash(uv pip install *)",
"Bash(npm install *)"
]
}
}
注意:命令规则按写法匹配,换个写法(例如 python3 -m pip install、写进脚本里再执行)就可能对不上。高风险环境建议再加一条 PreToolUse hook 统一拦截,或干脆在沙箱、独立机器里装依赖。
锁版本和分 key
- 锁版本:
requirements.txt写死版本(最好带哈希),Docker 镜像用具体版本或摘要,不用latest。 - 一个工具一个 key:Claude Code、自动化脚本、网关各用各的 key,泄露时只轮换一把。
- 开发机别放全量密钥:
.env里只放当前项目需要的那几个。
已经中招怎么办
报告里的处置建议有一条反直觉:不要先跑 pip install 去「修」——在受感染的环境里,任何 Python 启动(包括 pip 本身)都会再次执行恶意代码。应先从 shell 删除报告列出的文件,再按「已失陷」处理:轮换这台机器上能访问到的所有凭据,包括 Claude / Anthropic 的 key 和登录态。
小结
- 投毒包「装上即执行」,Agent 装包这一步就是入口。
- 装包命令设 ask,锁版本,按工具分 key。
- 中招后先删文件、再轮换,别先 pip。
如果你想把 Claude Code 放在一台整机独享、和日常电脑分开的新加坡 Mac mini 上,把装依赖这类动作隔离出去,可以了解 Zumac.Ai,咨询 Telegram @singatao。
