兄弟,先问你个事儿:你昨天装的那个Python库,确定是"原装正版"吗?别笑,2026年3月24号那天,一个叫LiteLLM的热门包(就是帮你统一调用各种大模型API的那个)被人掉了包。攻击者往PyPI上传了两个带毒版本(1.82.7和1.82.8),只要pip install一下,你机器里的SSH密钥、AWS凭证、Kubernetes配置,甚至加密货币钱包,统统会被打包发送到黑客的服务器。更骚的是,这事发生在Trivy(一个专门扫漏洞的安全工具)被黑之后——攻击者先黑安全工具,再用安全工具的权限去黑下游项目,这操作堪称"偷家式打击"。

所以啊,今天咱们不聊怎么写代码,聊聊怎么保住你的"代码命根子"。毕竟现在的黑客早就不玩SQL注入了,他们直接在你的食材里下毒,你做出来的菜再香也是毒药。

一、PyPI这口"公共食堂"到底有多脏?

你可能觉得PyPI是Python官方仓库,应该挺安全的吧?错!PyPI就像个24小时无人值守的自助餐厅,谁都能往里放盘菜。根据学术机构的研究,2024年11月还发现有个偷AWS凭证的恶意包在PyPI上躺了三年多,下载量超过三万七千次。2024年3月,PyPI甚至因为恶意包泛滥到不得不暂停新包上传。

攻击者现在最狠的一招叫供应链投毒。他们不黑你的代码,而是黑你依赖的第三方库。想象一下:你盖房子,钢筋水泥都是买的,结果水泥厂被人控制了,你房子盖得再结实也是歪的。LiteLLM这次就是典型案例——攻击者通过之前盗取的CI/CD凭证,直接把恶意代码塞进了官方发布流程,连代码仓库的源码都是干净的,只有PyPI上的安装包有毒。

还有更阴的。2026年这波攻击里,黑客在1.82.8版本里塞了个.pth文件。这玩意儿是Python的启动钩子,只要Python解释器一启动,不管你是不是在导入LiteLLM,恶意代码都会自动执行。这就好比你家水龙头被人装了窃听器,不管你喝不喝水,只要一开龙头,信息就漏了。

二、黑客的"钓鱼"套路有多野?

攻击者为了让你中招,手段比微商还丰富。咱们盘几个2025-2026年还在活跃的套路:

1. 错别字 squatting(Typosquatting)

你本来要装colorama,结果手一抖装了colourama(多了个u)。这包看着跟正版一模一样,实际上会偷你的浏览器密码和信用卡信息。2025年还有pymafka冒充PyKafka,325个小白中招。

2. 组合 squatting(Combosquatting)

把python-nmap改成nmap-python,顺序颠倒一下,很多人眼神不好就栽了。

3. 构建过程污染

这是最阴险的。GitHub上的源码是干净的,但发布到PyPI的安装包被污染了。2024年12月,著名的YOLO目标检测库ultralytics就中过这招——GitHub Actions的缓存被投毒,构建出来的wheel文件里多了个挖矿程序。

4. 依赖混淆

公司内部的私有包叫internal-tool,攻击者在PyPI上注册个同名的公开包。如果你公司的pip配置没做好,优先级没设对,就会从PyPI拉攻击者的包而不是内部的包。

5. 账号劫持与继承

PEP 541规定,长期无人维护的包可以被转移所有权。攻击者专门找那些作者联系不上、但还有很多用户在用的"僵尸包",申请接管后植入恶意代码。

三、十分钟自查:你的项目还安全吗?

先别慌,咱们做个体检。如果你最近装过LiteLLM,先看看版本:

pip show litellm

如果是1.82.7或1.82.8,恭喜,你可能已经"裸奔"了。这时候要做这几件事:

  1. 立即吊销所有凭证:SSH密钥、AWS Access Key、GitHub Personal Access Token、数据库密码,统统重置。因为恶意代码会把/.ssh/、/.aws/、/etc/kubernetes/下的文件全打包发走。
  2. 检查持久化后门:攻击者喜欢留systemd服务或者crontab任务。在Linux上运行:
systemctl list-units --type=service --state=running | grep -i "litellm|python"
crontab -l
  1. 看网络连接:检查有没有异常的外连,特别是发往models.litellm.cloud这个域名(这是这次攻击的C2服务器)。
  2. 重装系统(最保险):安全厂商建议,如果被1.82.8感染,最好的方式是重装系统。因为.pth文件可能留下了持久化机制,普通卸载清不干净。

四、武装到牙齿——Python库安全审计五步法

好了,亡羊补牢不如未雨绸缪。下面这套流程,建议每个Python开发者刻进DNA里。

第一步:隔离环境,绝不混用

别再用系统自带的Python了!每个项目必须有自己的虚拟环境:

用uv(2025年最火的管理工具,比pip快100倍)

uv venv .venv
source .venv/bin/activate  # Linux/Mac
# 或者 .venv\Scripts\activate  # Windows

为什么强调隔离?因为如果你用系统Python装了个恶意包,它可能篡改你其他项目的依赖,甚至感染全局的site-packages。

第二步:固定版本,别追新

很多人写requirements.txt喜欢这样:

litellm
requests
numpy

这是自杀式写法!攻击者只要上传个新版本,你下次部署就自动中招。应该锁定具体版本:

litellm==1.82.6
requests==2.31.0
numpy==1.24.3

更专业点,用pip-tools或者uv pip compile生成requirements.lock,把依赖树的每个包都锁定版本和哈希值。

第三步:扫描漏洞,工具组合拳

推荐2025年主流的四件套:

  1. pip-audit(官方出品)
    扫描你装的包有没有已知CVE:
pip install pip-audit
pip-audit --local
  1. Safety(老牌选手)
    专门查恶意包和漏洞:
pip install safety
safety check
  1. Bandit(静态代码分析)
    检查你的Python代码里有没有安全问题,比如硬编码密码、不安全的反序列化:
pip install bandit
bandit -r ./src
  1. Semgrep(规则引擎)
    支持自定义规则,可以检测特定的恶意代码模式:
pip install semgrep
semgrep --config=auto .

如果你嫌一个个运行麻烦,可以用PyDefender这个开源工具,它把上面四个集成到一条命令里。

第四步:检查包元数据,别只看名字

安装前,先去PyPI页面看看:

  • 上传时间:如果某个包三年没更新,突然昨天发了个新版本,要警惕。
  • 下载量:正版requests每周下载几千万,假冒的可能只有几百。
  • 作者信息:点进作者主页,看看有没有GitHub链接,仓库是不是活跃的。
  • Release文件:检查wheel文件的哈希值,跟GitHub Release页面对比,防止构建污染。

第五步:CI/CD里加安全闸门

在GitHub Actions里,每次提交都自动扫描:

name: Security Audit
on: [push, pull_request]
jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'
      - name: Install dependencies
        run: |
          pip install pip-audit safety bandit

      - name: Run pip-audit
        run: pip-audit --requirement=requirements.txt

      - name: Run Safety check
        run: safety check -r requirements.txt

      - name: Run Bandit
        run: bandit -r . -f json -o bandit-report.json || true

这样如果有恶意包混进来,流水线直接报错,阻止部署。

五、高级防护:企业级策略

如果你是团队负责人,还得再加几层保险:

  1. 私有PyPI镜像
    用Nexus或者Artifactory搭个私有仓库,只允许白名单里的包。团队里的电脑只能从这个私有源下载,不给直连PyPI的机会。

  2. 签名验证
    启用Sigstore签名,检查包的签名是否来自可信的维护者。2025年以后,PyPI已经开始支持PEP 740(数字证明),可以验证包确实是用某个GitHub Action构建的。

  3. 依赖审查(Dependency Review)
    GitHub Enterprise里有依赖审查功能,PR里如果新增了有漏洞的包,会自动标红阻止合并。

  4. 行为监控
    在生产环境用eBPF监控Python进程的异常行为,比如突然读取/etc/shadow或者连接外部IP,直接杀掉进程并告警。

结语:安全是个持续的过程

说实话,完全避免供应链攻击很难,毕竟你不能不用第三方库。但LiteLLM这次事件给我们提了个醒:不要盲信任何包,哪怕它来自官方仓库,哪怕它有几千万下载量。

记住几个底线:隔离环境、锁定版本、自动扫描、定期轮换凭证。做到这几点,至少能把风险降到最低。毕竟咱们写代码是为了解决问题,不是为了给黑客打工,对吧?

最后提醒一句:赶紧去检查一下你的requirements.txt,看看有没有未指定版本的依赖。今晚就改,别等到明天。黑客可不会等你喝完这杯咖啡再动手。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐