log4j2の脆弱性に起因するMinecraftサーバー/クライアントの対応策を 1.17.1 で個人的に検証してみた
公式から回避策についてのまとめが出るようです (12月10日 21:59 追記)
=> 出ました (12月10日 23:42 追記)
We'll be providing a more comprehensive source of information soon, including workaround information for all server versions.
— slicedlime (@slicedlime) December 10, 2021
注意事項
この記事に掲載されている内容を試行されたことによるいかなる損害も、筆者は責任を負いかねます。
本記事内の内容に誤りがある場合は、Twitter @kazuemon_0602 に直接ご連絡ください。
追加で12月10日 21時ごろからすべてのバージョンに対するパッチが自動適用開始された模様ですが記事執筆時点では未検証です
Changelog
12月10日 21:46
記事を公開しました
12月10日 21:56
Minecraft 1.18.1 のリリースについて追記
12月10日 21:59
公式からの発表予告について追記
12月10日 23:42
公式からの発表について追記
時間がない人向けまとめ
1.17.1 バニラサーバー
実行時に引数に Dlog4j2.formatMsgNoLookups=true を追加することで対応可能
1.17.1 Optifine, fabric
ランチャーへの自動適用パッチで回避可能
1.17.1 Forge
ランチャーへの自動適用パッチで回避できません
対応済みの最新バージョンへのアップグレードを行ってください
事の発端
Minecraft のバニラクライアント/バニラサーバーで利用されているロギングライブラリ log4j2 の v2.14.1 までのバージョンで、ログ出力の際に特定の文字列が含まれていると、文字列に含まれるサーバーに対してアクセスが発生し、その際に任意コードを返却することでそれが実行できてしまうという脆弱性( CVE-2021-44228 )が発見されました。
この記事では、この脆弱性に対するワークアラウンドである「JVM引数に”Dlog4j2.formatMsgNoLookups=true”を追加する」について Minecraft 1.17.1 で検証した結果を記載します。
共通の検証要件
ldapjs を用いて localhost:1389 にLDAPサーバーを構築
Minecraft のチャットにて特定文字列を送信
LDAPサーバー側ログで “access“ と出力された場合には脆弱性があるとして判定
import ldap from 'ldapjs';
const server = ldap.createServer();
server.listen(1389, () => {
console.log('LDAP server listening at port 1389');
});
// @ts-ignore
server.search('dc=example', (req, res, next) => {
console.log('access');
res.end();
});
各サーバーで検証してみた
バニラサーバー
検証要件
Minecraft 1.17.1
12月10日 10:49 時点で配布されている jar ファイルで検証
検証結果
java -jar server.jar
ログが出力された
java -Dlog4j2.formatMsgNoLookups=true -jar server.jar
ログは出力されなかった
まとめ
1.17.1 サーバーは起動時に JVM 引数指定で対応可能
info: Minecraft 1.18 については 対応パッチ反映済みの Minecraft 1.18-rc3 の jar ファイルがダウンロード可能
https://www.minecraft.net/en-us/article/minecraft-1-18-1-release-candidate-1
=> Minecraft 1.18.1-rc3 までの変更が適用されている Minecraft 1.18.1 がリリースされました (12月10日 21:55 追記)
SpigotMC
検証要件
Minecraft 1.17.1
12月10日 11:31 に BuildTools #141 を用いて手元でビルド (対応パッチ適用後)
検証結果
java -jar spigot-1.17.1.jar
ログは出力されなかった
まとめ
再ビルドして利用すれば問題はなさそうです
info: 下記バージョンについては同様にパッチが適用されたバージョンがビルド可能とのことです
( Source: https://www.spigotmc.org/threads/spigot-security-releases-%E2%80%94-1-8-8%E2%80%931-18.537204/ )1.8.8 (BuildTools rev 582-a)
1.9.4 (BuildTools rev 849-a)
1.10.2 (BuildTools rev 986-a)
1.11.2 (BuildTools rev 1251-a)
1.12.2 (BuildTools rev 1573-k)
1.13.2 (BuildTools rev 2148-d)
1.14.4 (BuildTools rev 2502-c)
1.15.2 (BuildTools rev 2703-a)
1.16.5 (BuildTools rev 3096-a)
1.17.1 (BuildTools rev 3284-a)
1.18 (all future versions)
各クライアントで検証してみた
バニラクライアント
検証要件
Minecraft 1.17.1
12月10日 12時頃~自動適用が開始されたランチャーのデフォルトJVM引数を変更するパッチの適用前と適用後で比較
パッチの配布についてのソースは下記URL参照
変更内容についてのソースは下記URL参照
検証結果
A: ランチャーパッチ適用前 (引数はデフォルト)
ログが出力された
B: ランチャーパッチ適用前 (引数に -Dlog4j2.formatMsgNoLookups=true を追加)
ログは出力されなかった
C: ランチャーパッチ適用後 (引数はデフォルト)
ログは出力されなかった
まとめ
ランチャーへの自動適用パッチで対策可能
ただし、このパッチは 1.17 以上のみ動作確認済みとのこと
Fabric
検証要件
Minecraft 1.17.1 + fabric-loader-0.11.7-1.17.1.jar
10月3日に構築
mods として以下を導入済み
fabric-api-0.40.1+1.17.jar
optifabric-1.11.20.jar
Optifine_1.17.1_HD_U_G9.jar
replaymod-1.17.1-2.6.0.jar
検証結果
A: ランチャーパッチ適用前 (ランチャー引数はデフォルト)
ログが出力された
B: ランチャーパッチ適用前 (引数に -Dlog4j2.formatMsgNoLookups=true を追加)
ログは出力されなかった
C: ランチャーパッチ適用後 (引数はデフォルト)
ログは出力されなかった
まとめ
バニラクライアントと同様にランチャーへの自動適用パッチで対策可能
Optifine 単体
検証要件
Minecraft 1.17.1 + 1.17.1-Optifine_HD_U_H1.jar
12月10日 20時ごろ構築
ランチャーパッチ適用後
引数はデフォルトのまま
検証結果
ログは出力されなかった
まとめ
バニラクライアントと同様にランチャーへの自動適用パッチで対策可能
Forge
検証要件
A: 1.17.1-forge-37.1.0 (修正前)
B: 1.17.1-forge-37.1.1 (修正後)
12月10日 20時ごろ構築
ランチャーパッチ適用後
検証結果
A-1: 37.1.0 ランチャーの引数はデフォルトのまま
ログが出力された
A-2: 37.1.0 ランチャーで引数に Dlog4j2.formatMsgNoLookups=true を追加
ログが出力された
B-1: 37.1.1 ランチャーの引数はデフォルトのまま
ログは出力されなかった
まとめ
ランチャーへの自動適用パッチでは対策できない模様?
ランチャーのJVMの引数が引き継がれていない?
37.1.1 のアップグレードを推奨
気軽にクリエイターの支援と、記事のオススメができます!