
2021年12月10日(金)、Javaライブラリ 'log4j' 2 におけるリモートコード実行(RCE)脆弱性に対応する新しいProof-of-Concept 1 が公開されました。この脆弱性は、ソフトウェアの開発者に事前に開示されていませんでした。この脆弱性はCVE-2021-44228 3 として追跡されています。脆弱性の詳細については、Northwave Threat Response 4 を参照してください。
Northwaveは、一般的なHTTPヘッダーへのペイロードの注入と、HTTP GETリクエストの一部としての注入を使用して、脆弱なシステムをチェックするテストスクリプトを作成しました。ターゲット専用に作成されたUUIDを含む受信DNSリクエストをリッスンすることで、脆弱なシステムを検出します。たとえばLDAPサーバーを展開する代わりに、受信DNSをリッスンすることで、アウトバウンドトラフィックフィルタリングが導入されている環境でも、脆弱なシステムを検出できる可能性が高まります。実際には、アウトバウンドDNSが許可されていることがよくあります。高い偽陰性率が予想されます。免責事項 をお読みください。
以下のHTTPヘッダーがチェックされます:
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAccept各インジェクションに対して、以下のJNDIプレフィックスがチェックされます:
jndi:rmijndi:ldapjndi:dnsjndi:${lower:l}${lower:d}apこのスクリプトは、HTTPヘッダー と HTTP GETリクエスト の2つの特定のチェックのみを実行することに注意してください。そのため、脆弱性をトリガーするために他のヘッダーや特定の入力フィールドなどをターゲットにする必要がある場合、偽陰性が発生します。これは非常に起こり得ることです。
重要: チェッカーが 'no vulnerability detected' を返した場合は、Northwave Threat Response 4 に記載されているように、ファイルシステムのチェックに進んでください。このチェッカーを実行するだけでは、システムが脆弱かどうかを判断するには不十分です。
まず、受信DNSリクエストを受け取るために使用できるサブドメインが必要です。この例では、ゾーン log4jdnsreq.northwave.nl を使用し、スクリプトを log4jchecker.northwave.nl にデプロイします。DNSエントリを次のように設定します:
log4jdnsreq 3600 IN NS log4jchecker.northwave.nl.
次に、Debianシステムに apt install bind9 を使用してBIND DNSサーバーをセットアップし、/etc/bind/named.conf.options ファイルに以下を追加します:
recursion no;
allow-transfer { none; };
これは、オープンDNSサーバーを実行したくないため、再帰を無効にします。/etc/bind/named.conf.local に以下の設定を追加して、ロギングを構成します:
logging {
channel querylog {
file "/var/log/named/query.log";
severity debug 3;
print-time yes;
};
category queries { querylog;};
};
systemctl restart bind9 を使用してBINDを再起動することを忘れないでください。xyz.log4jdnsreq.northwave.nl に対してDNSクエリを実行して、ロギングが機能するか確認してください。1つ以上のクエリが /var/log/named/query.log に表示されるはずです。
ネームサーバーのルックアップが実際にログに記録されることを確認することが重要です。ネームサーバーのセットアップがリクエストをログに記録しない限り、このスクリプトは脆弱なサイトを検出できません
テストルックアップを実行してサーバーをテストしてください(できれば別のマシンから):
dig test.log4jchecker.northwave.nl
応答は期待しないでください。ただし、ログファイル(cat /var/log/named/query.log)にエントリが記録されることを期待してください。このエントリは次のようなものになるでしょう:
14-Dec-2021 13:36:01.402 client @0x7f8b180a9b30 requester-ip#58755 (test.log4jchecker.northwave.nl): query: test.log4jchecker.northwave.nl IN A -E(0)DC (your-ip)
ログに応答が表示されるまで先に進まないでください。それがなければ、スクリプトは脆弱性を検出できません。
pip install -r requirements.txt を使用してPythonの依存関係をインストールします。設定したDNSゾーンに合わせて、スクリプト内の次の行を変更します:
HOSTNAME = "log4jdnsreq.northwave.nl"
これで、-u パラメータで単一のURLを指定するか、-l パラメータでURLのリストを指定してスクリプトを実行できます:
usage: nw_log4jcheck.py [-h] [-l LIST] [-u URL] [-w WAIT] [-t TIMEOUT]
optional arguments:
-h, --help show this help message and exit
-l LIST, --list LIST A text file with a list of URLs to check (one url per line)
-u URL, --url URL URL to check (for example: http://yoururl.com)
-w WAIT, --wait WAIT Number of seconds to wait before checking DNS logs (default: 15)
-t TIMEOUT, --timeout TIMEOUT
HTTP timeout in seconds to use (default: 5)
出力の最後の行に、システムが脆弱であると検出されたかどうかが表示されます:
NO VULNERABILITY DETECTED. Proceed with on-server checking. No incoming DNS request to 3414db71-309a-4288-83d4-aa3f103db97c.log4jdns.northwave.nl was seen
脆弱性が検出されなかった場合は、Northwave Threat Response 4 に記載されているように、ファイルシステムのチェックに進んでください。繰り返しますが、このチェッカーを実行するだけでは、システムが脆弱かどうかを判断するには不十分です。
Log4jcheckは、MITライセンスの下で公開されているオープンソースソフトウェアです。