全3039文字

Javaのログ出力ライブラリー「Apache Log4j」に致命的な脆弱性があった。Log4jは広く利用されており、インターネットの安全性を根底から揺るがす。対策が難しい場合は一時的なサーバー停止なども視野に入れる必要がある。

 「もうインターネットの終わりではないか」。2021年12月10日に明らかになったある脆弱性をめぐって、システム管理者やソフトウエアエンジニアの間に激震が走った。広く使われているJavaのログ出力ライブラリー「Apache Log4j」(以下、Log4j)で任意のJavaプログラム(クラス)を実行できる脆弱性「CVE-2021-44228」(通称「Log4Shell」)だ。

 脆弱性の公開直後には、米アップルや米グーグル、米テスラといった名だたる企業のサービス、あるいは米マイクロソフトのゲーム「Minecraft」などが攻撃可能な状態になっていたことが明らかになった。インターネットの安全性を根底から揺るがしかねない事態である。

任意のJavaプログラムを実行

 Log4Shellが危険な理由はいくつかある。まず、Log4jが極めて広い範囲で使われている点だ。GMOインターネットの新里祐教特命担当技術分析官は「Log4jは古くから使われており、Javaのログ出力ではデファクトスタンダードといっていい。Javaによるほとんどのアプリケーションやサーバーソフトウエア、フレームワークに組み込まれている。攻撃を受ける範囲はJava製品全般といってもおかしくない」と語る。ユーザーが使用しているアプリケーションやシステムにLog4jが組み込まれている場合、気づかないうちに脆弱性の影響を受けることになる。

 自社のシステムではJavaを利用していないからといって油断は禁物だ。新里技術分析官は「一見Javaを使っていないミドルウエアでもJavaを利用しているケースがある」と指摘する。例えば、Pythonで書かれたミドルウエアの一部でJavaを利用している例があったという。見落としがちなのが、Log4jが機器に組み込まれているケースだ。例えば米シスコシステムズがLog4Shellの自社製品への影響について公表している。

 Log4Shellでは、こうした幅広い対象に対して任意のJavaプログラムを実行するという強力な攻撃が可能だ。重要データの取得や改ざん、マルウエア感染などやりたい放題である。攻撃の実行が容易な点も見逃せない。新里技術分析官によると「誰でも簡単にできる」という。セキュリティーリサーチャーのpiyokango氏は「この脆弱性は攻撃手法を応用しやすいので、現在進行形で状況が変動している点に注意すべきだ。影響を受けるかどうかを判断するための情報は出尽くしていない。JPCERT/CCも情報を随時アップデートしているので、しばらくは新しい情報が出ていないか見ておいたほうがよい」と注意を喚起する。

問い合わせた内容に置き換える

 Log4Shellを悪用した攻撃では、Log4jが出力するログに細工した文字列を含ませることで、任意のJavaのプログラム(クラス)を送り込んで実行させる。この攻撃に悪用されたのが、Log4jが備える「JNDI Lookup」という機能である。

 JNDI(Java Naming and Directory Interface)は「データやオブジェクトを名前で探索して参照する」というJavaの機能だ。JNDIはディレクトリーサービスのLDAP(Lightweight Directory Access Protocol)や分散オブジェクト間通信のRMI(Remote Method Invocation)、名前解決サービスのDNS(Domain Name System)など様々な探索手段を利用できる。

 Log4jは出力対象のログが特定の文字列を含む場合、それを変数として置き換える「Lookup」という機能を備える。一般には日付や環境変数を動的に出力するのに使う。

 JNDI Lookupはこの機能にJNDIを利用する。JNDIを使って取得した内容を変数として置き換える。これを悪用することで、LDAPやRMIなどを使ってJavaのクラスを取得させ、実行させられる。具体例として、LDAPを悪用してWebサーバーを攻撃する場合を見てみよう。