XZバックドア事件 - 初期分析結果
(securelist.com)-
Timeline of events:
- 2024.01.19: XZ website moved to GitHub pages by a new maintainer (jiaT75)
- 2024.02.15: "build-to-host.m4" is added to .gitignore
- 2024.02.23: Two "test files" containing malicious script stages are introduced
- 2024.02.24: XZ 5.6.0 is released
- 2024.02.26: Commit in CMakeLists.txt sabotaging the Landlock security feature
- 2024.03.04: Backdoor causes issues with Valgrind
- 2024.03.09: Two "test files" are updated, CRC functions modified, Valgrind issue "fixed"
- 2024.03.09: XZ 5.6.1 is released
- 2024.03.28: Bug discovered, Debian and RedHat notified, Debian rolls back XZ
- 2024.03.29: Email published on OSS-security mailing list, RedHat confirms backdoored XZ shipped
- 2024.03.30: Debian shuts down builds and starts rebuild process
- 2024.04.02: XZ main developer recognizes the backdoor incident
-
悪意あるバックドアが含まれたXZ配布版のハッシュ値:
- xz-5.6.0: MD5、SHA1、SHA256ハッシュ値が提供されている
- xz-5.6.1: MD5、SHA1、SHA256ハッシュ値が提供されている
初期感染分析
-
Stage 1 - 改ざんされたbuild-to-hostスクリプト:
- リリース用ソースファイル自体は当初無害だったが、攻撃者が制御するURLからダウンロードした場合、悪性コードを実行する
build-to-host.m4ファイルが含まれていた - この
.m4ファイルはビルド中に実行され、テストフォルダに追加された最初のファイルを改変して展開する
- リリース用ソースファイル自体は当初無害だったが、攻撃者が制御するURLからダウンロードした場合、悪性コードを実行する
-
Stage 2 - 注入されたシェルスクリプト:
.m4ファイルによって注入された悪性スクリプトは、Linux上で意図されたビルドプロセス内で実行されているかを確認するgood-large_compressed.lzmaファイルを使って次の段階を実行するが、これは通常どおり圧縮されている一方、展開後のデータ内部にはゴミデータが含まれているhead/tailコマンドで33,492バイトを抽出し、trコマンドで基本的な置換を適用して難読化を解除する
-
Stage 3 - バックドア抽出:
- 最終段階のシェルスクリプトは、想定された環境で実行中かどうかを確認するために複数の検査を行う
- 同じ
good-large_compressed.lzmaファイルの別オフセットに隠されたバックドアのバイナリコード本体を抽出する - XZツールでファイルを抽出し、一連の
head呼び出しによってRC4類似アルゴリズムを使ってバイナリデータを復号する - 圧縮ファイルをXZで展開し、predefined値を使って先頭バイトを削除した後、
liblzma_la-crc64-fast.oとして保存する crc_x86_clmul.hのis_arch_extension_supported関数を修正し、__get_cpuid呼び出しを_get_cpuidに変更する
バイナリバックドア分析
-
ステルスローディングのシナリオ:
- XZはCRC計算に
lzma_crc32、lzma_crc64関数を使用しており、ELFシンボルテーブルにはIFUNC型として格納されている - 最適化版を使うかどうかを動的に決定するためにIFUNCが使われている
- バックドアはオブジェクトファイルとして保存され、主な狙いはコンパイル時に
main実行ファイルへリンクされることにある - オブジェクトファイルには
_get_cpuidシンボルが含まれており、元のソースでアンダースコアを1つ取り除くことで、コードが_get_cpuidを呼ぶと実際にはバックドア版が呼ばれるようになる
- XZはCRC計算に
-
バックドアコード分析:
- 初期バックドアコードは2回呼び出され、実際の悪性活動は
lzma_crc64IFUNCが_get_cpuidを呼ぶときに始まる - GOTアドレスを見つけて
cpuidポインタの位置を特定し、mainの悪性関数ポインタに置き換える - 感染システムへのすべての接続を監視できるよう、特定の関数をフックすることが主な目的となっている
- 初期バックドアコードは2回呼び出され、実際の悪性活動は
-
核心的な動作:
RSA_public_decrypt、EVP_PKEY_set1_RSA、RSA_get0_keyなどのlibcrypto関数をフック対象としている- 現在のプロセスが実行条件に合致するかを検査し、kill switchの存在を確認する
- Trie構造を使って文字列演算を行う
- 3つ以上のsymbol resolverルーチンを使ってELF Symbol構造体の位置を見つける
rtdl-audit機能を悪用し、symbol resolvingルーチンをハイジャックすることで関数フッキングを実現する
GN⁺の意見
-
この記事は、オープンソースソフトウェアにマルウェアが注入された非常に巧妙な攻撃事例をよく示している。オープンソースの利点が逆に悪用され得るという教訓を与える。
-
Linuxシステムを狙うサイバー攻撃とバックドアはますます高度化している。特にSSHサーバーを通じた攻撃は深刻なセキュリティ脅威になり得る。
-
一方で、オープンソース生態系の自浄能力も示している。最終的にバックドアはコミュニティによって発見され、迅速に対応された。透明性が鍵だ。
-
高度なTrieデータ構造、Symbol Resolver、
dl_auditフッキングなどの技法が使われたことは、Linuxマルウェアの技術的進化を示している。Linuxシステムのセキュリティにも特別な注意が必要だ。 -
企業がオープンソースソフトウェアを導入する際は、ライセンスだけでなくセキュリティ面の検証も必須だ。信頼できる配布元かどうか、コードに対する継続的な監視が行われているかを必ず確認すべきである。
1件のコメント
Hacker News の意見
要約: