依存関係
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
デフォルトでは、Python Packaging Advisory Databaseを情報源とするPyPIのJSON APIでパッケージを照会し、代わりにOSVを使うこともできます。 オプションの一覧はプロジェクトページをご覧ください。
監査する対象に注意する
多くの人が驚く点です。requirementsファイルを監査すると、その依存関係が解決されます。プロジェクトは、
pip-audit -r INPUTが機能的にはpip install -r INPUTと同等であると警告しています。パッケージのインストールではコードが実行されることがあるため、
悪意あるパッケージが監査中に実行される可能性があります。プロジェクト自身のルールは単純です。pip installしないものは、pip auditしないでください。
これは、新しいタイポスクワッティングやスロップスクワッティングのパッケージなど、 まだアドバイザリのないパッケージからは、このチェックでは守れないということでもあります。
CIでpip-auditを実行する
公式のGitHub Actionであるpypa/gh-action-pip-auditを使うか、コマンドを自分で実行できます。
脆弱性を見つけると0以外の終了コードを返すため、新しいアドバイザリによって、コードを変更していないのにビルドが失敗することがあります。
- run: pip install -r requirements.txt pip-audit
- run: pip-audit
出荷するものと同じ依存関係のセットを監査してください。厳密なバージョンとハッシュを指定したrequirementsなら、安定した結果が得られます。 ほかのチェックとの組み合わせ方は、SCAスキャンを実行する場所をご覧ください。
pip-auditの対象外
- 自社のコード。分析するのは依存関係ツリーであり、ソースコードではありません。それについては SASTとSCAの比較をご覧ください。
- ネイティブライブラリ。PythonのwheelにはCライブラリが同梱されていることが多く、プロジェクトは Python以外の共有ライブラリにある推移的な脆弱性は検出しないと明記しています。
- ビルド内のそれ以外のすべて。ベースイメージ、システムパッケージ、CIのアクションは対象外です。
- 新しい悪意あるパッケージ。照合するのは既知のアドバイザリです。
- 出荷したビルド。Pythonの依存関係の解決は環境によって異なるため、別のマシンでの監査ではリリースとは異なるバージョンが見える可能性があります。 ロックファイルがなければ、解決の順序も変わり得ます。
pip-auditとほかのPythonスキャナーの比較
| ツール | 適した用途 | 備考 |
|---|---|---|
| pip-audit | Pythonの依存関係を無料で | Pythonのみ |
| Trivy、Grype | コンテナイメージ内のPythonパッケージ | OSパッケージもカバー |
| 商用SCAツール | 多くの言語とチームにわたるポリシーとワークフロー | おすすめのSCAツールをご覧ください |
pip-auditとCRACI
pip-auditはプルリクエストに対する妥当なチェックです。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はどの脆弱性データベースを使いますか?
デフォルトでは、Python Packaging Advisory Databaseを情報源とするPyPIのJSON APIです。OSVを使うこともできます。