Skip to main content

Mavenプロジェクトの脆弱性を修正する

Maven feature

2020年9月14日

0 分で読めます

Mavenは、Javaエコシステムで現在も最も広く使われているビルドシステムです。JVMレポート2020によると、Mavenはエコシステムで最も利用されているビルドツールで、シェアの3分の2を占めています。

そのため、Mavenの仕組みを理解しておくことが重要です。たとえば、SnykでMavenプロジェクトの脆弱性が見つかった場合、どのように修正すればよいでしょうか?この記事では、すぐには解決方法がわからない場合も含め、Mavenを使用しているときにサードパーティライブラリの脆弱性を修正する方法を説明します。

脆弱性を見つける

Mavenでプロジェクトをビルドし、依存関係を管理している場合、Snykを使ってプロジェクトをスキャンする方法はいくつかあります。実際に使用しているプログラミング言語は問いません。Java、Kotlin、Scala、Groovyなど、Java仮想マシン(JVM)向けに設計された言語であれば利用できます。

SnykでMavenプロジェクトの脆弱性をスキャンするには、次の方法があります。

CLIを例にすると、Snykはトップレベルの依存関係を更新して脆弱性を修正できるかどうか、またその方法を提示します。ただし、トップレベルの依存関係に修正版がない場合は、脆弱性を修正できる、基盤となる依存関係のより新しいバージョンがあるかどうかをSnykが示します。

信頼できないデータのデシリアライズやサービス拒否などのソフトウェア脆弱性と、アップグレードに関するガイダンスを一覧表示するターミナル出力。

トップレベルの依存関係にある脆弱性を修正する

Snykで見つかった脆弱性を修正する最も簡単な方法は、可能であればトップレベルのライブラリを変更することです。ライブラリに基盤となる依存関係がない場合は、該当の問題が修正された新しいバージョンにアップグレードすればよいことは明らかです。基盤となる依存関係に問題がある場合でも、その問題が修正された新しいバージョンのトップレベル依存関係がすでに提供されていれば、同様にアップグレードできます。

バージョンを切り替える方法はいくつかあります。まず、バージョンがどこで指定されているかを確認しましょう。トップレベルの依存関係の場合、通常は次のいずれかに記載されています。

  • 親pom内

  • プロパティ内

  • 依存関係の定義内に直接

親pom

アップグレードが必要な依存関係が親pomで定義されている場合は、まず親pomの新しいバージョンがないか確認しましょう。たとえばSpring Bootで親pomの新しいバージョンがすでに提供されているなら、先にアップグレードして問題が解決するか確認します。この方法なら依存関係一式を更新でき、多くの場合、依存関係を1つだけアップグレードするよりも相互の互換性を保ちやすくなります。親pomを切り替えたり変更したりできない場合は、依存関係に直接指定する方法に進んでください。

<parent>
   <groupId>io.snyk</groupId>
   <artifactId>demo-parent</artifactId>
   <version>1.0.4.RELEASE</version>
</parent>

プロパティ

プロパティが使われている場合は、まずそのプロパティを更新します。これにより他の依存関係も更新される可能性がありますが、親pomの場合と同様、それには理由があります。ライブラリが一式でリリースされている場合、同じバージョンを使用することで、より適切に連携することが期待できます。

<dependency>
  <groupId>org.eclipse.collections</groupId>
  <artifactId>eclipse-collections</artifactId>
  <version>10.4.0</version>
</dependency>

依存関係に直接指定

最後に、依存関係がMavenのpomファイルのdependenciesセクションに宣言されている場合です。ここではgroupId、artifactId、および多くの場合バージョンを指定します。ここでバージョンが宣言されている場合は、更新するだけです。宣言されていない場合は、追加できます。

この方法は依存関係のバージョンを指定する最も優先度の高い方法であり、他のすべてのバージョン指定方法よりも優先されます。

<dependency>
  <groupId>org.eclipse.collections</groupId>
  <artifactId>eclipse-collections</artifactId>
  <version>10.4.0</version>
</dependency>

基盤となる依存関係の脆弱性を修正する

トップレベルの依存関係にまだ新しいバージョンがないものの、基盤となる依存関係の1つに修正が必要な問題があるとします。CLIからは、その問題を解決する基盤となる依存関係の新しいバージョンがあることがすでに通知されています。

BOM(部品構成表)

多くのフレームワークでは、基盤となる依存関係を管理するためにBOM(部品構成表)を使用しています。BOMは、プロジェクトの依存関係のバージョンを管理し、それらのバージョンを一元的に定義・更新するための、特殊な種類のPOMです。

Spring Bootのようなフレームワークで基盤となる依存関係を置き換える必要がある場合、その依存関係がBOMに含まれているか確認してください。含まれている場合は、そのBOMの新しいバージョンが提供されているか確認し、バージョンを更新します。Spring Bootをはじめとする多くの有名なフレームワークでは、BOMのバージョンがプロパティとして指定されています。MavenのPOMファイルにプロパティを追加すれば、そのプロパティを独自に上書きできます。

以下の例では、Spring BootプロジェクトでJacksonのBOMを上書きしています。

<properties>
    <jackson.version>2.10.2.20200130</jackson.version>
</properties>

依存関係の管理

MavenのPOMでは、トップレベルの依存関係を宣言するときに、特定の基盤となる依存関係を除外したり追加したりできます。ただし、複数のライブラリが同じ基盤となる依存関係を共有している場合、これは問題になることがあります。Mavenでは、こうした宣言をdependency managementセクションにまとめるのがベストプラクティスです。このセクションでは、推移的依存関係で検出されたアーティファクトに使用するバージョンを、プロジェクトの作成者が直接指定できます。以下の例に加えて、ドキュメントではdependencyManagementの使い方が詳しく説明されています。

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.yaml</groupId>
           <artifactId>snakeyaml</artifactId>
           <version>1.26</version>
       </dependency>
   </dependencies>
</dependencyManagement>

まとめ

ご覧のとおり、Mavenベースのプロジェクトでは、オープンソース依存関係のセキュリティ問題に対処する方法がいくつかあります。トップレベルの依存関係を更新して直接修正できない場合でも、基盤となる推移的依存関係を除外し、利用可能な新しいバージョンに切り替えることができます。Snyk Open Sourceのスキャンでは、どのバージョンにアップグレードすればよいかがわかります。この記事では、Mavenプロジェクトで適切に設定する方法を紹介しました。

CTFを始めよう

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