30億のデバイスで任意コードが実行できちゃうJava


免責事項

こちらの記事で紹介する内容は、教育目的または脆弱性について仕組みを理解し周知、啓発を行うためだけに作成しております。
ぜったいに、悪用しないでください。
記載されているコードを実行した場合に発生した損害には一切責任を負いません。
理解される方のみ下にスクロールしてください。

経緯

2021/12/9にて、超有名なログ出力ライブラリであるlog4jの第2世代で任意コードが実行可能であると報告されました。


※上記は特定の文字列をログ出力させることで、ペイントツール(draw.exe)を実行している

Minecraft(Java版)のチャット機能にてこの脆弱性を利用した攻撃があり、修正パッチの適用に追われているそうです。

log4jとは

Java言語でWebアプリケーションやシステムを構築する際のロガーライブラリである。
Apache財団というOSSを支援する団体が提供・メンテナンスをしている。
導入も容易でかつ設定ファイル次第では細かなログ設定が可能となっており、日本以外にも世界中のシステム内で利用されている1

原因

文字列を出力するログの機能がなぜ問題になっているのかと言うと、
log4j2は他のログライブラリと違い、文字列の中を確認し、特定の文字列の場合は、変数に置き換える機能がある。(lookupというらしい)

上記だけなら問題ないのだが、今回悪用されているのはJdni Lookupという仕組みであり、変数をネットワーク越しに検索する仕組みである。
検索して見つけた値は、サーバ内で実行されるため、任意のプログラムをサーバ内で実行することが可能というわけである。

仕組み

一例ではありますが、仕組みを図で表してみました。

⓪ 前提2

  • ユーザが入力した文字列をそのままログ出力するようなシステム
  • システムプロパティのlog4j2.formatMsgNoLookupsが無効になっていること
  • システムプロパティのcom.sun.jndi.ldap.object.trustURLCodebaseが有効になっていること

① 攻撃(任意)コードの注入

チャットなどログに入力値がそのまま出力される機能に対して、任意のコードを入力します。

② 中間サーバへアクセス

サーバ(Minecraft)はJndi Lookup機能にて、変数を攻撃者が用意した中継サーバに検索しに行きます。
中継サーバは、さらに攻撃者が用意したWebサーバへリダイレクトします。

③ Webサーバへリダイレクト

Webサーバではリクエストパスに記載されている値に該当する任意のプログラムファイルを返却します。Javaの場合は.classファイルでしょう。

④ 悪意のあるプログラムの実行

.classファイルに記載された内容をサーバが実行します。ここまで来てしまうと何をされるか分かったもんじゃありません。

検証

上記の仕組みを利用し、ローカル環境上にて脆弱性の検証を行いました。

  • 利用環境(OS):MacBook
  • Mincraft3(左上):Eclipse 2021-03 (4.19.0)
  • 中継サーバ(右上):marshalsec.jndi.LDAPRefServer
  • Webサーバ(右下):PythonのHTTP.Serverモジュール
  • 悪意のあるプログラム(左下):サーバ内ある(と想定)Calculator.app(電卓)を起動

対策

この脆弱性はCVE-2021-44228と定義されました。記事の内容を要約すると。

  • log4j-api および log4j-coreのバージョンを2.15.0にする
  • システムプロパティのlog4j2.formatMsgNoLookupsを有効にする
  • システムプロパティのcom.sun.jndi.ldap.object.trustURLCodebaseを無効にする
  • クラスパスからJndiLookupクラスを削除する

log4jを使わないようシステム改修する方法は現実的ではないと思いますので、いずれかの方法をとって対策する必要があります。

マイクラで遊んでいる子ども達、もしくは上記に関わるサーバ運営の方。
早急に対応の程よろしくお願い致します。

まとめ

ここまで熱を入れて記事を書くことになると思いませんでした。
Javaを愛するIT講師として、ITエンジニアを育成するものとして、この騒動は早く収まって安心して授業できるといいなぁ
(「だからJavaは..」とか言われたくないな..)


  1. iCloudやSteamなど世界規模でユーザが多いサービスにも影響 https://www.itmedia.co.jp/news/articles/2112/10/news157.html 

  2. NIST https://nvd.nist.gov/vuln/detail/CVE-2021-44228 

  3. Minecraftを使用するわけにいかないので、簡単なWebアプリケーションで作成