🤔

GitHub の Dependabot Alerts とは何か

9 min read

この記事はセキュリティ Advent Calendar 2020 の19日目です。

はじめに

GitHub を利用している人で JavaScript などの言語を使っている場合、Dependabot Alerts は日常的に見かけるものであり、日頃からなんとなくその恩恵に預かっているのではないでしょうか。

npm audit でも同様にライブラリの脆弱性を検知する機会はありますが、この機能は明示的に npm audit コマンドを叩いた時や npm install を実行した時などしか利用できないため、使用しているライブラリに新たな脆弱性が検知された時に自動的に通知してくれる Dependabot Alerts は非常に便利な機能です。

しかし、この通知がどういったリポジトリを対象にしていて、どのようなデータに基づいて通知しているのか、説明できるほどの知識がなかったので改めて調べてみました。

Dependabot とは何か

Dependabot は依存パッケージの脆弱性を検知し、それを解決するためのプルリクを自動で生成してくれるサービスです。
元々独立したサービスでしたが、2019年に GitHub が買収したことにより、現在は GitHub 公式の機能として利用されています。
この記事では GitHub が格リポジトリに対して自動的に通知してくれる Dependabot Alerts を対象に話を進めますが、現在も GitHub の Marketplace から個別に利用できます。

後述する通り自動的に通知される Alerts がサポートしているエコシステムには限りがありますが、個別にインストールした場合は alpha 版の機能である RustGo にも対応しているようです。

Dependency Alerts が通知する脆弱性とは何か

GitHub はリポジトリ内の脆弱な依存関係を検出したときに Dependabot のアラートを作成し、その内容はリポジトリのセキュリティタブに表示されます。

アラートが作成されるタイミングは以下です。

  • 新しい脆弱性が GitHub Advisory Database に追加された時
  • WhiteSource から新しい脆弱性のデータが処理された時
  • コントリビューターがリポジトリの Dependency graph を更新した時

もう少し詳しく見ていきましょう。

リポジトリの Dependency graph とは何か

まず、基本的な概念である Dependency graph(依存関係グラフ)について説明します。

GitHub の Dependency graph はリポジトリに格納されているマニフェストとロックファイルに基づいて作成されます。
これはリポジトリページの [insights] > [Dependency graph] から確認できます。

もしプライベートリポジトリでこの機能が有効化されていない場合は、リポジトリページの [Settings] > [Security & analysis] から有効化できます。

サポートされているマニフェストやロックファイルを変更したり、デフォルトブランチに追加したりするコミットを GitHub にプッシュすると、依存関係のグラフが自動的に更新されます。
サポートされているエコシステムとマニフェストファイルについては以下の「サポートしているエコシステム」を参照してください。

Dependency graph の制限事項

以下の2つのケースでは Dependency graph に制限を与えることに注意が必要です。

  1. Processing limits
    • 0.5 MB を超えるサイズのマニフェストは、エンタープライズアカウントでのみ処理されます。それ以外のアカウントでは、0.5MB を超えるマニフェストは無視され、Dependabot アラートは作成されません。
    • デフォルトでは、GitHub はリポジトリごとに 20 個以上のマニフェストを処理しません。制限を増やす必要がある場合は、GitHub サポートか GitHub プレミアムサポートに連絡が必要
  2. Visualization limits
    • リポジトリ Dependency graph ビューには100個のマニフェストしか表示されません。GitHub 内に表示されていないマニフェストに対しても Dependabot Alerts は作成されます。

GitHub Advisory Database とは何か

GitHub Advisory Database には、GitHub の Dependency graph によって追跡されるパッケージにマップされた脆弱性のキュレーションされたリストが含まれています。
登録される脆弱性は以下のソースに基づいています。

重要度のレベルは CVSS バージョン 3.0 標準に従って決定されますが、GitHub は Low 〜 Critical のレベルのみを通知し、CVSS のスコアは公開していません。

実際に使っていると npm audit は時々大量の Low レベルの脆弱性を大量に検知することがありますが、私は Dependabot Alerts が大量(数百件とか)のアラートをあげるようなケースに遭遇したことはありません。
これは GitHub が独自にキュレーションをすることによって、実際に刺さらないような脆弱性を事前に省いているためかと考えています。(希望的観測)

なお、GitHub Advisory Database は2019年11月に開始され、当初は2017年からサポートされているエコシステムの脆弱性情報を含むように構成されています。データベースに CVE を追加する際には、より新しい CVE、およびより新しいバージョンのソフトウェアに影響を与える CVE を優先的にキュレーションするとのことです。

WhiteSource から通知されるデータとは何か

以前 Software Design で連載されていた DevSecOps の記事でも紹介されていたので知っている人も多いかもしれませんが、WhiteSource は OSS のセキュリティやライセンス管理を行うサービスであり、そのサービスを提供する会社です。

GitHub の公式ドキュメントが指しているリンクは WhiteSource Vulnerability Database なので、おそらくここに追加された脆弱性が対象となっているのだと考えられます。

WhiteSource のオープンソース脆弱性データベースは、200 以上のプログラミング言語と 300 万以上のオープンソース コンポーネントをカバーしていて、NVD、security advisories、OSS の Issue Tracker など、さまざまなソースからの情報を 1 日に何度も集約しているとのこと。
昔書いた記事でも一度お値段を調べたのですが、会社として個別に導入しようとすると中々お高い製品です。

サポートしているエコシステム

Dependabot Alerts は上述の Dependency graph に基づいて解析を行うため、サポートされるのは言語ではなくパッケージマネージャー単位になります。

そのため、Python で setup.py 内に依存関係が記載されている場合や、Java や Scala でも Maven を使っていない場合はアラートが作成されないことに注意してください。
また、対象のエコシステムを利用している場合でも package-lock.json をリポジトリにコミットしていないケースでもその恩恵は受けられません。

対象のパッケージマネージャーはこの公式ドキュメントの下の方に記載されています。

サポートしているリポジトリ

パブリックリポジトリでは自動的に適用されます。
プライベートリポジトリでも、上述の通り、[Settings] > [Security & analysis] で有効化することで使えるようになります。
公式の Configuring Dependabot security updates ではサポートされているリポジトリの中でフォークやアーカイブリポジトリを対象外と書いていますが、恐らく Dependabot Alerts も同じ条件が当てはまるんじゃないかと思います。(憶測)

注意事項

About alerts for vulnerable dependencies には以下の注意が記載されています。

GitHub のセキュリティ機能はすべての脆弱性を網羅しているわけではありません。私たちは常に脆弱性データベースを更新し、最新の情報でアラートを生成しようとしていますが、すべての脆弱性を把握したり、既知の脆弱性について保証された時間内にお伝えすることはできません。これらの機能は、潜在的な脆弱性やその他の問題について、各依存関係を人力でレビューすることに代わるものではなく、必要に応じてセキュリティサービスに相談するか、徹底的な脆弱性レビューを行うことをお勧めします。

どのように Dependabot Alerts と向き合っていくべきか

注意事項でも触れた通り、Dependabot Alerts があるからといっても人力でのライブラリの調査やセキュリティ・レビューが重要なことに変わりはないようです。

細かいことを言い出せば、GitHub はグローバルなサービスなので JVN でのみ登録されている脆弱性まで検知することはありませんし、前述の通りサポートしているエコシステムには限りがあります。また、2017年より前に報告された脆弱性は検知の対象とならない可能性があります(そんなに長いことメンテされていないライブラリはそもそも使うべきではありませんが)。
他にも Windows や Android などのプラットフォームの脆弱性というものもあって、これらはプラットフォームのメンテナが対応するべき問題ではありますが、アプリケーションの開発者も状況に応じてサポート OS のバージョンを適切に更新していく必要があります。

突き詰めるとセキュリティは終わりのない戦いになってしまうので、アプリケーションの要件に応じて対応するレベルを適切に設定することが重要です。
その中でも OSS の脆弱性の検知と対処は特に重要な要素であり、保守すべき対象のアプリケーションが上述のエコシステムを適切に使用している場合、Dependabot Alerts は非常に優秀です。

Dependabot Alerts がどのようなデータを元にどのような通知をしてくれるのかを理解した上で、他のセキュリティ施策と組み合わせて使っていくのが効果的だと考えています。

以上になりますが、もし間違えている箇所などありましたら、コメントやプルリクをいただけましたら幸いです。

References