Linux環境で使用されている圧縮ツール「XZ Utils」に仕掛けられたバックドアのスクリプトをGoogleのエンジニアが解説
2024年3月29日に、圧縮ツールのXZ Utilsに、悪意のあるバックドアが仕込まれていたことが明らかになりました。そのバックドア攻撃において攻撃者が使用したスクリプトについてGoogleのエンジニアであるラス・コックス氏が解説しています。
research!rsc: The xz attack shell script
https://research.swtch.com/xz-script
XZ Utilsへの攻撃がどのように行われたのかという時系列順のまとめは下記記事で確認できます。
XZ Utilsにバックドア攻撃が行われるまでのタイムラインまとめ - GIGAZINE
コックス氏は今回の攻撃は大まかに「シェルスクリプト」の部分と「オブジェクトファイル」の部分の2つに分割できると述べました。攻撃はソースコードをコンパイルする「make」に対し、環境に応じて適切な設定を行う「configure」の実行中にシェルスクリプトを挿入し、makeの実行時にシェルスクリプトが悪意のあるオブジェクトファイルをビルドに追加します。
悪意のあるシェルスクリプトとオブジェクトファイルの両方が圧縮・暗号化されてバイナリファイルに埋め込まれ、「テスト用のファイル」としてリポジトリに追加されました。こうしたバイナリファイルは以前からファイルの処理をテストするためにリポジトリに存在しており、攻撃者は新たなテストファイルをいくつか追加しただけのように見えました。
この時追加されたオブジェクトファイルには動的解析ツールのValgrindに問題を引き起こすバグが存在していたため、攻撃者は修正のためにテストファイルを更新する必要がありました。攻撃者はより適切な更新メカニズムが必要であることに気付いたため、「元のファイルは私のマシンのローカルでランダムに生成されました。将来的にこれらのファイルをより適切に再現するために定数シードを使用してファイルを再作成しました」としてファイルを更新すると同時に新たなテストファイルから更新後のスクリプトを探す機能を搭載したとのこと。
今回の攻撃において使用されたシェルスクリプトは、悪質なオブジェクトファイルの_get_cpuid関数をGNU indirect function(ifunc)リゾルバーの一部として呼び出すようにしていました。一般的にこれらのリゾルバーはプログラムの実行中いつでも呼び出すことができるものの、セキュリティ上の理由からプログラム起動の冒頭にある動的リンクの段階で全てのリゾルバーを呼び出し、グローバルオフセットテーブル(GOT)とプロシージャリンケージテーブル(PLT)を読み取り専用でマップすることでバッファオーバーフローなどが発生した時に編集されないようになっています。
しかし今回の攻撃では、攻撃者は本来であれば読み取り専用であるべきテーブルを編集できるほどプログラム起動の早い段階でifuncリゾルバーを実行するようにスクリプトを調整していました。さらにテーブルの「RSA_public_decrypt」をハイジャックし、適切なSSH証明書が提示された際に攻撃者のコードを実行するように改ざんします。
今回の攻撃のシェルスクリプト部分の動作を簡単に述べると上記の通りですが、コックス氏はブログ上でシェルスクリプトのそれぞれの行に対して具体的に動作を解説しているため、気になる人は確認してみてください。
04/04 12:15
GIGAZINE