
カスタムEd448キーペアを使用してXZ Utilsバックドア(CVE-2024-3094)を再現する教育用ラボ。パッチ適用済みのliblzma、systemdサービス、および認可されたセキュリティ研究用のエクスプロイトクライアントが含まれています。
教育目的および許可されたセキュリティ研究のみを対象としています。
CVE-2024-3094 は、XZ Utils (liblzma) のバージョン 5.6.0 および 5.6.1 に導入されたバックドアであり、2024 年 3 月 29 日にセキュリティ研究者 Andres Freund によって発見されました。CVSS スコアは 10.0 (Critical) に設定されました。
これは、サプライチェーン攻撃 であり、脅威アクター「Jia Tan」(JiaT75) によって 2 年以上にわたって実行されました。彼はプロジェクト内で信頼を築き、共同メンテナーの地位を獲得し、バックドアを直接配布用 tarball に導入しました。
バックドアは次のように動作します:
liblzma.so は、glibc の IFUNC 機構 を介して OpenSSH の RSA_public_decrypt() 関数をフックし、SSH 認証プロセスを傍受します。system() を介して sshd の権限 (root) で埋め込まれたコマンドを実行します。このラボは、カスタム Ed448 鍵 (元のアクターの鍵は公開されていません) を使用してバックドアのメカニズムを再現します。
実際の影響を受けたシステムでは chroot はありませんでした。バックドアはシステムの sshd 上で直接動作し、他の共有ライブラリと同様に悪意のある liblzma.so をロードしました — システムとその管理者にとって完全に透過的でした。
このラボでは、実用的な理由から chroot を使用します。ホストシステムのライブラリを置き換えることなく、特定のバージョンの liblzma.so で sshd を実行する必要があります。これは研究環境の設計上の決定であり、本番環境でのバックドアの動作を反映したものではありません。
| コンポーネント | 説明 |
|---|---|
env_fs/ | chroot として使用される最小限の Ubuntu 22.04 ファイルシステム |
env_fs/usr/lib/x86_64-linux-gnu/liblzma.so.5 | カスタム Ed448 鍵でパッチされた liblzma 5.6.1 |
/etc/systemd/system/xzback.service | ポート 2024 で脆弱な sshd を起動する systemd サービス |
/xzbot/xzbot | ソースからコンパイルされたエクスプロイトクライアント |
元のバックドアは非常に特定の条件を必要とし、ラボ環境では自動的に存在しません。以下の変更が必要でした:
MagpieRYL の元のリポジトリに含まれている liblzma.so.5 は、含まれている xzbot バイナリと一致しない未知の Ed448 鍵を使用しています。オリジナルで正規の liblzma.so.5.6.1 を Debian スナップショットからダウンロードし (sha256 検証済み)、amlweems/xzbot の patch.py を使用して seed=0 でパッチしました:
original sha256: 605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4
patched sha256: ea7206ab4b0c3479ff1b478c8803adc9e7aeba243254a9f601b626ef8aa80e3d
patched offset: 0x24470
元のアクターの Ed448 公開鍵は以下に置き換えられました:
5b 3a fe 03 87 8a 49 b2 82 32 d4 f1 a4 42 ae bd
e1 09 f8 07 ac ef 7d fd 9a 7f 65 b9 62 fe 52 d6
54 73 12 ca ce cf f0 43 37 50 8f 9d 25 29 a8 f1
66 91 69 b2 1c 32 c4 80 00
元のサービスは Type=notify を使用しており、sshd が systemd に起動通知を送信する必要があります。chroot 内の sshd はそれを送信せず、タイムアウトが発生します。Type=simple に変更しました。
sshd は権限分離のために /run/sshd を必要とします。このディレクトリは chroot 内に存在せず、再起動のたびに消去されます (run/ は tmpfs のため)。サービス起動の前に自動的に再生成する ExecStartPre で解決しました。
./xzbot -addr 127.0.0.1:2024 -cmd 'echo pwned > /tmp/result'
cat /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
./xzbot -addr <TARGET_IP>:2024 -cmd 'echo pwned > /tmp/result'
コマンドは chroot 内で実行されるため、バックドアコンテキスト内で /tmp/ 以下に作成されたファイルは次の場所に保存されます:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/
つまり、コマンドが echo pwned > /tmp/result の場合、ファイルは次の場所にあります:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
エクスプロイトによって生成されたファイルを探すには:
find /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/ -type f
ssh: handshake failed: EOF というメッセージは 期待される正しい動作 です。バックドアはコマンドを実行し、SSH セッションを確立せずに接続を閉じます。これは失敗を示すものではありません。
このラボでは、カスタム暗号鍵ペア (seed=0) を使用しています。パッチされた liblzma.so は、対応する秘密鍵で署名されたペイロードのみを受け入れます。この秘密鍵は、この環境でコンパイルされた xzbot が使用するものです。他のクライアントは EOF を受け取り、実行は行われません。
このツールは 教育目的および許可されたセキュリティテスト のために提供されています。所有していない、または明示的な書面による許可を得ていないシステムに対して許可なく使用することは違法です。著者は誤用について一切の責任を負いません。