Skip to main content

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クライアントといくつかの依存関係を使用しています。

<dependencies>
   <dependency>
       <groupId>org.apache.httpcomponents</groupId>
       <artifactId>httpclient</artifactId>
       <version>4.3.1</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
       <version>3.0.1</version>
       <scope>provided</scope>
   </dependency>
   <dependency>
       <groupId>org.owasp.encoder</groupId>
       <artifactId>encoder</artifactId>
       <version>1.2.2</version>
   </dependency>
   <dependency>
       <groupId>org.yaml</groupId>
       <artifactId>snakeyaml</artifactId>
       <version>1.25</version>
   </dependency>
</dependencies>
http://snyk.ioのURL入力欄と、サイトのHTMLソースコードを表示するリクエスト出力ページがあるWebフォーム

GitHubリポジトリのセキュリティ脆弱性を特定する

オープンソースの依存関係にあるセキュリティ脆弱性を特定するため、GitHubリポジトリをSnykに接続しました。また、現在ベータ版のReachable Vulnerabilities機能を有効にしました。この切り替えは、Settings -> Integration -> GitHub Edit Settingsにあります。ここで使用する機能はすべて、Snykの無料プランに含まれています。

Reachable Vulnerabilities分析の設定ページ。機能が有効になっていること、リポジトリのクローンに関する警告、[変更を保存]ボタンが表示されています。

SnykによるGitHubリポジトリのスキャンが完了すると、使用しているオープンソースパッケージから多くの脆弱性を引き継いでいることがわかります。しかし、Reachable Vulnerabilities機能を使うと、以下のようなコードから脆弱性に到達できるかどうかを確認できます。

Apache HttpClientの入力検証に関する、到達可能な重大度の高い脆弱性を示す詳細レポート。修正方法、コールスタック、脆弱な関数を表示。

脆弱性修正の優先順位を付ける

不適切な入力検証の脆弱性は、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の結果が返されます。

「Request output!」というタイトルのブラウザページに、タイトル「日常的なJava利用に役立つ無料のJava & OpenJDK情報 | foojay」が強調表示されたHTMLソースが表示されている

到達可能性フラグは、SnykプラットフォームのGitHubインテグレーションでJava Mavenプロジェクトに利用できます。これは、アプリケーションの脆弱性修正に優先順位を付けるうえで欠かせないツールです。このフラグが付く場合、コードからインポートしたパッケージの脆弱なメソッドに至る経路が存在します。

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

重大度「高」かつ到達可能と判定されたセキュリティ上の問題:入力値の不適切な検証。件数:673。

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

org.yaml:snakeyamlの中程度の深刻度のサービス拒否脆弱性レポート。バージョン1.26へのアップグレードを推奨

まとめ

GitHubインテグレーション向けのReachable Vulnerabilitiesは、脆弱性修正をどこから始めるか、どの脆弱性から解決するかについて、すべてのユーザーがより適切な判断を下せるよう支援する、強力な無料機能です。

ただし、到達可能性フラグのない脆弱性を安全に無視できるという意味ではありません。こうした脆弱性もアプリケーションの一部であり、別の方法で悪用される可能性があります。

特にJavaには、リフレクションAPIなどがあります。また、すべてのクラスがクラスパスから利用できます。つまり、アプリケーションで任意コード実行が可能な場合、利用可能なすべてのクラスが読み込まれ、悪用される可能性があります。

ここでお伝えしたいのは、直接到達できない脆弱性も、一連の事象を経て悪用される可能性があるということです。それでも、Reachable Vulnerabilitiesを使えば、アプリケーションをより優れた安全なものにするために、どこから取り組めばよいかがわかります。さあ、無料のSnykアカウントを作成して、ぜひお試しください!

このブログ記事で使用したアプリケーションは、こちらのGitHubリポジトリでご覧いただけます。

Capture the Flagを始めよう

オンデマンドのバーチャル入門ワークショップを見て、Capture the Flagの課題の解き方を学びましょう。

続きを読む

Blog

フロンティアモデルは脆弱性を発見した。攻撃者だけがエクスプロイトチェーンを見つけた。

静的解析で欠陥は見つかりましたが、ライブ攻撃テストで侵害につながる連鎖を実証できたのは唯一でした。Evo COS、Claude Security、Claude Code Securityを比較します。

feature insights context
Blog

自律型攻撃はすでに始まっている。防御もそのスピードに追いつかなければならない。

自律型攻撃者によって、防御に使える時間は短くなっています。継続的な検出、修復、検証、予防で、セキュリティチームが攻撃に歩調を合わせる方法をご紹介します。

Blog

AIコーディングエージェントが不適切なアクセス制御を繰り返し実装する理由

AIコーディングエージェントは、コンパイルが通りレビューも通過する一方で、あるテナントのデータを別のテナントに公開してしまう認可ロジックを生成することがあります。不適切なアクセス制御が検出しにくい理由と、その防止策をご紹介します。