おおくまねこ

職業プログラマーです。興味のある話題を書いています。

SpringBoot/Gradleのlogback脆弱性更新したときの方法

はじめに

log4j2 の脆弱性 が2021年12月10日に報告され、

任意のプログラムを実行できる危険性があるため、早急に対応することが必要という事で話題になりました。

logback にも「同じ脆弱性の懸念がある」という報告が12月14日におこなわれました。

https://jira.qos.ch/plugins/servlet/mobile#issue/LOGBACK-1591

これらの脆弱性の対応方法はライブラリのバージョンアップすることになります。

log4j2, logback の更新を自分のレポジトリーで行ったので、実績として残しています。

脆弱性バージョン更新の対応

log4j 2 の脆弱性対応について

私の関係しているものでは log4j2(log4j-core) をログ出力の実装ライブラリとしてつかっているのはなかったのですが、

slf4j は使っていたので、log4j2-api は依存として含まれていました。

脆弱性の原因とされていた JNDI lookup 機能は log4j-core で使われているので、関係ないのですが、

影響度が大きさと、あげない理由もなかったので対応しておこうと思いました。

その時に参考にさせていただいたブログは以下になります。

自分は SpringBoot/Gradle/io.spring.dependency-management plugin の構成だったので、

上で参考にさせていただいたブログのとおり、以下の記述を build.gradle に設定することで対策できました。

ext['log4j2.version'] = '2.15.0'

※ブログ記載現時点で lookup 機能自体が削除された 2.16.0 がリリースされているので、そちらを使うのが良いと思います。

補足

この方法が良いと思ったのは、関連する log4j 2 のライブラリバージョンをまとめてバージョンアップできるためです

dependencies で個別のライブラリのバージョンを更新しても対象のライブラリの更新は可能ですが、

他にも log4j 2 関連の依存ライブラリが含まれていて、更新しておけばよかったとか、

log4j 2 のバージョンが異なって食い合わせが良くないとが発生するのが気になるところが懸念としてありました。

※バージョン違いによる懸念は参考にさせてもらったブログにも書かれていましたね。IFやシグネチャの変更などが理由。

logback脆弱性対応

12月14日時点ですでに対応版の 1.2.8 がリリースされているので対応しました。

log4j 2 と同様にgradleextlogback のバージョンを指定することでバージョン更新可能です。

  • build.gradle
ext['logback.version'] = '1.2.8'

アップデートの確認。依存する logback1.2.8 に更新されているのが確認できる

> .\gradlew dependencies |findstr logback
|    |    |    +--- ch.qos.logback:logback-classic:1.2.7 -> 1.2.8
|    |    |    |    +--- ch.qos.logback:logback-core:1.2.8
|    |    |    +--- ch.qos.logback:logback-classic:1.2.7 -> 1.2.8
|    |    |    |    +--- ch.qos.logback:logback-core:1.2.8
|    |    |    +--- ch.qos.logback:logback-classic:1.2.7 -> 1.2.8
|    |    |    |    +--- ch.qos.logback:logback-core:1.2.8
|    |    |    +--- ch.qos.logback:logback-classic:1.2.7 -> 1.2.8
|    |    |    |    +--- ch.qos.logback:logback-core:1.2.8
|    |    |    +--- ch.qos.logback:logback-classic:1.2.7 -> 1.2.8
|    |    |    |    +--- ch.qos.logback:logback-core:1.2.8

追伸

build.gradledependencies にライブラリを直接している場合は注意した方がよさそうです。

そちらにバージョン指定していた場合、そちらが優先されるため。

dependencies {
    // log
    implementation "ch.qos.logback:logback-core:1.2.7"
}
> .\gradlew dependencies |findstr logback
|    |    |    +--- ch.qos.logback:logback-classic:1.2.7 -> 1.2.8
|    |    |    |    +--- ch.qos.logback:logback-core:1.2.8 -> 1.2.7
+--- ch.qos.logback:logback-core:1.2.7
+--- ch.qos.logback:logback-core:1.2.7 (n)
|    |    |    +--- ch.qos.logback:logback-classic:1.2.7 -> 1.2.8
|    |    |    |    +--- ch.qos.logback:logback-core:1.2.8 -> 1.2.7
+--- ch.qos.logback:logback-core:1.2.7
|    |    |    +--- ch.qos.logback:logback-classic:1.2.7 -> 1.2.8
|    |    |    |    +--- ch.qos.logback:logback-core:1.2.8 -> 1.2.7
+--- ch.qos.logback:logback-core:1.2.7
|    |    |    +--- ch.qos.logback:logback-classic:1.2.7 -> 1.2.8
|    |    |    |    +--- ch.qos.logback:logback-core:1.2.8 -> 1.2.7
+--- ch.qos.logback:logback-core:1.2.7
|    |    |    +--- ch.qos.logback:logback-classic:1.2.7 -> 1.2.8
|    |    |    |    +--- ch.qos.logback:logback-core:1.2.8 -> 1.2.7
+--- ch.qos.logback:logback-core:1.2.7

最後に

迅速な対応をいただいたライブラリメンテナーの皆様、 情報共有をいただけた皆様にまことに感謝いたします。