log4j 2の脆弱性

本記事はAdvent Calendar 2021年度版!! の12日目の記事です

adventar.org

当初は推しの記事を書こうと思ってたのですが最近Twitterで面白いニュースを見つけたのでそちらを紹介していきたいと思います。

紹介するのはlog4j 2の脆弱性についてです。
また、少し探せば攻撃用のコード例が出て来るくらい有名ですが本記事ではコードを掲載しない形とさせていただきます。

log4j 2とは

javaプログラム用のログAPIです。 log4j 2はlog4jのアップグレード版であり、2とはバージョンのことのようです。

log4j 2の脆弱性

log4jにはLookupという機能があり、これはログとして入力された文字列を置換するものです。
例えば、実行中のjavaのバージョンを出力したい場合は

${java:tuntime}

とログに出力させるようにする事で${java:tuntime}がjavaのバージョンに置換されるようです。

その中でもJNDI Lookupというものがあり、ネットワークを通じて変数にあたる値を取得し置換するAPIで、LDAPにも対応しています。
また、上記の機能ではログに出力する部分を特定の形式にする事で、置換するだけでなく任意のLDAPサーバーからjava classファイルをダウンロードし読み込むことができてしまうそう。

つまり、攻撃者は自前で用意したLDAPサーバーを用意し、なんらかの形で悪意あるログ出力させることで自前のLDAPサーバーから任意の処理を対象のサーバーで実行させることができます。

なぜここまで有名になったのか

log4j 2はjavaで使用されるlogライブラリの中でも有名である事やユーザー(攻撃者)がログに出力される文字列を操作可能なだけで実行できる1、ゼロデイ脆弱性で対策が見つかっておらず攻撃し放題だったなどの理由が挙げられます。

対象バージョン

対象となるバージョンはLog4j 2.14.1より前の2系のバージョン

対策・回避策

Log4j 2.15.0へのバージョンアップ(Log4j 2.15.0からはデフォルトでJNDI lookupが無効になっているそうです。)
また、すぐにバージョンアップできない場合でも、後からJNDI lookupを無効にする事で問題は回避できるとのこと。

最後に

間違いや表現が間違っている所があれば教えていただけると幸いです。

参考文献

Apache log4j 1.2 - Short introduction to log4j

Log4j – Apache Log4j 2

第 10 章 JNDI リソース

log4jの脆弱性について


  1. log4j 2が使用されているjava製のサービスである事とJNDI lookupが有効である事が前提です。