GitHub向けReachable Vulnerabilitiesで脆弱性を特定、優先順位付け、修正
2021年1月28日
0 分で読めますJavaプログラマーとして、サードパーティライブラリのセキュリティ上の問題を見つけるためにSnyk Open Sourceのスキャンを使うことにしたと想像してみてください。いい判断です!
しかし、リポジトリをSnyk Open Sourceスキャナーに接続すると、依存しているパッケージに10件、あるいは50件もの脆弱性があることがわかりました。まず何から始めればよいのでしょうか?
理想的には、すべての問題を修正して脆弱性をゼロにしたいものです。それが常に実現可能とは限らないことは、誰もがわかっています。さらに、すべての脆弱性を一度に修正できるとは限りません。まずは、アプリケーションに影響を与えるリスクの高い問題から脆弱性の修正に取り組みましょう。どのように進めるか見ていきましょう。
アプリケーション
Mavenベースの小さなJavaアプリケーションを作成し、GitHubに公開しました。このアプリケーションはURLを受け取り、そのURLにGETリクエストを実行します。結果ページには、プレーンテキストで出力が表示されます。出力はWebページのHTMLの場合もあれば、たとえばRESTエンドポイントの応答の場合もあります。リクエストの実行には、pomファイルに記載されているように、ApacheのHTTPクライアントといくつかの依存関係を使用しています。

GitHubリポジトリのセキュリティ脆弱性を特定する
オープンソースの依存関係にあるセキュリティ脆弱性を特定するため、GitHubリポジトリをSnykに接続しました。また、現在ベータ版のReachable Vulnerabilities機能を有効にしました。この切り替えは、Settings -> Integration -> GitHub Edit Settingsにあります。ここで使用する機能はすべて、Snykの無料プランに含まれています。
![Reachable Vulnerabilities分析の設定ページ。機能が有効になっていること、リポジトリのクローンに関する警告、[変更を保存]ボタンが表示されています。](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1673461057/reachable-vulns-analysis-enabled.png)
SnykによるGitHubリポジトリのスキャンが完了すると、使用しているオープンソースパッケージから多くの脆弱性を引き継いでいることがわかります。しかし、Reachable Vulnerabilities機能を使うと、以下のようなコードから脆弱性に到達できるかどうかを確認できます。

脆弱性修正の優先順位を付ける
不適切な入力検証の脆弱性は、Apache httpclientバージョン4.3.1に存在する重大度「高」の問題です。SnykのUIでは、脆弱な関数にURLServletのdoPostメソッドから到達できることが示されています。この問題は、URI入力が正しく検証されず、ソフトウェアに被害を与える可能性があることに関係します。いくつかテストしたところ、少なくとも1つの問題が見つかりました。
URIでは、ホスト名の認証情報を分割できます。たとえば、http://bmv:pwd@snyk.ioはドメインsnyk.ioを指します。しかし、認証情報のパスワード部分に@をもう1つ入れると、URLの解析を突破できます。つまり、http://bmv:pwd@foojay.io:80@snyk.ioを指定すると、snyk.ioではなくドメインfoojay.ioの結果が返されます。

到達可能性フラグは、SnykプラットフォームのGitHubインテグレーションでJava Mavenプロジェクトに利用できます。これは、アプリケーションの脆弱性修正に優先順位を付けるうえで欠かせないツールです。このフラグが付く場合、コードからインポートしたパッケージの脆弱なメソッドに至る経路が存在します。
GitHubインテグレーションで到達可能性を計算するため、Snykはコードをフォークして調査します。コールグラフを作成し、既知の脆弱性があるメソッドに至る経路があるかどうかを分析します。経路が見つかると、その脆弱性に「reachable」バッジが付きます。また、脆弱性が到達可能であることは、右上に表示される優先度スコアにも影響します。このスコアは複数のヒューリスティックを集約したもので、開発者が自分の状況でより大きな害をもたらす脆弱性を判断し、修正時に優先度を高く設定できるよう支援します。

SnykのUIを下にスクロールすると、snakeyamlパッケージのサービス拒否の問題を含め、さらに脆弱性が表示されます。この脆弱性には到達可能性フラグが付いていません。サンプルプログラムではインポートしているだけで、実際には呼び出していないためです。

まとめ
GitHubインテグレーション向けのReachable Vulnerabilitiesは、脆弱性修正をどこから始めるか、どの脆弱性から解決するかについて、すべてのユーザーがより適切な判断を下せるよう支援する、強力な無料機能です。
ただし、到達可能性フラグのない脆弱性を安全に無視できるという意味ではありません。こうした脆弱性もアプリケーションの一部であり、別の方法で悪用される可能性があります。
特にJavaには、リフレクションAPIなどがあります。また、すべてのクラスがクラスパスから利用できます。つまり、アプリケーションで任意コード実行が可能な場合、利用可能なすべてのクラスが読み込まれ、悪用される可能性があります。
ここでお伝えしたいのは、直接到達できない脆弱性も、一連の事象を経て悪用される可能性があるということです。それでも、Reachable Vulnerabilitiesを使えば、アプリケーションをより優れた安全なものにするために、どこから取り組めばよいかがわかります。さあ、無料のSnykアカウントを作成して、ぜひお試しください!
このブログ記事で使用したアプリケーションは、こちらのGitHubリポジトリでご覧いただけます。
Capture the Flagを始めよう
オンデマンドのバーチャル入門ワークショップを見て、Capture the Flagの課題の解き方を学びましょう。


