从 LiteLLM 投毒事件说起为什么复盘要在本地做LiteLLM 被投毒这件事真正让人后背发凉的不是某个库被塞了恶意代码而是攻击链的完整程度攻击者先拿下 Trivy 的 CI/CD再用窃取到的发布凭证往 PyPI 推带毒版本开发者只是正常升级了一下依赖环境就已经被接管。恶意代码会打包 AWS/GCP/Azure 密钥、SSH key、GitHub token、数据库连接、.env 和 Kubernetes 配置外发还会在集群里扫描节点、部署恶意 Pod、横向扩散甚至用.pth文件让 Python 一启动就执行。所以这篇不是教你应急响应而是排障视角的复盘方法不碰生产集群只在本地把脱敏后的依赖清单、Pod 事件和日志片段整理出来让 Codex 走 TaoToken 通道对照公开攻击链逐条比对。开始之前先在 TaoToken 官网 创建一个 Key后面 Codex 的 Base URL 填https://taotoken.net/api不带/v1、不加 UTM。一、原问题与场景复盘 LiteLLM 投毒为什么不能直连生产集群先把场景说清楚。假设你所在团队用了 LiteLLM 做模型网关某天看到供应链攻击的通报第一反应通常是赶紧上集群查。但这个动作本身就是风险恶意代码会扫描集群节点、部署恶意 Pod你连上去排查等于把自己也放进被观测面攻击者可能已经建立systemd 后门 定期回连你在集群里的每条命令都可能被记录更麻烦的是.pth机制——只要 Python 启动就执行你随手跑个脚本都可能触发二次行为。正确的复盘姿势是离线化把需要分析的材料从集群里搬出来脱敏后放到本地再让模型帮你做模式匹配和线索串联。需要搬出来的东西大致三类依赖清单pip freeze或 lock 文件里 LiteLLM 的版本号、安装来源是不是 PyPI 官方源、安装时间Pod 事件与清单kubectl get events、异常 Pod 的 YAML、镜像来源、创建时间、节点分布日志片段LiteLLM 网关日志、容器启动日志、可疑外联记录目标 IP/域名、时间点。注意脱敏把真实密钥、内网 IP、账号名替换成占位符只保留结构特征——比如某 Pod 在凌晨 3 点被创建某进程向一个非常规域名发起 HTTPS 请求。这些结构特征才是复盘时要对照攻击链的关键。这一步做完你手上应该是一堆文本文件而不是一个活着的集群。接下来才是让 Codex 介入。二、TaoToken 前置Key 和 Base URL 是唯一需要准备的东西TaoToken 在这个流程里只做一件事给 Codex 提供一个可用的模型通道。它不替代你的编辑器也不参与你的集群操作你需要的只有两样东西——一个 Key一个 Base URL。打开 TaoToken 官网注册后在控制台创建 API KeyBase URL 固定填https://taotoken.net/api不要加/v1不要加任何 UTM 参数Key 形如YOUR_API_KEY实际使用时替换成你自己的。如果你用的是 Claude Code 而不是 Codex配置位置在settings.json字段是ANTHROPIC_BASE_URL和ANTHROPIC_API_KEYCodex 则走config.toml。两者思路一致把请求指向 TaoToken 的 API 地址用你的 Key 鉴权。这里有个容易踩的坑很多人习惯性在 Base URL 后面补/v1结果请求 404。TaoToken 的 API 地址就是https://taotoken.net/api路径拼接由客户端自己处理你不需要手动加版本段。Key 创建入口在 API Keys 页面接入细节可以对照接入文档。三、可复制配置让 Codex 走 TaoToken 通道下面给一份可以直接抄的 Codex 配置。假设你把脱敏材料放在./incident/litellm/目录下包含deps.txt、pod-events.txt、gateway.log三个文件。Codex 的config.tomlmodel gpt-5-codex model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat然后在 shell 里导出 Keyexport TAOTOKEN_API_KEYYOUR_API_KEY如果你用 Claude Codesettings.json长这样{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: YOUR_API_KEY } }如果你更习惯 CLI 方式也可以直接跑npm i -g taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m gpt-5-codex配置完成后Codex 的所有请求都会经过 TaoToken。这一步的意义是你不需要在本地再维护一套模型凭证复盘用的模型通道和你的生产环境完全隔离。四、验证请求先跑通最小请求再开始排查不要一上来就把整个日志目录丢给 Codex。先做一个最小验证确认通道可用codex exec 回复 ok 两个字符即可如果返回ok说明 Base URL、Key、模型 ID 三者都对上了。如果报 401检查 Key 是否导出成功如果报 404八成是 Base URL 多写了/v1如果报模型不存在换一个模型 ID 再试。通道确认可用后再进入真正的复盘。下面是我实际用过的三条 prompt按攻击链顺序排列第一条比对 LiteLLM 版本与发布来源读取 ./incident/litellm/deps.txt找出所有 LiteLLM 相关条目 输出包名、版本号、安装来源 URL、安装时间。 对照公开通报中受影响的版本区间标出哪些条目落在风险范围内。 不要推测只根据文件内容回答。第二条找异常 .pth 文件和可疑 Pod读取 ./incident/litellm/pod-events.txt 1) 列出所有在非工作时间22:00-06:00创建的 Pod 2) 标出镜像来源不是内部 registry 的 Pod 3) 如果事件里有挂载 .pth 文件或 site-packages 相关记录单独列出。 输出成表格每行附上原始事件行号。第三条串联外联痕迹读取 ./incident/litellm/gateway.log 提取所有出站 HTTPS 请求的目标域名和 IP 按出现频次排序标出非常规域名非官方 API、非内部服务。 对每个可疑目标给出首次出现时间和关联的 Pod 名。成功的结果长这样Codex 会返回一张表左边是原始日志行号中间是提取出的字段右边是它判断的风险等级。你拿着这张表去和公开攻击链对照——比如通报里说恶意代码会外发到某个 C2 域名你就在表里搜这个域名通报说.pth会在 Python 启动时执行你就在 Pod 事件里找挂载记录。关键点Codex 只做模式匹配和线索整理不做是否被入侵的最终判断。判断权在你手里模型只是帮你把几百行日志压缩成一张可读的表。五、本篇常见错排查复盘过程中下面这几个错我踩过或者见别人踩过列出来省时间1. Base URL 写成https://taotoken.net/api/v1症状请求 404 或 401。原因TaoToken 的 API 地址不带版本段客户端会自己拼。改成https://taotoken.net/api即可。2. Key 没有导出到环境变量症状Codex 报env_key not found。原因config.toml里写的是env_key TAOTOKEN_API_KEY但 shell 里没export。补上导出或者直接在启动 Codex 的同一个终端里 export。3. 把未脱敏的日志直接丢给模型症状复盘做完了但你的真实密钥、内网 IP 已经进了模型上下文。原因图省事。正确做法是先用sed或脚本把敏感字段替换成占位符再让 Codex 读。4. 让 Codex 直接连集群症状模型建议你跑kubectl exec去查。原因prompt 里没限定只读本地文件。在 prompt 开头加一句只根据提供的本地文件回答不要建议任何集群操作。5. 模型 ID 写错症状报模型不存在。原因config.toml里的model字段和 TaoToken 支持的模型 ID 不一致。去模型对话页面确认可用模型再回填。6. 忘了.pth这条线症状只查了 Pod 和日志漏了 Python 启动执行。原因.pth文件通常不在 Pod 事件里而在镜像层或挂载卷里。复盘时单独让 Codex 在依赖清单和镜像构建记录里搜.pth。7. 把通道可用当成环境安全症状Codex 返回ok就以为没事了。原因TaoToken 只提供模型通道不参与你的集群安全。通道验证和入侵判断是两件事别混。六、语义一致复盘之后把通道固定下来LiteLLM 这次事件的核心教训不是某个库有毒而是AI 基础设施的权限太高、攻击面太集中。一个网关组件被投毒攻击者拿到的可能是整个集群的横向移动能力。所以复盘的目标不是这次有没有中招而是下次怎么更快发现。把 Codex TaoToken 这套组合固定下来价值在于你有一个和生产环境隔离的、随时可用的分析通道。下次再出供应链事件你不需要临时找模型、配凭证直接脱敏、丢文件、跑 prompt十分钟内拿到一张线索表。如果你只是偶尔做一次复盘用 API Keys 创建一个 Key 就够了如果你打算把这种复盘做成常规动作或者让 Agent 长期跑日志分析可以看看 Coding Plan把通道和额度一起管起来。最后提醒一句复盘时永远不要在活着的生产集群上做实验。把材料搬出来脱敏本地分析这是这次事件给所有 AI 基础设施维护者的最低要求。
