Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
log4j-4255 — Apache log4j2 #4255を再現するエンドツーエンドのDockerラボ — java.rmi.MarshalledObjectによるFilteredObjectInputStreamの許可リストバイパス(フィルタリングなしのデシリアライゼーション → RCE)をLog4j 2.26.1 / JDK 17上で実行 | Kitploit
ツール/GitHubGitHub/dinosn/log4j-4255
脆弱性分析エクスプロイトウェブセキュリティ学習と教育バイナリエクスプロイト
GitHubdinosn/log4j-4255

log4j-4255

Apache log4j2 #4255を再現するエンドツーエンドのDockerラボ — java.rmi.MarshalledObjectによるFilteredObjectInputStreamの許可リストバイパス(フィルタリングなしのデシリアライゼーション → RCE)をLog4j 2.26.1 / JDK 17上で実行

リポジトリを見る
18131日前未レビュー
ウェブサイト

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

log4j2 #4255 — FilteredObjectInputStream 許可リストのバイパス(java.rmi.MarshalledObject 経由)

Apache log4j2 の課題 #4255 を、公式 Log4j 2.26.1 アーティファクトを JDK 17 上でエンドツーエンドに再現する、自己完結型のコンテナ化ラボです。ポジティブコントロール、堅牢化されたオラクル、検証済みの緩和策を備えています。

⚠️ 責任ある利用について

このラボには、現在未パッチの Log4j の課題に対する実動するデシリアライゼーション RCE が含まれています(#4255 は執筆時点で OPEN / waiting-for-maintainer であり、CVE は未割り当て)。これはお使いのマシン上の使い捨て Docker コンテナ内でのみ実行され、外部とは Maven Central(公式 jar のダウンロードのみ)以外には接続しません。ターゲットへの接触は一切ありません。

  • 元の報告者(U-Sec / Wujie Security)は、修正が行われるまで PoC を公開していません。これは、防御側の検証と検知エンジニアリングのために構築された独立した再現です。
  • 所有していない、または明示的にテストを許可されていないシステムに対しては、これを実行しないでください。
  • これはアプリケーション依存の RCE であり、普遍的な Log4j RCE ではありません(スコープを参照)。

TL;DR

Log4j の FilteredObjectInputStream(FOIS)は、resolveClass ベースのデシリアライゼーション許可リストです。その許可リストには java.rmi.MarshalledObject が含まれています。MarshalledObject はペイロードを不透明な byte[] として格納し、MarshalledObject.get() はそのペイロードを新規の、フィルタリングされていない ObjectInputStream でデシリアライズします。そのため、許可リストは内部のグラフを検査しません。

Log4j はこれを自らトリガーします。Log4jLogEvent$LogEventProxy(2.8 以降の LogEvent のシリアライズされたワイヤ形式)は、イベントの Message を MarshalledObject 内に保持し、デシリアライゼーション中に自動的に .get() を呼び出します(readResolve() → message())。したがって、FOIS を通じてシリアライズされた LogEvent を読み取るアプリケーションは、攻撃者のバイト列のフィルタリングされていないデシリアライゼーションを実行します。さらに、message() は結果の例外を飲み込んで SimpleMessage にフォールバックするため、受信側は無害なイベントをログに記録して動作を継続します。このエクスプロイトは静かに実行されます。

根本原因(rel/2.26.1 で検証済み)

#場所欠陥
1log4j-api …/util/internal/SerializationUtil.javaREQUIRED_JAVA_CLASSES に java.rmi.MarshalledObject が含まれている
2log4j-api …/util/FilteredObjectInputStream.javaresolveClass() のみをオーバーライドしており、MarshalledObject の objBytes ペイロードはそれから見えない
3log4j-core …/impl/Log4jLogEvent.javaLogEventProxy.marshalledMessage は MarshalledObject<Message> である
4log4j-core …/impl/Log4jLogEvent.javamessage() が marshalledMessage.get()(フィルタなし)を呼び出し、すべての例外を飲み込む

ラボが実行する内容

非推奨の log4j-samples の ObjectInputStreamLogEventBridge の忠実な代替品です。接続ごとに 1 つのシリアライズされた LogEvent を FOIS 経由で読み取る、認証なしの TCP レシーバーです。攻撃者は単一のシリアライズされたオブジェクトを送信します。オラクルは、レシーバーコンテナにのみバインドマウントされたディレクトリに書き込まれる証明ファイルであり、その出現は、デシリアライゼーションを介してレシーバー内でコードが実行されたことを証明します。

#シナリオ被害者のクラスパスjdk.serialFilter期待される結果
S1許可されていないガジェットをトップレベルで送信+ ガジェットなし拒否 — FOIS が許可リストを強制
S2同じガジェットを LogEvent にラップ+ ガジェットなしrce — 自動トリガー(被害者側にガジェットクラスが必要)
S3生の CommonsCollections6 をトップレベルで送信log4j + cc-3.2.1なし拒否 — FOIS が CC をブロック
S4CC6 を MarshalledObject にスプライスlog4j + cc-3.2.1 のみなしrce — 被害者側に攻撃者クラスは不要
S5S4 のペイロードlog4j + cc-3.2.1!java.rmi.MarshalledObject拒否 — 緩和策
S6S4 のペイロードlog4j + cc-3.2.1maxdepth=5;maxbytes=1000000サイレント — 内部ストリームがフィルタを継承。CC6 は深すぎる
S7S4 のペイロードlog4j + cc-3.2.2なしサイレント — 3.2.2 は安全でないファンクターのデシリアライゼーションを無効化

rce = コード実行。reject = FOIS が外部ストリームで例外をスロー。silent = 外部オブジェクトは処理されたが、コードは実行されなかった(より深い層でブロックされた、またはガジェットのバージョンが安全)。

実行方法

root@kitploit:~
./run.sh            # または: make run

要件: Docker のみ(JDK は eclipse-temurin:17-jdk としてプルされます)。スクリプトは公式 jar をダウンロードし、使用前に Maven Central の SHA-1 に対して検証します。脆弱な範囲内の別の Log4j バージョンを指定するには、LOG4J_VERSION=2.20.0 ./run.sh を使用します。

影響と攻撃方法

  • 配信: FOIS ベースのレシーバーへの、シリアライズされた LogEvent の単一の認証なし ~2.8 KB の TCP 書き込み。これは(Log4Shell とは異なり)文字列をログに記録させることでトリガーできるものではありません。ソケットブリッジに生のシリアライズされたバイト列が到達する必要があります。
  • 結果: レシーバープロセス内での任意のコマンド実行。静かに実行されます。
  • 攻撃経路: LogEvent を構築 → Log4j の writeReplace()/writeObject() が Message を MarshalledObject にラップ → ガジェットはその不透明な byte[] 内に隠れる → レシーバー側で readResolve() → message() → MarshalledObject.get() が新規のフィルタリングされていないストリームを開く → ガジェット → Runtime.exec。src/attacker/Attacker.java(poc2)は、純粋な CommonsCollections6 グラフを MarshalledObject の objBytes にスプライスするため、被害者側に攻撃者クラスは不要です。

緩和策

  • 信頼性が高い: レシーバー JVM で -Djdk.serialFilter='!java.rmi.MarshalledObject'(S5)。 注意: これにより、正当なシリアライズされた LogEventProxy オブジェクトもブロックされます(これらも MarshalledObject を使用します)。効果はありますが、シリアライズされたログ転送に対して透過的ではありません。
  • 信頼性が低い: 一般的な maxdepth/maxbytes フィルタ。プロセス全体のフィルタは内部の MarshalledObject ストリームに伝播し、そこで深さがリセットされるため、maxdepth=5 は CC6 をブロックします(S6)が、浅いガジェットは通過します。チェーン深さに依存するため、境界ではありません。
  • 構造的対策: Java シリアライズによるログ転送を排除する(認証付き TLS 上の JSON / RFC 5424 を使用)。既知のガジェット依存関係を削除する。レガシーなシリアライズレシーバーを信頼できないネットワークに公開しない。上流の修正(課題による): 許可リストから MarshalledObject を削除し、かつマーシャリングされたメッセージを Log4j のフィルタリングされた writeWrappedObject/readWrappedObject に移動する。

スコープと正直な限界

  • アプリケーション依存であり、一般的な Log4j RCE ではありません。 認証なしの FOIS ベースのシリアライズ LogEvent レシーバーを公開するアプリケーションかつクラスパスに使用可能なガジェットバージョンを持つアプリケーションが必要です。通常の Log4j デプロイメントはそのようなレシーバーを実行しません。
  • コア内のシリアライズソケットサーバーは 2.8.2 までしか存在しませんでした(net.server.TcpSocketServer は 2017 年に log4j-core から移動され、2.9.0 以降には存在しません)。現代のレシーバーはアプリケーション/サンプルコードであり、このラボはそれをモデル化しています。
  • ガジェットのバージョン依存。 commons-collections 3.2.1 → RCE。3.2.2 はそれをブロックします(S7)。使用可能なガジェットがあれば十分ですが、「commons-collections がある」だけでは十分ではありません。
  • ラボ内の uid=0 はコンテナの root です。Docker エスケープはありません。RCE はレシーバープロセスとして実行されます。
  • プリミティブ(MarshalledObject が resolveClass フィルタを無効化すること)は既知の先行技術です。Apache の議論 #4168(「Log4j 2.x deserialization hardening」)を参照してください。Log4j 固有の自動トリガーが #4255 の貢献です。

レイアウト

root@kitploit:~
run.sh                     ポータブルランナー(チェックサム固定、堅牢化オラクル)
Makefile                   make build | run | clean
src/victim/Receiver.java   FOIS ログレシーバー(ObjectInputStreamLogEventBridge の代替)
src/attacker/Attacker.java ペイロードビルダー: コントロール、PoC-1、PoC-2(CC6 + バイトスプライス)
src/attacker/EvilMessage.java  PoC-1 自己完結型ガジェット
docs/RESULTS.md            エビデンスマトリックス + 分析

参考文献

  • 課題 #4255 — https://github.com/apache/logging-log4j2/issues/4255
  • 議論 #4168(デシリアライゼーションの堅牢化) — https://github.com/apache/logging-log4j2/discussions/4168
  • Log4j CWE-502 FAQ — https://logging.apache.org/security/faq.html
  • Apache Commons Collections セキュリティ通知 — https://commons.apache.org/proper/commons-collections/security.html

クレジット

脆弱性は U-Sec(Wujie Security) によって Apache log4j2 #4255 で報告されました。このリポジトリは、防御研究と検知エンジニアリングのための独立した再現/検証ラボです。

ツールをダウンロード