相依套件
pip-audit
pip-audit 會掃描 Python 相依套件,找出含有已知漏洞的套件。它由 Python Packaging Authority 提供,可用於執行環境、requirements 檔案與專案檔案。pip 並未內建相當於 npm audit 的功能,因此這是取得此類檢查的標準方式。
更新日期
如何執行 pip-audit
pip install pip-audit
pip-audit # the current environment
pip-audit -r requirements.txt # a requirements file
pip-audit . # a local project
pip-audit --fix --dry-run # show what would be upgraded
pip-audit --fix # upgrade vulnerable packages
pip-audit -s osv # use OSV instead of PyPI
pip-audit -f cyclonedx-json # write a CycloneDX SBOM
預設情況下,它會透過 PyPI 的 JSON API 查詢套件,該 API 的資料來自 Python Packaging Advisory Database;也可以改用 OSV。完整的選項清單請參閱 專案頁面。
留意您稽核的對象
這一點讓許多人感到意外。稽核 requirements 檔案時會解析其相依套件,而專案也警告
pip-audit -r INPUT 在功能上等同於 pip install -r INPUT。安裝套件可能會執行程式碼,因此惡意套件可能在稽核過程中執行。專案本身的原則很簡單:您不會
pip install 的東西,就不要 pip audit。
這也代表這項檢查無法保護您免於尚無資安公告的套件,例如新的 錯字搶註套件或 slopsquatting 套件。
在 CI 中執行 pip-audit
官方提供 GitHub Action pypa/gh-action-pip-audit,您也可以自行執行指令。它在發現漏洞時會以非零代碼結束,因此即使程式碼沒有任何變更,一則新的資安公告也可能讓建置失敗。
- run: pip install -r requirements.txt pip-audit
- run: pip-audit
請稽核與您出貨內容相同的相依套件組合。使用固定確切版本與雜湊值的 requirements,可以得到穩定的結果。至於它與其他檢查如何搭配,請參閱在哪裡執行 SCA 掃描。
pip-audit 涵蓋不到的範圍
- 您的程式碼。它分析的是相依套件樹,而不是原始碼。這部分請參閱 SAST 與 SCA 的比較。
- 原生函式庫。Python wheel 經常內含 C 函式庫,而專案表明它不會偵測非 Python 共用函式庫中的遞移漏洞。
- 建置中的其他一切。您的基礎映像檔、系統套件與 CI actions 都不在它的檢查範圍內。
- 新的惡意套件。它比對的是已知的資安公告。
- 實際出貨的那次建置。Python 的相依解析會隨環境而異,因此在另一台機器上的稽核看到的版本,可能與發布版本不同。沒有鎖定檔(lockfile)時,解析的順序也可能不同。
pip-audit 與其他 Python 掃描工具比較
| 工具 | 適用情境 | 備註 |
|---|---|---|
| pip-audit | 免費檢查 Python 相依套件 | 僅支援 Python |
| Trivy、Grype | 容器映像檔內的 Python 套件 | 也涵蓋作業系統套件 |
| 商用 SCA 工具 | 跨多種語言與團隊的政策與工作流程 | 請參閱最佳 SCA 工具 |
pip-audit 與 CRACI
pip-audit 很適合用來檢查 pull request。CRACI 則從另一端著手:作為您的 GitHub Actions 執行器,它會將作業從 PyPI 與其他所有來源取用的每個套件(涵蓋相依套件樹的每一層),記錄到產生該發布版本的那次建置的 SBOM 中。之後,每當有新漏洞公開,它都會持續檢查這份 SBOM,讓您知道去年的發布版本是否受到影響。請參閱建置時 SBOM 與 建置時 SBOM 產生。
pip-audit:常見問題
什麼是 pip-audit?
由 Python Packaging Authority 提供的工具,可掃描 Python 執行環境、requirements 檔案與專案,找出含有已知漏洞的套件。
Python 有類似 npm audit 的工具嗎?
pip-audit 是最接近的對應工具,但它是獨立的工具,而不是 pip 指令,因此需要自行安裝。
如何修正 pip-audit 找到的漏洞?
執行 pip-audit --fix 升級有漏洞的套件,或先執行 --fix --dry-run 查看會有哪些變更。接著執行您的測試,並更新已固定版本的 requirements。
對不受信任的程式碼執行 pip-audit 安全嗎?
不安全。稽核 requirements 檔案在功能上等同於安裝它,而安裝可能會執行程式碼。您不會安裝的套件,就不要稽核它。
pip-audit 能產生 SBOM 嗎?
可以。它能以 JSON 或 XML 格式輸出 CycloneDX。這份 SBOM 描述的是它解析出的 Python 相依套件,而不是您建置中的其他部分。
pip-audit 使用哪個漏洞資料庫?
預設使用 PyPI 的 JSON API,其資料來自 Python Packaging Advisory Database。它也可以改用 OSV。