7.

XZ / LZMA2(.xz)完全ガイド — 高圧縮アルゴリズム・Linux カーネル採用・CVE-2024-3094 教訓

編集
この記事の要点
  • xz は LZMA2 アルゴリズムを採用したストリーム圧縮形式で、bzip2 より高圧縮、gzip より大幅に高圧縮率を実現する
  • マジックナンバーは FD 37 7A 58 5A 00(ASCII で .7zXZ.)。7-Zip の Igor Pavlov が開発した LZMA を Tukaani Project が独立形式化
  • Linux カーネル公式配布が 2013 年に xz へ移行したことで、現代の OSS 配布における事実上の標準アーカイブ形式となった
  • コマンドは xz / unxz / xzcat、tar 統合は tar -J、並列化は xz -T0(全コア使用)
  • 🚨 CVE-2024-3094 (xz-utils backdoor): 2024 年 3 月発覚した史上最悪級の供給網攻撃。xz-utils 5.6.0/5.6.1 に SSH 認証をバイパスするバックドアが仕込まれた
  • バックドア事件以降、xz-utils はメンテナ体制を刷新し、5.6.2 以降は安全。配布物は必ず最新版を使うこと
  • 圧縮率は最高クラスだが速度・メモリは重く、CPU 弱い環境では zstdgzip の方が実用的なこともある

概要

xz は、フィンランド発の Tukaani Project が開発したストリーム型のロスレス圧縮ファイル形式およびユーティリティです。中核となるアルゴリズム LZMA2 は、もともと 7-Zip の作者 Igor Pavlov が考案した LZMA(Lempel-Ziv-Markov chain Algorithm)を独立形式化したもので、極めて高い圧縮率を実現します。

2009 年に xz Utils 4.999.x がリリースされ、その後 Linux ディストリビューションのソースアーカイブが続々と .tar.gz / .tar.bz2 から .tar.xz へ移行しました。決定打となったのは 2013 年の Linux カーネル公式 tarball が xz 形式のみの配布へ切り替わった出来事で、これ以降「現代の OSS 配布における事実上の標準形式」の座を確立しました。

しかし、2024 年 3 月に発覚した CVE-2024-3094(xz-utils バックドア事件)により、xz は単なる圧縮形式の話を超えて「供給網攻撃の教科書事例」として情報セキュリティ史に刻まれることになりました。本記事の後半で詳述します。

内部構造とマジックナンバー

xz ファイルは固定マジック、ストリームヘッダ、1 個以上のブロック、インデックス、ストリームフッタという順序で構成されます。

オフセット内容値(hex)
0-5マジックナンバーFD 37 7A 58 5A 00(".7zXZ.")
6-7Stream Flags(チェックサム種別)CRC32 / CRC64 / SHA-256
8-11CRC32 of Stream Header4 バイト
...Block(s)(LZMA2 圧縮データ)可変長
末尾-12Indexブロックサイズ一覧
末尾Stream Footer + マジック 59 5A("YZ")12 バイト

LZMA2 は LZMA を改良し「非圧縮ブロックを混在可能」「リセット可能」にしたもので、並列処理と耐障害性が向上しています。これにより xz -T0 でマルチコア圧縮が可能となり、巨大ファイルの圧縮時間が大幅に短縮されました。

辞書サイズは最大 4 GB まで設定可能(実用上はプリセット -6 の 8 MB、-9 の 64 MB が一般的)で、これが bzip2 を上回る圧縮率の源泉となっています。

主な用途

  • Linux ディストリビューションのソース配布: kernel.org、GNU プロジェクト、freedesktop.org など主要 OSS のリリース tarball
  • パッケージ圧縮: Arch Linux の .pkg.tar.xz(2020 年以降は zstd 化)、Fedora RPM、Debian deb 内部の data.tar.xz
  • 長期アーカイブ: 容量を極力小さくしたいバックアップ、論文・データセットの公開
  • 組み込み・ファームウェア: ROM 容量制約のある機器でファームウェアイメージを圧縮

関連形式との比較

形式アルゴリズム圧縮率圧縮速度展開速度メモリ
gzipDEFLATE非常に速
bzip2BWT+Huffman普通
xz (-9)LZMA2非常に高非常に遅普通大(〜674MB)
zstd (--ultra -22)FSE+LZ77 派生xz 同等非常に速中〜大
7z (LZMA2 内包)LZMA2 等非常に高普通

xz は「圧縮時間さえ気にしなければ最高クラスの圧縮率」を提供します。展開は意外に速く、配布側が一度圧縮すれば多数のユーザに展開コストを押し付けないという意味で OSS 配布に好相性です。

コマンド・ツール

# xz で圧縮 (元ファイル消滅 → file.txt.xz)
xz file.txt

# 元ファイルを保持
xz -k file.txt

# 圧縮レベル指定 (-0 から -9、-9e は extreme でさらに圧縮)
xz -9e -k file.txt

# 展開
unxz file.txt.xz
# または
xz -d file.txt.xz

# 標準出力へ展開(パイプ)
xzcat file.txt.xz | grep ERROR

# 並列圧縮(全コア使用、ファイル分割不要)
xz -T0 -9 large.log

# tar との組み合わせ (.tar.xz / .txz)
tar cJvf archive.tar.xz ./dir/       # J = xz
tar xJvf archive.tar.xz              # 展開

# 圧縮率の確認
xz -l file.txt.xz                    # 圧縮前後のサイズと比率を表示

注意点・落とし穴

  • 🚨 CVE-2024-3094(xz-utils バックドア事件): 2024 年 3 月、xz-utils 5.6.0 および 5.6.1 に SSH 認証をバイパスする悪意あるコード が混入していたことが発覚しました。Microsoft の Andres Freund 氏が SSH ログインの速度低下を不審に思い、調査した結果発見されたものです。
    • 攻撃者「Jia Tan」は数年かけてメンテナとして信頼を獲得し、リリース署名権限を得てから攻撃を実行
    • バックドアは libsystemd 経由で sshd にロードされる仕組みで、特定の RSA 鍵を持つ攻撃者だけが認証回避可能
    • Debian unstable / Fedora 40 beta / openSUSE Tumbleweed などの一部に配布済みだったが、安定版リリース前に発覚し被害は限定的
    • 教訓: 単一メンテナへの過度な依存、ビルドスクリプト(autoconf)の見落とし、テストデータ偽装による検出回避、OSS サプライチェーン全体の信頼モデル再考が必要
    • 5.6.2 以降は問題コードを除去済み。ディストリビューションが配布するパッケージは安全だが、自前ビルドする場合はバージョン確認必須
  • 圧縮メモリ要求が大きい: -9 圧縮は 674 MB、-9e は同等、解凍も 64 MB 必要。低メモリ環境では -6 以下に抑える。
  • 破壊的動作: bzip2 と同様、デフォルトで元ファイルを削除する。-k で保持。
  • シーク不可: 内部にインデックスはあるがランダムアクセスは限定的。一部だけ取り出す用途では工夫が必要。
  • 古い tar とは非互換: tar -J オプションは GNU tar 1.22+ から。Solaris の標準 tar などでは別途 xz -d | tar xf - のパイプ展開が必要。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ZIP(.zip)
  2. TAR(.tar)
  3. GZ / GZIP(.gz / .tgz)
  4. 7z(.7z)
  5. RAR(.rar)
  6. BZ2 / BZIP2(.bz2 / .tbz2)
  7. XZ / LZMA2(.xz / .txz)
  8. Zstandard(.zst / .zstd)
  9. CAB(.cab)
  10. LZH(.lzh / .lha)

最近更新/作成されたページ