log4j2の脆弱性に起因するMinecraftサーバー/クライアントの対応策を 1.17.1 で個人的に検証してみた

かずえもん

公式から回避策についてのまとめが出るようです (12月10日 21:59 追記)
=> 出ました (12月10日 23:42 追記)

注意事項

  • この記事に掲載されている内容を試行されたことによるいかなる損害も、筆者は責任を負いかねます。

  • 本記事内の内容に誤りがある場合は、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

      • ログは出力されなかった

  • まとめ

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)

各クライアントで検証してみた

バニラクライアント

  • 検証要件

  • 検証結果

    • A: ランチャーパッチ適用前 (引数はデフォルト)

      • ログが出力された

    • B: ランチャーパッチ適用前 (引数に -Dlog4j2.formatMsgNoLookups=true を追加)

      • ログは出力されなかった

    • C: ランチャーパッチ適用後 (引数はデフォルト)

      • ログは出力されなかった

  • まとめ

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 のアップグレードを推奨

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!