Log4Shell(CVE-2021-44228)の詳細解説
Log4Shell、またはCVE-2021-44228として知られるこの脆弱性は、広く利用されているJavaログフレームワーク
Log4jに存在する、深刻な任意コード実行の脆弱性です。この脆弱性は、2021年11月24日にAlibabaのクラウドセキュリティチームによってApacheに秘密裏に報告され、2021年12月9日に一般に公開されました。
脆弱性の概要
Log4Shellの根本的な問題は、
Log4jがLDAPおよびJNDIリクエストの検証を適切に行わない点にあります。この欠陥により、攻撃者は、サーバーまたは他のコンピュータ上で任意のJavaコードを実行できるようになります。この脆弱性の影響を受けるサービスには、Amazon AWS、
Cloudflare、iCloud、Java版のMinecraft、
Steam、Tencent QQなどが含まれます。
この脆弱性の深刻さは、専門家によって広く認識されています。LunaSecは「壊滅的な設計上の失敗」と評し、Tenableは「過去10年間で最大かつ最も重大な単一の脆弱性」と評価しています。
Log4jを管理するApache Software Foundationも、この脆弱性に対して最高のCVSSレーティングである10を与えています。
背景
Log4jは、ソフトウェア開発者がアプリケーション内の様々なデータを記録するために使用するオープンソースのログフレームワークです。このログデータにはユーザー入力が含まれる場合があり、特にエンタープライズソフトウェアを含む、幅広いJavaアプリケーションで広く利用されています。
Log4jは、元々2001年にCeki Gülcüによって開発され、現在ではApache Software FoundationのApache Logging Servicesの一部として管理されています。
動作メカニズム
Log4Shellの脆弱性は、Java Naming and Directory Interface(JNDI)の機能を悪用しています。JNDIを使用すると、Javaオブジェクトは実行時にデータへのパスを指定して検索できます。JNDIは複数のディレクトリインターフェースをサポートしており、その中に
Lightweight Directory Access Protocol(LDAP)があります。LDAPを使用すると、ローカルまたはインターネット上の任意の場所にあるサーバーから、オブジェクトデータをURLとして取得できます。
Log4j 2は、デフォルト設定では、ログに文字列を出力する際に `${prefix:name}` という形式の式を解釈し、文字列置換を実行します。例えば、`Text: ${java:version}` は `Text: Java version 1.7.0_67` のように置換されます。この機能の中に、`${jndi:
}` という式があり、これを利用すると、LDAPを介して任意のURLに問い合わせ、データをJavaオブジェクトとしてロードできます。たとえば、`${jndi:ldap://example.com/file}` は指定されたURLからデータを読み込みます。
攻撃者は、ログに記録される文字列に悪意のあるコードを含むURLを埋め込むことで、この脆弱性を悪用できます。たとえコードの実行が無効化されていたとしても、攻撃者はURLに特定の文字列を含めることで、環境変数などの機密データを自身のサーバーに送信できます。
一般的な攻撃手法としては、HTTPリクエストのURLやUser-Agentヘッダーに悪意のある文字列を埋め込む方法があります。これらの情報はログに記録されやすいため、攻撃者が脆弱性を突くための格好の場所となります。初期の対策としては、`${jndi`のような文字列を含むリクエストをブロックする方法が用いられましたが、リクエストを難読化することで簡単に回避できます。例えば `${${lower:j}ndi` は、結果的にJNDIルックアップに変換されてしまうため、この対策は不十分です。さらに、入力がすぐにログに記録されない場合でも、内部処理中にログに記録され実行される可能性があります。
なお、Log4j 1.x系は、JNDI Lookup機能を持たないため、またJMS Appenderが有効であってもクラス情報がデシリアライズされないため、この脆弱性の影響を受けません。
緩和策
Log4Shellの脆弱性に対する修正は、脆弱性が公開される3日前の2021年12月6日に、Log4jバージョン2.15.0-rc1としてリリースされました。この修正には、ルックアップに使用できるサーバーとプロトコルの制限が含まれており、複数のシステムプロパティを使用して設定できます。また、`log4j2.formatMsgNoLookups`というシステムプロパティを設定することで、脆弱性を緩和することもできます。2.10.0以降のバージョンでは、このプロパティをtrueに設定することが推奨されています。2.10.0以前のバージョンでは、`org.apache.logging.log4j.core.lookup.JndiLookup` クラスをクラスパスから削除する必要があります。
さらに、バージョン2.16.0以降では、JNDIを使用するすべての機能がデフォルトで無効になりました。
最新のJava Runtime Environment(JRE)は、リモートコードのロードをデフォルトでブロックすることにより、この脆弱性を部分的に緩和できます。しかし、特定のアプリケーションでは他の攻撃ベクトルが存在する可能性があります。脆弱性のあるLog4jバージョンを検出するための様々な手法とツールが公開されています。
反応と影響
アメリカ合衆国のサイバーセキュリティ・インフラストラクチャ・セキュリティ庁(CISA)の長官であるJen Easterly氏は、この脆弱性を「致命的(critical)」と評し、ベンダーにソフトウェアのアップデートを優先するように勧告しました。カナダサイバーセキュリティセンター(CCCS)は、様々な組織に対して迅速な対応を呼びかけました。ドイツ連邦情報セキュリティ庁(BSI)は、この脆弱性を政府機関にとって最大の脅威とし、「非常に深刻な脅威状況」と評価しています。また、いくつかの攻撃がすでに成功していると報告しており、この脆弱性の影響範囲を正確に評価することは依然として難しいとされています。
CloudflareのCEOであるMatthew Prince氏によると、この脆弱性の悪用またはテストを示す証拠は、一般に公開される9日前の12月1日にまで遡ります。サイバーセキュリティ会社GreyNoiseは、いくつかのIPアドレスが脆弱性のあるサーバーをスキャンするためにウェブサイトをスクレイピングしていることを確認しています。カナダ歳入庁は、脆弱性が発覚した後、一時的にオンラインサービスを停止し、ケベック州政府は約4000のウェブサイトを「予防措置」として閉鎖しました。
システム管理者は、現在の状況を評価し、ライブラリの更新やシステムプロパティを使用してルックアップを無効にするなど、可能な限り迅速に緩和策を実施することが強く推奨されています。
出典
* Log4j ウェブサイト