
Log4jの脆弱性(CVE-2021-44228、CVE-2021-45046、CVE-2021-45105、CVE-2021-4104、CVE-2019-17571)に関するノルウェー語のガイド。検出スクリプト、緩和策、影響を受けるシステムを特定および修復するためのマインドマップを提供。
2021年12月19日更新:Log4jにおける新たな脆弱性とそれらの悪用手法が次々と発見されています。リポジトリに3つのフローチャート(マインドマップ)を追加しました。それぞれ、脆弱なLog4jのバージョン、脆弱性の有無を確認する方法、および各脆弱性の軽減策について説明しています。
Log4j バージョン 2.x を使用しているソフトウェアを特定する
Log4j の脆弱性を軽減する
上記が不可能な場合
Pattern Layouts 内の Context Lookups を確認することを検討するLog4j バージョン 1.x を使用しているソフトウェアを特定する
組織内で Log4j バージョン 1.x を使用している場合は、ベンダーと協議し、以下を要求する
Log4j の脆弱性の中でも最大の脅威。${jndi:ldap://\<攻撃コード>/a} のバリエーションを含む文字列が Log4j によってログ記録されると悪用されます。CVSS 10.0、RCE。
CVE-2021-44228 ほどではありませんが、同様に危険です。Log4j の非標準的な設定が必要です。CVSS 9.0、RCE および DoS。
CVE-2021-44228 ほどではなく、やや影響は小さいです。CVSS 7.5、DoS
Log4j バージョン 1.x のみに影響します。Log4j が JMSAppender を使用している必要があります。CVSS 6.6、RCE 悪用には Log4j が JMSAppender を使用している必要があります。JMSAppender が直接設定されている場合(これはまれです)、または攻撃者が自ら Log4j の設定に追加した場合に発生します。 さらに、攻撃者は JMSAppender の設定を変更できる必要があります。この場合、攻撃者は通常すでにシステムにアクセスしています。したがって、この脆弱性はあまり重要ではないと考えられます。
Log4j バージョン 1.x のみに影響します。Log4j が SocketServer を使用している必要があります。CVSS 9.8、RCE ネットワーク経由で該当するソケットにアクセスできる攻撃者にコード実行を許可します。悪用コードは公開されています。
Java 8 の場合、Log4j v. 2.17.0 が最新バージョンです。これは上記のすべての脆弱性を軽減します。
バージョン 2.16.0 は最も深刻な脆弱性を軽減します。
Java 7 の場合、Log4j はバージョン 2.12.2 でリリースされています。これは CVE-2021-45105 を軽減しません。Log4j チームは、Java 6 も Java 7 もサポートされていないと述べています。Java 7 の Log4j に対するさらなるセキュリティアップデートが提供されるかどうかは未定です。
フローチャート「マインドマップ #1」は、各脆弱性の有無の前提条件をわかりやすく示しています。

作成者:Loïc Castel。githubから取得。
課題の一つは、必ずしもインターネットに直接露出しているサーバーだけが脆弱であるとは限らないことです。脆弱性は、同じデータを受信してログ記録する、チェーンの奥深くにあるサーバーに存在する可能性があります。そのため、何が露出しているのか、何が露出していないのかを把握することが困難になる場合があります。
フローチャート「マインドマップ #2」は、自社システムの脆弱性を確認する方法をわかりやすく示しています。
作成者:Loïc Castel。githubから取得。


- User-agent
- 検索フィールド
- ユーザー名
- ...
4. カナリアのヒットを追跡し、log4jがどこで動作しているかを特定する。
以下は、マップされたネットワークドライブを含むすべてのディスクを対象とします。
Get-PSDrive -PSProvider FileSystem | foreach {(gci ($_.Root) -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path)}
参照:https://twitter.com/0gtweet/status/1469661769547362305
ローカルディスクのみをチェックする場合:
Get-CimInstance win32_volume | Where-Object { $_.DriveType -eq 3 -and $_.DriveLetter -ne $null} | ForEach-Object {(gci ($_.DriveLetter+"\") -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path)}
参照:https://twitter.com/webmastir/status/1470386184052486155?s=20
さらにマシンのイベントログをチェックする場合:
Get-WinEvent -ListLog * |
foreach { get-winevent @{logname=$_.logname; } -ea 0 } |
where message -match 'jndi'
#!/bin/bash
find / -name '*log4j*.jar' -print0 2>/dev/null -print0 | while read -d $'\0' log4j; do
echo -en "${log4j}: "$(unzip -p "${log4j}" | strings | grep -Po '^Implementation-Version:\s+([0-9\.]+)' | awk '{ print $NF }')"\n"
done
exit 0
フローチャート「マインドマップ #3」は、軽減の選択肢の概要を示しています。
作成者:Loïc Castel。githubから取得。
以下に、軽減策を実行するためのリソースをいくつか記載します。
Log4j を v 2.17.0 に更新
Log4j を v 2.12.2 に更新 注意: CVE-2021-45105 は軽減されません
⚠️ この方法は、すべての状況で全ての脆弱性を軽減するわけではないため、もはや完全な解決策とは見なされていません。
[Environment]:https://raw.githubusercontent.com/helsecert/cve-2021-44228/HEAD/:SetEnvironmentVariable(%22LOG4J_FORMAT_MSG_NO_LOOKUPS%22,%22true%22,%22Machine%22)
注意: 再起動が必要
出典:https://twitter.com/CyberRaiju/status/1469505680138661890
"‐Dlog4j2.formatMsgNoLookups=True"
コマンドライン例:
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" teku --network mainnet
または -Xmx 値を指定する場合:
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx4g" teku
Systemd 設定例:
Environment='JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true"'
または -Xmx 値を指定する場合:
Environment='JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" "-Xmx4g'
アプリケーションの再起動時に読み込まれます 出典:https://github.com/ConsenSys/teku/security/advisories/GHSA-mwfw-vm54-g3p7
jar ファイルはアーカイブ(zip ファイル)であり、開くことができます。その後、ファイルを削除できます。これは、7-zip などのツール(画像参照)を使用して手動で行うか、スクリプトを使用して実行できます。
アプリケーションの再起動が必要
参照:https://mogwailabs.de/en/blog/2021/12/vulnerability-notes-log4shell/9

[Reflection.Assembly]:https://raw.githubusercontent.com/helsecert/cve-2021-44228/HEAD/:LoadWithPartialName(%27System.IO.Compression%27)
$JarFilLokasjon = 'C:\temp\log4j-core-2.13.0-test.jar'
$Filnavn = 'JndiLookup.class' #このファイルが削除されます!
$Stream = New-Object IO.FileStream($JarFilLokasjon, [IO.FileMode]::Open)
$ZipMode = [IO.Compression.ZipArchiveMode]::Update
$Zip = New-Object IO.Compression.ZipArchive($stream, $ZipMode)
($zip.Entries | Where-Object { $Filnavn -contains $_.Name }) | ForEach-Object { $_.Delete() }
$zip.Dispose()
$stream.Close()
$stream.Dispose()
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
https://github.com/NCSC-NL/log4shell/tree/main/software
https://gist.github.com/SwitHak/b66db3a06c2955a9cb71a8718970c592
rootで実行
lsof | grep log4j-core