Thoth を使用して Python の欠陥チェックを自動化する
Project Thoth は、解決プロセスの一部としてセキュリティ チェックを行うプログラムのビルドを自動化するために、多くのオープン ソース ツールをまとめています。
ほとんどのサイバー攻撃は、公に知られている脆弱性を利用します。多くのプログラマーは、継続的インテグレーション/継続的デプロイメント (CI/CD) または DevOps テクニックを使用してビルドを自動化できます。しかし、さまざまな無料およびオープンソース ライブラリで時間ごとに見つかるセキュリティ上の欠陥のチェックをどのように自動化できるでしょうか?現在、アプリケーションの構築時にバグのあるバージョンのライブラリを見つけ出す方法が数多く存在します。
この記事では、依存関係のセキュリティをチェックするための高度なツールを備えた Python に焦点を当てます。特に、この記事では Project Thoth について説明します。これは、解決プロセスの一部としてセキュリティ チェックを行う Python プログラムのビルドを自動化するために、これらのツールの多くをまとめたものだからです。著者の一人であるフリドリンは、トートへの重要な貢献者です。
自動化されたセキュリティへの取り組みへの入力
このセクションでは、脆弱性に関する情報を一般に提供するための取り組みをリストします。記事の主題であるオープンソース Python ライブラリの脆弱性のレポートに関連するツールに焦点を当てています。
Common Vulnerability and Exposures (CVE) プログラム
ソフトウェア セキュリティに関する議論は、何千人もの散在する研究者によって発見された欠陥をまとめた包括的な CVE データベースから始める必要があります。この記事の他のプロジェクトは、このデータベースに大きく依存しています。これは米国国立標準技術研究所 (NIST) によって維持されており、その追加機能はオープンソース ソフトウェアに特化し米国政府の支援を受けている非営利法人 MITRE によってキュレーションされています。 CVE データベースは、CVE 詳細統計サイトなど、多数の関連プロジェクトにフィードを提供します。
以下に示すように、人間または自動ツールは、構造化された形式でセキュリティの脆弱性に関連する正確なパッケージとバージョンを、脆弱性を説明するあまり構造化されていないテキストとともに見つけることができます。
(フリドリン・ポコルニーとアンディ・オラム、CC BY-SA 4.0)
Python Packaging Authority によるセキュリティへの取り組み
Python Packaging Authority (PyPA) は、Python 言語のオープンソース パッケージのベスト プラクティスを作成する主要な組織です。多くの企業のボランティアが PyPA をサポートしています。 PyPA によるセキュリティ関連の取り組みは、Python を堅牢にする上で大きな進歩です。
PyPA のアドバイザリー データベースは、Python パッケージの既知の脆弱性を機械可読形式で収集します。 PyPA がサポートするさらに別のプロジェクト pip-audit は、アプリケーション要件を監査し、使用されているパッケージの既知の脆弱性を報告します。 pip-audit からの出力は、人間が判読できる形式と、JSON などの構造化形式の両方を使用できます。したがって、自動ツールはアドバイザリー データベースまたは pip-audit を参照して、依存関係のリスクについて開発者に警告できます。
PyPI のメンテナである Dustin Ingram によるビデオでは、これらのプロジェクトがどのように機能するかを説明しています。
オープンソースの洞察
Open Source Insights と呼ばれる取り組みは、一般的な言語エコシステムの依存関係に関する情報を構造化された形式で提供することで、オープンソース開発者を支援しようとしています。このような情報には、セキュリティ勧告、ライセンス情報、ライブラリの依存関係などが含まれます。
Open Source Insights を少し実践するために、人気のある TensorFlow データ サイエンス ライブラリを調べたところ、(この記事の執筆時点で) PyPI に関するセキュリティ アドバイザリがあることがわかりました (以下を参照)。 「詳細」ボタンをクリックすると、勧告の調査に役立つリンクが表示されます (2 番目の画像)。
(フリドリン・ポコルニーとアンディ・オラム、CC BY-SA 4.0)
(フリドリン・ポコルニーとアンディ・オラム、CC BY-SA 4.0)
興味深いことに、Node.js パッケージ マネージャー (npm) によって提供される TensorFlow のバージョンには、当時セキュリティ アドバイザリーがありませんでした。この場合に使用されるプログラミング言語が違いの理由である可能性があります。ただし、明らかな矛盾は、出所が大きな違いを生む可能性があることを思い出させ、依存関係を解決する自動プロセスがそのような問題にどのように適応できるかを示します。
Open Source Insights は、Python パッケージをクリーンな環境にインストールすることで、そのパッケージの依存関係情報を取得します。 Python パッケージは、オープン ソース Python ライブラリをリストする最も人気のあるインデックスである PyPI から、Python ライブラリ用の最も人気のあるインストール ツールである pip リゾルバーによってインストールされます。各パッケージの脆弱性情報は、オープンソース脆弱性データベース (OSV) から取得されます。 OSV はトリアージ サービスとして機能し、複数の言語エコシステムにわたって脆弱性をグループ化します。
Open Source Insights に API があれば、非常に貴重なリソースになります。開発者がある時点で追加することを期待しています。現在、情報は Web ページとしてのみ利用可能ですが、構造化された形式により、自動化ツールがページを収集し、セキュリティ勧告などの重要な情報を探すことができます。
Open Source Security Foundation によるセキュリティ スコアカード
ソフトウェアの品質はセキュリティと密接に関係していますが、変更をリポジトリにチェックインする前の回帰テストの実施、リリースへの暗号署名の添付、静的分析の実行などの基本的な実践が必要です。これらの慣行の一部は自動的に検出できるため、セキュリティ専門家は大規模なプロジェクトのセキュリティを評価できます。
2020 年に開始され、Open Source Security Foundation (OpenSSF) の支援を受けた Security Scorecards と呼ばれる取り組みには、現在、そのような自動チェックが数十件リストされています。これらのチェックのほとんどは GitHub サービスに依存しており、GitHub に保存されているプロジェクトに対してのみ実行できます。オープンソース プロジェクトにおける GitHub の優位性を考えると、このプロジェクトは依然として非常に有用であり、より一般的な評価システムのモデルとなっています。
プロジェクト・トート
Project Thoth は、Python プログラマーが堅牢なアプリケーションを構築するのに役立つクラウドベースのツールです。このタスクには、セキュリティ チェックや他の多くの考慮事項が含まれます。 Red Hat が Thoth を開始し、Red Hat OpenShift クラウド サービスで実行されますが、そのコードは完全にオープンソースです。このプロジェクトは、Python 開発者間のコミュニティを構築しました。開発者は、プロジェクトのイノベーションを他のプログラミング言語でコピーできます。
プログラマーがライブラリを見つけてアプリケーションを構築するのに役立つツールはリゾルバーと呼ばれます。一般的な pip リゾルバーは通常、各ライブラリの最新バージョンを選択しますが、依存関係グラフと呼ばれる階層内の依存関係の依存関係を考慮できるほど高度です。 pip は、依存関係グラフを走査することで見つかったバージョン範囲の仕様を処理するために、ライブラリの別のバージョンをバックトラックして選択することもできます。
依存関係の最適なバージョンを選択することに関しては、Thoth は pip よりもはるかに多くのことを行うことができます。ここでは、セキュリティにどのように役立つかに特に注目して、Thoth の概要を説明します。
トートの概要
トート氏は、依存関係をインストールするときにプログラムの環境の多くの要素を考慮します。これには、プログラムが実行される CPU とオペレーティング システム、Skopeo によって抽出されたものなどのアプリケーションのコンテナに関するメタデータ、さらには機械学習アプリケーションが使用する GPU に関する情報も含まれます。 。 Thoth は他のいくつかの変数を考慮できますが、前述のリストから、Thoth が最初にコンテナーでの機械学習をサポートするために開発されたことがおそらく推測できるでしょう。開発者は、構成ファイルでアプリケーションの環境に関する情報をトートに提供します。
環境情報にはどのようなメリットがあるのでしょうか?これにより、Thoth は、指定された環境で既知の脆弱性を持つライブラリのバージョンを除外できます。ビルドが失敗したり、実行中に問題が発生したことに気付いた開発者は、将来のユーザーのためにトートが参照する処方箋と呼ばれる仕様に、どのバージョンの依存関係を使用するか回避するかに関する情報を保存できます。
トートは、プログラムとその環境に対してテストを実行することもできます。現在、Clair を使用してコンテナ イメージのコンテンツに対して静的テストを実行し、見つかった脆弱性に関する情報を保存しています。将来的には、Thoth の開発者は、Bandit という名前の Python Code Quality Authority (PyCQA) のプロジェクトを使用して、ライブラリ バージョンのさまざまな組み合わせで実際のアプリケーションを実行することを計画しています。トートは、各パッケージのソース コードに対して個別に Bandit を実行し、解決プロセス中に結果を結合します。
さまざまなライブラリのバージョンが異なると、組み合わせ爆発 (考えられる組み合わせが多すぎてすべてをテストできないこと) が発生する可能性があります。したがって、トートは、依存関係の解決をマルコフ決定プロセス (MDP) としてモデル化し、実行する最も生産的なサブセットを決定します。
セキュリティが最大の関心事ではない場合もあります。たとえば、インターネットから隔離されたプライベート ネットワークでプログラムを実行することを計画しているとします。その場合、セキュリティよりもパフォーマンスや安定性など、他の利点を優先するようにトートに指示できます。
トートは、依存関係の選択をロック ファイルに保存します。ロック ファイルは、特定の依存関係の特定のバージョンを「ロックイン」します。ロック ファイルがないと、微妙なセキュリティの脆弱性やその他のバグが運用アプリケーションに侵入する可能性があります。最悪の場合、ロックを行わないと、ユーザーはいわゆる「依存関係の混乱攻撃」に直面する可能性があります。
たとえば、リゾルバーが通常依存関係を取得するインデックスが一時的に利用できないため、リゾルバーはバグのあるバージョンのインデックスからライブラリを取得することを選択する場合があります。
もう 1 つのリスクは、攻撃者がインデックス内のライブラリのバージョン番号を増やし、そのバージョンが最新であるためリゾルバーがそのバージョンを選択する可能性があることです。目的のバージョンは別のインデックスに存在しますが、より最新であると思われるバージョンが優先されて無視されます。
まとめ
Thoth は、複雑かつ成長を続けるオープンソース ツールのコレクションです。依存関係の解決の背後にある基本原則は、他のプロジェクトのインスピレーションとなる可能性があります。それらの原則は次のとおりです。
- リゾルバーは、CVE データベースなどの Web サイトをスクレイピングし、静的チェックを実行し、その他の情報ソースを通じて脆弱性を定期的にチェックする必要があります。結果はデータベースに保存する必要があります。
- リゾルバーは、依存関係の依存関係を調べ、バグやセキュリティ上の欠陥により、リゾルバーが以前に行った決定を変更する必要があることが判明した場合には、バックトラックする必要があります。
- リゾルバーの結果と、リゾルバーを使用する開発者によって返された情報は保存され、将来の意思決定に使用される必要があります。
つまり、最近ではセキュリティの脆弱性に関する豊富な情報が入手できるため、依存関係の解決を自動化し、より安全なアプリケーションを作成できるようになります。