PyPI上被篡改的LiteLLM 1.107.0安装了凭证窃取工具和后门
• 2026年10月21日 • 阅读时间6分钟 LiteLLM 1.107.0版本在PyPI上携带了凭证窃取工具和远程代码执行后门。所有七个轮子(Linux、macOS、Windows)作为三个文件安装在site-packages中。它们在主机上的任何Python进程启动时都会运行,即使该进程从未导入litellm。上游的GitHub源代码中不包含它们。PyPI已删除该版本。版本1.106.2、1.107.0rc1和1.107.0rc2是干净的。1.107.0锁定的配套包,litellm-proxy-extras==0.4.110和litellm-enterprise==0.1.78,也同样是干净的。攻击的具体做法 安装litellm==1.107.0会在site-packages中放置三个文件。每次Python启动时都会加载其中两个。cook.pth导入cook.py,这是一个凭证窃取工具。它收集SSH密钥、云凭证、CI/CD秘密、AI工具令牌、浏览器密码以及一个LiteLLM代理数据库中的LLM提供者密钥。它加密数据并将其发送到www.litellm[.]dev。sitecustomize.py启动一个后台守护进程。守护进程每小时从一个GitHub文件中读取一个服务器地址,再次运行窃取工具,并从该服务器下载和运行代码。植入物是如何进入发布中的 1.107.0源代码分发(sdist)中的pyproject.toml在maturin构建部分有一行额外的内容:pyproject.toml (litellm-1.107.0.tar.gz) TOML 6行 maturin data = "cook" 设置将一个cook/文件夹复制到litellm-1.107.0.data/purelib/中的轮子。pip会将该文件夹安装到site-packages中。sdist省略了cook/文件夹,因此这行是唯一可见的更改。BerriAI/litellm中没有公开的提交包含data = "cook"或cook/文件夹。轮子RECORD列出了三个添加的文件:litellm-1.107.0.dist-info/RECORD TEXT 4行 该版本与其标签不匹配 标签v1.107.0指向提交66c8f5b(06:59 UTC)。它的pyproject.toml表示version = "1.108.0"。SafeDep将每个sdist文件与git树按blob哈希进行比较。sdist匹配更晚的主提交a8113b0(08:50 UTC),加上五个编辑文件和cook/文件夹。四个被编辑的文件是Cargo.toml文件,添加了一行readme = "README.md"。合法的1.106.2和rc2版本包含相同的编辑。第五个是pyproject.toml,在这里与a8113b0进行比较:pyproject.toml (a8113b0 → litellm-1.107.0.tar.gz) DIFF 11行 编辑将版本设置回1.107.0,并将配套包锁定到rc2的值。因此,针对rc2的依赖差异显示没有异常。合法的1.106.2 sdist与其标签提交49943cd匹配,除了Cargo.toml的readme行。轮子是如何构建的 恶意轮子与正常的BerriAI发布管道的输出匹配:WHEEL文件名称maturin 1.9.4,版本与合法的发布相同。植入文件具有正确的RECORD条目,显示构建后没有编辑。压缩包时间戳显示分别进行本地构建:macOS在11:20,Linux在11:21,Windows在11:37 UTC。在Windows轮子中,所有2804个.py文件都具有CRLF行结尾,包括三个植入文件。Linux轮子没有。Windows上进行git checkout时带行结尾转换会产生这种模式。没有公开的GitHub Actions运行构建或发布该版本。SafeDep检查了09:30到12:30 UTC之间的539次运行。在11:50 UTC,在PyPI上传后的大约10分钟,litellm-dispatcher[bot]发布了GitHub版本v1.107.0。1.106.2也发生了相同的延迟。PyPI没有对1.107.0、1.106.2或rc2的来源证明。SafeDep评估,具有中到高的信心,BerriAI的私有发布管道从攻击者修改的git源构建了这些轮子。攻击者可以使用被攻破的维护人员或机器人凭证、私人分支或镜像,或管道构建的引用。使用攻击者自己机器上的被窃取的PyPI令牌与证据不太吻合。只有BerriAI的管道日志能确认原因。有效负载1:cook.py中的凭证窃取工具 Python在site-packages中的.pth文件中每次启动时都会运行以import开头的每一行。cook.pth包含import cook,因此窃取工具会在主机上的每个Python进程中运行:应用程序、pip、IDE语言服务器和CI作业。cook.py封装了约61 KB的Python代码,采用exec(zlib.decompress(base64.b64decode('...')))进行解码。解码后的代码以以下配置开始:cook.py(解码后)PYTHON 10行 它收集的内容模块目标sysinfo,netinfo主机名、用户、操作系统、IP地址、网络设置browser_pw用配置主密钥解密的Chromium保存的密码(Windows上的DPAPI)。Firefox的logins.json和key4.db浏览器历史记录浏览器历史ssh_keys ~/.ssh/* shell_hist bash和zsh历史记录,PowerShell PSReadLine,cmd历史记录cloud_creds ~/.aws/credentials和config,Azure配置文件和令牌,gcloud凭证,~/.kube/config,~/.docker/config.json,gh hosts.yml,rclone.conf,~/.netrc dev_secrets .pem,.key,.pfx,.p12,.pk8,.ppk文件在$HOME下,Compose
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡