Dark background with blue code overlay
ブログ

Log4j 特集パート 1:脆弱性の背景

Charlie Gero

Written by

Charlie Gero

January 07, 2022

Charlie Gero は、Akamai Enterprise 部門の VP 兼 CTO であり、Advanced Projects Group を指揮しています。現在は、セキュリティ、応用数学、暗号化、分散アルゴリズムの分野での最先端の研究に力を入れ、拡大していく Akamai の顧客ベースを保護する次世代のテクノロジーの確立を目指しています。物理学とコンピューターサイエンスの両方で学位を得ており、Akamai での研究を通じて、暗号化、圧縮、パフォーマンスの高いネットワークシステム、リアルタイムのメディア配信など、30 件近くの特許を取得してきました。Akamai に入社して 15 年近くになりますが、それ以前には、スタートアップ企業を創設したこともあり、また製薬業界やネットワーキング業界でコンピューターサイエンスの重要な職位を経験してきました。

Log4j-retro1.png

タイムライン

2021 年 11 月 24 日、 Apache Foundation に、Alibaba の Cloud Security チームから非公式な通知が届きました。その内容は、 Log4j、すなわち広く使用されている Javaベースのロギングライブラリーには、個人情報の漏えいやリモートコード実行(RCE)の発生につながる可能性のある重大な脆弱性が含まれている、というものでした。 この脆弱性は 2013 年から存在していました。

翌日、Apache Foundation は CVE-2021-44228 を予約し、修正の調査を開始しました。 その後 12 日間にわたり、問題に対処するためにソースコードに複数の変更が加えられ、 2021 年 12 月 9 日にこの脆弱性が公開されたのです。

その結果、エクスプロイトの試みが大量に発生し、それ以降は驚異的な勢いで増加しています。

Log4j とは

この脆弱性を真に理解するためには、Log4j が何であるかを知る必要があります。Log4j は Java コミュニティーの開発者間で広く利用されているライブラリーであり、エラーメッセージや診断情報などをログに記録するための、シンプルで堅牢なフレームワークです。

その優れた機能には、例として、TCP、Syslog、NT イベントログ、E メールを使用するコンソール、ファイル、リモートサーバーなどの、複数ターゲットへのロギング機能が挙げられます。 また、ログメッセージ、ログレベル、カスタムレイアウトなどの階層フィルタリングにも対応します。

つまり、開発者にとって非常に魅力的なライブラリーとなる包括的な機能セットを備えているため、Web アプリケーションや組み込みデバイスなど、あらゆるものに存在しています。

ルックアップとネスト

Log4j がサポートする非常に強力な機能の 1 つに、ルックアップと呼ばれる機能があります。ルックアップを使用すると、開発者は出力前に Log4j によって自動的に評価される変数または式を、テキストに埋め込むことができます。たとえば、開発者が次のテキストを記録するコードを記述したとします。

「${date:MM-dd-yyyy} All Systems Good」

Log4j はパターン ${date:MM-dd-yyyy} を日付ルックアップとして認識し、その式を今日の日付に置き換えます。たとえば、2021 年 12 月 20 日の日付の場合、テキストはターゲットに出力される前に次のように変更されます。

「12-20-2021 All Systems Good」

これは開発者にとって非常に便利です。この機能がなければ、日付ルックアップのコードを手動で記述し、形式を文字列に設定し、ログ行の先頭に追加してから出力する必要があります。また、上記のコードは特に難しいものではなく、記述が負担になるものでもなく、ソフトウェアのコア・ビジネス・ロジックに関連しませんが、最終的にはプロジェクトで次から次へと繰り返し使用されるようになります。

開発者は、Log4j ライブラリー内のすでにコード化されている機能を活用することで、プロジェクトにとって重要な差別化に集中し、すべてのログ関連タスクを Log4j に処理させることができます。

このようなタイプの ルックアップ式の多くが Log4j でサポートされています。この記事では、さらに 2 つの機能について説明します。env と lower. env を使用すると、ホストシステムで環境変数をログ行に含めることができます。たとえば、開発者が次のテキストをログに記録するとします。

「The current user is ${env:USER}」

ユーザー Administrator がソフトウェアを実行していると仮定すると、次の出力が生成されます。

「The current user is Administrator」

env や date で新しいデータをテキストに挿入できるのに対して、lower では既存のデータを操作できます。 Log4j は、式内の文字列を単純に小文字にします。 次に例を示します。

「The lower case text is ${lower:ABCDEFG}」

結果は次のようになります。

「The lower case text is abcdefg」

この例自体は、それほど興味深いものではありません。文字列を自分自身で小文字にすれば済むと思われる方もいるかもしれません。 ですが、Log4j でルックアップ式の ネスト が可能なことを考慮すると、効果がはっきりわかります。

前の 2 つの式を次のように組み合わせます。

「The lower case current user is ${lower:${env:USER}}」

これにより、Log4j は最初、 ${env:USER} 式を Administratorとして評価し、次にそれを lower に送ると、 administratorと変換され、最終的には次の行になります。

「The lower case current user is administrator」

JNDI

dateenv、および lower はすべて興味深く、非常に有用ですが、これが脆弱性となり得るのは JNDI ルックアップを使用した場合です。  JNDI(Java Naming and Directory Interface)は、Java 開発環境とランタイム環境にネイティブに組み込まれたメカニズムで、共通のインターフェースを使用して、さまざまなディレクトリーサービスのシンプルなクエリーを実行し、情報を得ることができます。

したがって、さまざまなディレクトリーサービスがサポートされています。 たとえば、JNDI では、DNS サーバーのクエリーによるホストの IP アドレスの検出や、ディレクトリーエントリーの AD および LDAP のクエリーがサポートされています。 また、実行中の Java 環境自体の 環境エントリーのクエリーもサポートされています。これは現在実行中のソフトウェアの特殊な設定オプションと考えることができます。

Log4j 内で JNDI ルックアップ式を使用すると、開発者はログに記録されたテキストに埋め込まれた式を通じて、この非常に強力なサブシステムに直接アクセスできます。 たとえば、開発者が次の文字列をログに記録しようとしたとします。

「The current mail host is ${jndi:java:comp/env/mailhost}」

Log4j は ${jndi:java:comp/env/mailhost} 式を JNDI ルックアップとして認識し、 java:comp/env/mailhost の擬似 URL を JNDI サブシステムに渡します。 JNDI は、この特定の URL タイプをクエリーとして認識し、 mailhost と呼ばれる設定オプションをルックアップして現在実行中のコンポーネントを探します。

これが mymailserver.example.comとして設定されると考えてみましょう。JNDI はこの情報を Log4j に返します。これにより、ルックアップ式が mymailserver.example.com に置き換えられ、次の出力が得られます。

「The current mail host is mymailserver.example.com」

脆弱性の存在を理解する

簡潔に述べると、Apache の Log4j 脆弱性は、ライブラリーが広く使用されており、特にルックアップ、ネスト、JNDI の各機能を備えていることで、攻撃者にとって悪用の機会を大いにもたらすことになりました。この機能は開発者にとっては優れていますが、データを流出させたり、RCE を引き起こしたりする可能性のあるリクエストを渡す機会も作り出します。このことを知っておけば、脆弱性と攻撃者によるシステムエクスプロイトの方法について深く理解することができます。

今後は?

このシリーズのパート 2 では、攻撃者がデータ流出と RCE のこの脆弱性を悪用するようになった流れを見ていきます。



Charlie Gero

Written by

Charlie Gero

January 07, 2022

Charlie Gero は、Akamai Enterprise 部門の VP 兼 CTO であり、Advanced Projects Group を指揮しています。現在は、セキュリティ、応用数学、暗号化、分散アルゴリズムの分野での最先端の研究に力を入れ、拡大していく Akamai の顧客ベースを保護する次世代のテクノロジーの確立を目指しています。物理学とコンピューターサイエンスの両方で学位を得ており、Akamai での研究を通じて、暗号化、圧縮、パフォーマンスの高いネットワークシステム、リアルタイムのメディア配信など、30 件近くの特許を取得してきました。Akamai に入社して 15 年近くになりますが、それ以前には、スタートアップ企業を創設したこともあり、また製薬業界やネットワーキング業界でコンピューターサイエンスの重要な職位を経験してきました。