python pip-audit
# 聊聊 Python 项目里的安全卫士pip-audit最近在维护几个老项目升级依赖的时候总有点提心吊胆。不知道你有没有这种体验——明明只是更新了一个小版本测试也通过了但心里总不踏实担心某个不起眼的依赖包里藏着已知的安全漏洞。以前遇到这种情况要么去各个安全公告网站手动查要么祈祷别出问题。直到发现了pip-audit这个工具才觉得 Python 项目的依赖安全检查终于有了个像样的“标准动作”。它到底是什么pip-audit本质上是个审计工具专门用来检查 Python 项目里安装的那些包是否存在已知的安全漏洞。它不是魔法背后连接的是 Python 软件包咨询数据库PyPA Advisory Database这个数据库收集了所有上报到 PyPI 的包的安全问题。你可以把它想象成项目的“定期体检”。就像我们每年会做一次全面体检看看身体有没有潜在问题一样pip-audit给项目的依赖包做扫描告诉你哪些包有已知的安全隐患。有意思的是这个工具最初是 Python 软件基金会安全实验室的项目后来被整合进了 pip 这个“官方包管理器”的生态里。这种出身让它有种“半官方”的气质——不是第三方小工具而是生态内生的安全检查机制。它能解决什么问题最直接的它能告诉你项目里哪些包有漏洞。但更深入一点看它解决的是“信息不对称”的问题。作为开发者我们可能知道要定期更新依赖但很难追踪每个包的安全状况。一个项目几十个依赖每个依赖又有自己的依赖形成庞大的树状结构。手动跟踪几乎不可能。pip-audit把这种跟踪自动化了。它会递归检查整个依赖树不仅仅是直接依赖还包括间接依赖。比如你的项目依赖了 FlaskFlask 又依赖了 Werkzeug那么 Werkzeug 的漏洞也会被检查出来。它输出的报告很实用不仅告诉你哪个包有问题还会给出漏洞的编号比如 CVE-2023-12345、严重程度、影响范围以及最重要的——修复方案。通常是建议升级到某个安全版本。怎么用起来安装很简单就像安装其他 Python 工具一样pipinstallpip-audit基本的用法就是运行pip-audit默认情况下它会检查当前 Python 环境里安装的所有包。如果你在虚拟环境里运行就只检查这个虚拟环境的包。更常见的用法是针对具体的项目。比如你有个requirements.txt文件pip-audit-rrequirements.txt或者针对pyproject.tomlpip-audit-ppyproject.toml输出结果通常是这样的格式Found 2 known vulnerabilities Package Version ID Severity Fix Versions requests 2.25.1 CVE-2021-... HIGH 2.26.0 urllib3 1.25.8 CVE-2020-... MEDIUM 1.26.0一眼就能看出问题在哪有多严重该升级到哪个版本。有个实用的选项是--fix但用的时候要谨慎。它会尝试自动升级有漏洞的包到安全版本。听起来很美好但实际项目中直接自动升级可能会破坏兼容性。建议先看看它建议升级到什么版本然后自己评估一下再手动操作。什么时候用、怎么用更好在持续集成CI流程里加入pip-audit检查是个好习惯。每次代码提交、每次构建都自动跑一次安全检查。这样漏洞一出现就能发现而不是等到几个月后的某次“安全审计”。对于正在开发的项目可以在每次添加新依赖后跑一次。养成这个习惯能避免“技术债”越积越多。对于老项目第一次跑pip-audit可能会有点吓人——可能一下子报出几十个漏洞。这时候不要试图一次性全部修复容易引发连锁问题。更稳妥的做法是按照严重程度排序先解决高危漏洞中低危的可以规划在后续的迭代里逐步处理。还有个细节pip-audit检查的是“已知”漏洞。这意味着它依赖背后的数据库是否及时更新。对于零日漏洞还没被公开披露的它是无能为力的。所以它不能替代其他的安全实践比如代码审查、依赖最小化原则等而是这些实践的有力补充。和其他工具相比有什么不同Python 生态里检查依赖安全的工具不止一个。比如safety也是个老牌工具功能上和pip-audit很相似。pip-audit的一个优势是它的“官方背景”。它使用的漏洞数据库是 Python 生态官方维护的更新比较及时覆盖面也相对全面。而且作为 pip 的“兄弟项目”它在设计理念和使用体验上都和 pip 保持了一致性。另一个工具是dependabotGitHub 提供的它更自动化——不仅检查漏洞还会自动创建 Pull Request 来修复。但dependabot是平台特定的主要在 GitHub而pip-audit是通用的在任何环境都能用。trivy、grype这些是更通用的容器镜像漏洞扫描工具它们也能扫描 Python 包但覆盖范围更广包括系统包、其他语言包等。如果你的项目最终要打包成容器用这些工具做最终检查会更全面。实际项目中往往是组合使用。比如用pip-audit在开发阶段检查用dependabot自动创建更新最后用trivy扫描最终的生产镜像。每层检查的关注点不同组合起来才更安全。最后一点想法用了pip-audit一段时间后最大的感受不是它多强大而是它让“安全检查”这件事变得平常了。以前安全审计像是“大扫除”半年一年做一次每次都发现一堆问题修起来手忙脚乱。现在变成了日常习惯就像出门前检查门窗有没有关好一样自然。工具终究是工具pip-audit不会让你的项目自动变安全但它提供了持续的安全可见性。在漏洞利用越来越自动化的今天这种可见性不是奢侈品而是必需品。下次更新依赖前不妨先跑一下pip-audit。可能会多花几十秒但换来的安心感值得这点时间。