XZ Utils(以前のLZMA Utils)は自由なコマンドライン可逆圧縮ソフトウェアのセットであり、LZMAとxzを含んでいる。Unix系オペレーティングシステムおよび、バージョン5.0以降はWindowsにも対応している。
xzはgzipとbzip2のような代替ソフトウェアよりもより高い圧縮率になる。 伸長速度はbzip2より速いが、gzipよりも遅い。圧縮はgzipよりもだいぶ遅くなることがあり、高圧縮ではbzip2よりも遅い。圧縮されたファイルが頻繁に使われるときに最も有用となる。
XZ Utilsは大まかに2つの構成要素からなる。
- xz。コマンドラインの圧縮・伸長ソフトウェア(gzipに類似している)
- liblzma。zlibに似たAPIを持つライブラリ
様々なコマンドラインのショートカットがある。例えばlzma(xz --format=lzma)、unxz(xz --decompress。gunzipに類似している)、そしてxzcat(unxz --stdout。zcatに類似している)。
XZ Utilsはxzとlzmaファイル形式の両方を圧縮・伸長できるが、LZMA形式は今やレガシーであるため、 XZ Utilsはxz形式をデフォルトとして圧縮する。
2024年3月29日、本ソフトウェアのバージョン5.6.0と5.6.1に、悪意を持って仕掛けられたバックドアが発見された。下記#サプライチェーン攻撃参照。
実装
ファイル形式の性質と同じようにソフトウェアの振る舞いもまた、Unix圧縮ツールのgzipとbzip2に似た動作になるように設計されている。これはIgor PavlovのLZMA-SDKのUnix移植版から構成されており、Unix環境とその通常の構造と振る舞いに対してシームレスに組み込むためになじむようにされている。
xzは2014年のバージョン5.2.0以降、マルチスレッド圧縮をサポートしている(-Tフラグ)。2019年時点ではスレッド化された伸長はまだ実装されていない。ファイルがスレッドに対して与えられた設定よりも十分に大きくはないか、あるいは使用しているスレッドがメモリ使用制限を超過しているならば、定義されているよりも少ないスレッド数になることがありうる。
ちょうどgzipとbzipのように、xzとlzmaは入力として単一のファイル(またはデータストリーム)を圧縮することしかできない。複数のファイルを単一のアーカイブへ束ねることはできない。それをするためには、最初にtarのようなアーカイブするプログラムを使用する。
アーカイブを圧縮する:
xz my_archive.tar # 結果はmy_archive.tar.xzへ lzma my_archive.tar # 結果はmy_archive.tar.lzmaへ
アーカイブを伸長する:
unxz my_archive.tar.xz # 結果はmy_archive.tarへ unlzma my_archive.tar.lzma # 結果はmy_archive.tarへ
tarのGNU実装のバージョン1.22以降ではtarballのlzmaやxzへの透過的な圧縮をサポートしており、xz圧縮については--xzまたは-J、LZMA圧縮では--lzmaスイッチが使用できる。
アーカイブを作成して圧縮する:
tar -c --xz -f my_archive.tar.xz /some_directory # 結果はmy_archive.tar.xzへ tar -c --lzma -f my_archive.tar.lzma /some_directory # 結果はmy_archive.tar.lzmaへ
アーカイブを伸長してその内容を展開する:
tar -x --xz -f my_archive.tar.xz # 結果は/some_directoryへ tar -x --lzma -f my_archive.tar.lzma # 結果は/some_directoryへ
開発と採用
XZ Utilsの開発はTukaani Projectで行われている。Mike KeznerをリーダーとしてかつてSlackwareをベースとしたLinuxディストリビューションをメンテナンスしていた小さなグループだった。
xzとliblzmaのすべてのソースコードはパブリックドメインでリリースされている。XZ Utilsソースコード配布物は、付加的に、複数のGPLバージョンの対象となる、いくつかのオプションスクリプトとサンプルプログラムを含んでいる。
特に、配布されているXZ Utilsソフトウェアが含んでいるGPLスクリプトとソースコードの一覧は以下のとおりである。
- 一般的なlibc関数であるgetoptのオプション実装(GNU GPL v2とGNU LGPL v2.1)
- pthreadを検出するm4スクリプト(GNU GPL v3)
- いくつかの必須でないラッパースクリプト(xzgrepなど)(GNU GPL v2)
- そしてサンプルプログラムscanlzma。これはビルドシステムに統合されていない。
結果としてxzとliblzmaのバイナリはパブリックドメインだが、例外的にオプションのLGPL getopt実装は統合されていない。
バイナリはFreeBSD、Linuxシステム、Microsoft Windows、そしてFreeDOSで利用できる。Fedora、Slackware、Ubuntu、そしてDebianを含む多くのLinuxディストリビューションがソフトウェアパッケージの圧縮にxzを使用している。Arch Linuxは以前はパッケージの圧縮にxzを使用していたが、2019年12月27日以降は、パッケージはZstandardで圧縮されている。GNUのFTPアーカイブもまたxzを使用している。
サプライチェーン攻撃
2024年3月29日、liblzmaのコードにバックドアが仕掛けられている可能性があることがOpenwallのセキュリティメーリングリストにて報告された。報告者であるAndres Freundは、sshdのCPU使用率が異常であることに気が付き、その原因を突き止めるべく調査を開始したところ、liblzmaにテスト用として追加されたtarballがバックドアのセットアップに使用されていることを突き止めた。この問題はレッドハットによってCVE識別番号 CVE-2024-3094として登録された。問題のコードは、2024年2月24日頃に挿入された。
本脆弱性により、一部の環境において悪意のある者がsshdの認証を突破し遠隔でシステムにアクセスできるようになる可能性がある。この悪意のあるコードはバージョン5.6.0と5.6.1に含まれていることが知られている。
このバックドアの影響を受けるLinuxディストリビューションにはDebian unstable、Arch Linux、Fedora Rawhide、Kali Linux、openSUSE Tumbleweedが含まれている。Red Hat Enterprise Linux、SUSE Linux Enterprise、Amazon Linuxはこのバックドアの影響を受けないことが確認されている。またArch Linuxでは、バックドアに必要なOpenSSHがlibsystemdをロードするためのパッチを採用していないため本脆弱性の影響を受けないとされるが、速やかなアップデートの実施を呼びかけている。
FreeBSDは、この攻撃がLinuxを対象としていること、及び現在サポートされているすべてのリリースが本脆弱性を含むバージョンより以前のものを採用していることから、本脆弱性の影響を受けないとしている。
その後の調査で、攻撃者は約3年をかけてプロジェクト内での重要な立場を手に入れていたことが判明した。元アメリカ国家安全保障局のハッカーであるDave Aitelは、この攻撃パターンはロシア対外情報庁のハッカーとみられているAPT29によるものと非常によく似ていると主張した。
関連項目
参考文献
外部リンク
- 公式ウェブサイト
- SourceForge project page




