Snykを使ってPython依存関係の脆弱性修正を自動化
2020年2月26日
0 分で読めますSnyk Open SourceのPythonサポートを強化しました。自動修正プルリクエストを活用して、開発者は依存関係の脆弱性を修正できます。
Python Packaging Index(PyPI)では、2018年に140億回以上のダウンロードがありました。これは誰もが驚くほどの数字です(年の半ばにPyPIの統計サービスでエラーがあったため、実際の数はさらに多いと考えられます)。この数字は、プログラミング言語としてのPythonの幅広い普及(現在GitHubによると第2位)だけでなく、オープンソースソフトウェアの利用に伴う課題も示しています。多くのパッケージが、直接・間接を問わず脆弱な依存関係をプロジェクトに取り込んでいるのです。Snykはこの1年間に、過去の記事でいくつかの事例を取り上げており、悪意のあるパッケージに関する記事も公開しました。
今回の機能強化により、Snyk Open Sourceは脆弱な依存関係を検出するだけでなく、自動修正手順も提供することで、Python開発者が既存の開発ワークフロー内でアプリをより安全に構築できるよう支援します。これを実現するため、Snykはpipプロジェクトに含まれるrequirements.txtファイルを基に依存関係ツリーを作成します。次に、それらの依存関係をSnykの脆弱性データベースと照合し、新たに検出された修正可能な問題があれば、自動的に修正プルリクエストを作成します。
Pythonプロジェクトをインポートする
Snykは、GitHub、GitHub Enterprise、GitLab、Bitbucket Server、Bitbucket Cloudなど、Gitベースのコードリポジトリとのインテグレーションを提供しています。これにより、Pythonプロジェクトのセキュリティ脆弱性やライセンスの問題を簡単にテスト、監視、修正でき、コード管理や開発のワークフローにも組み込めます。
GitHubで管理されているサンプルのPythonアプリケーションを使って、実際の動作を見てみましょう。
この例では、GitHubの認証情報を使ってすでにSnykにサインインしているため、Snykがインテグレーションを自動的に設定し、利用可能なリポジトリの一覧を表示しています。

インポート画面で、SnykにスキャンさせるPythonプロジェクトを選択し、選択したリポジトリを追加をクリックします。Snykは選択したすべてのリポジトリでマニフェストファイルをスキャンし、各ファイルのスナップショットを個別のファイルとしてインポートします。
プロジェクトページが表示されます。SnykによるPythonプロジェクトのインポートが完了すると、ページ上部に成功メッセージが表示され、ページの再読み込みを促されます。再読み込みすると、Pythonのロゴが付いたPythonプロジェクトが、インテグレーション済みのほかのプロジェクトと一緒に表示されます。

この例の数値が示すように、Snykはインポートしたプロジェクトで複数の脆弱性を検出しました。詳細を確認するには、プロジェクト一覧でPythonアプリを選択して展開し、表示されるrequirements.txtリンクをクリックします。
プロジェクトのスキャンレポート全体が表示されます。

ページ上部には、検出された脆弱性の数や、脆弱性につながる依存関係の経路数など、プロジェクトのメタデータが表示されます。
検出された問題の一部を修正するための推奨手順も提示されます(これも新機能です。詳細は近日公開!)。この例では、flaskの依存関係をバージョン0.12.3からバージョン0.12.3にアップグレードすると、重大度の高い2つの問題が修正されます。

修正プルリクエスト
依存関係で検出されたすべての脆弱性は、さらに下に表示されます。問題の優先順位付けや、必要に応じた修正対応に役立つ詳細情報も確認できます。

ページ左側の各種フィルターを使うと、検出された問題を絞り込めます。たとえば、重大度でフィルタリングして重大度「高」の脆弱性から修正したり、脆弱性が実際にどの程度危険かを示す悪用の成熟度で絞り込んだりできます(詳しくは悪用の成熟度をご覧ください)。
Snykが修正方法を見つけた脆弱性は、この脆弱性を修正をクリックするだけで、Snyk内からプルリクエストを作成できます。

Pythonサポートの強化により、新たに見つかった脆弱性に対するプルリクエストも、設定に応じて自動的に作成されます(詳細は後述)。Snykが作成するプルリクエストには、作成された理由、修正によって依存関係に加わる変更、修正対象の脆弱性に関する詳細など、理解に役立つ情報が記載されます。

テスト用プルリクエスト
requirements.txtファイルへの変更を含む新しいプルリクエストはすべて自動的にテストされ、プロジェクトに新たなセキュリティ脆弱性が持ち込まれないか確認されます。脆弱性が見つかった場合、プルリクエストはセキュリティテストに失敗します。その後、プルリクエストをマージするかどうかを判断できます。

こうした自動化機能はすべて設定できます。テスト用と修正用のプルリクエストは、どちらも無効にできます。テスト用プルリクエストでは、失敗と判定する条件も設定できます。

Snykで開発者を最優先にしたセキュリティを
脆弱な依存関係を常に把握することは、Pythonのセキュリティに関する重要なベストプラクティスの一つです。言うのは簡単ですが、実行するのは大変ですよね。サードパーティのコードをプロジェクトに簡単に取り込めることに加え、オープンソースの利用が全体的に増えているため、コードの可視性と管理性を確保する課題はますます複雑になっています。
Snykは、既存のワークフローに自然に組み込める開発者に使いやすいツールを提供し、オープンソースの依存関係における脆弱性の検出と修正を自動化することで、開発者がこの課題を解決できるよう支援します。
Pythonの自動修正機能は、オープンソースプロジェクトを無制限にスキャンできるFreeプランを含む、すべてのSnyk Open Sourceプランでご利用いただけます。ぜひアカウントに登録(以下のリンクから)して、テストを始めてみてください。それまでの間、Pythonプロジェクトのセキュリティ対策を始める際に、以下のリソースをご活用ください。
安全なコーディングを!
CTFを始めよう
オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。