XZ Utils バックドア — 知っておくべきこと、できること
エグゼクティブサマリー
CVE-2024-3094 は、オープンソースライブラリーの XZ Utils で発見された脆弱性であり、メンテナーによってライブラリーにプッシュされた悪性コードが原因です。
これはもともと SSH 認証バイパスのバックドアとして報告されていましたが、 さらなる分析 により、このバックドアが実際にリモートコード実行(RCE)を可能にしていることが示されました。
攻撃者は約 2 年前に XZ プロジェクトに携わり始め、徐々に信頼を築いてメンテナーの役割を任されるようになりました。このような長期的な活動は通常、国家が支援する攻撃者が行うものですが、現在のところどの国家のものかは分かっていません。
このバックドアは最新の XZ Utils リリースに影響するため、悪用されていないリリースにダウングレードすることが推奨されます。このブログ記事では、攻撃の影響範囲を制限するために、可能性のある他の緩和策を提示します。
背景
XZ Utils とその基盤となるライブラリー liblzma は、lzma 圧縮と解凍を実装するオープンソースプロジェクトです。これらは多くの Linux ディストリビューションに標準で含まれていて、開発者に非常に人気があり、Linux エコシステム全体で広く使用されています。
約 2 年前、Jia Tan という名前の開発者がプロジェクトに参加し、さまざまなバグ修正や改善のプルリクエストを開始しました。それまでは、何も変わったことはありませんでした。オープンソースの世界とはそういうものです。やがて、信頼を築いた Jia Tan はリポジトリの権限を得るようになりました。まずはコミット権限、最終的にはリリースマネージャーの権限を得ました。
こうした権限を得るための取り組みの一環として、Jia Tan は興味深い形式の ソーシャルエンジニアリングを使用していたようです。その手法とは、偽のアカウントを使って、バグに関する無数の機能リクエストや苦情を送信し、元のメンテナーに圧力をかけ、最終的に別のメンテナーをリポジトリに追加する必要性を生じさせる物でした。
約 2 年間コードに携わった後、2023 年に Jia Tan はリリース 5.6.0 に含まれていたいくつかの変更を XZ に加えました。この変更の中に、高度なバックドアがありました。
バックドア
このバックドアはかなり複雑です。まず、xz GitHub リポジトリにはありません(このリポジトリは現在無効になっていますが、そういう問題ではありません)。この悪意を持ったメンテナーは、バックドアの一部をパブリック git リポジトリにプッシュするのではなく、それをソースコードの tarball リリースにだけ含めることにより、検知を回避しようとしているようです。これにより、バックドアのパーツは比較的検知されづらくなり、依然として 依存プロジェクトのビルドプロセス中に使用されています。
バックドアは、複数のコミットで導入される多くのパーツで構成されています。
ビルドプロセスで IFUNI を使用。これは、マルウェアによるシンボル解決機能のハイジャックに使用される
難読化された共有オブジェクトが テストファイルに隠されている
共有オブジェクト(リポジトリには含まれず、リリースにのみ含まれるが、 .gitignoreに追加される)を抽出するライブラリーのビルドプロセス中にスクリプトセットを実行
ランドロック(プロセス権限を制限するセキュリティ機能)を無効化
また、実行チェーンは次のような複数のステージで構成されています。
悪性スクリプト build-to-host.m4 がライブラリーのビルドプロセス中に実行され、「テスト」ファイル bad-3-corrupt_lzma2.xz を bash スクリプトにデコード
bash スクリプトは、別の「テスト」ファイル good-large_compressed.lzmaでより複雑なデコードプロセスを実行し、別のスクリプトにデコード
続いて、そのスクリプトは共有オブジェクト liblzma_la-crc64-fast.oを抽出し、それを liblzma のコンパイルプロセスに追加
このプロセスを把握するのは確かに困難です。そのため、 Thomas Roccia 氏の インフォグラフィック で視覚的な参考情報や詳細な分析を確認することをお勧めします。
共有オブジェクト自体は liblzma にコンパイルされ、通常の関数名解決プロセスに取って代わります。(任意の)プロセスのロード中、関数名はプロセスメモリーを指す実際のポインターへと解決され、バイナリーコードを指します。悪性ライブラリーは関数解決プロセスを妨害するため、OpenSSH 関数 RSA_public_decrypt の関数ポインターに取って代わる可能性があります(図 1)。
そして、その関数が自身の悪性関数の 1 つを指すようにします。 Filippo Valsorda氏が発表した調査結果によれば、(攻撃者であることを確認した後)それが認証クライアントの証明書からコマンドを抽出し、実行のために system() 関数に渡します。これにより、認証前に RCE が実行されます。
バックドアのパーツの詳細については、 Andres Freund氏による openwall での投稿を参照してください。
潜在的な影響
現在は、バックドアが脆弱なマシンの SSH デーモンに追加されているようであり、これによってリモート攻撃者が任意のコードを実行できるようになります。つまり、SSH をインターネットに公開する脆弱なパッケージを持つすべてのマシンが脆弱である可能性があります。
このバックドアは、これまでで最も重大な侵入イネーブラーの 1 つになりつつあり、それによって SolarWinds バックドアが矮小化されるところでした。攻撃者は、Fedora、Ubuntu、Debian など、感染ディストリビューションを実行しているすべての Linux マシンに即座にアクセスすることができそうでした。あと少しのところでした。
これを止めたのは、Andres Freund 氏です。ソフトウェアの更新後に発生した 500 ミリ秒のレイテンシーの問題を調査した後、Andres 氏は問題を xz パッケージまでさかのぼり、最終的にバックドアを特定することができました。
ここで気になることがいくつもあります。私たちはたまたま幸運に恵まれましたが、このバックドアが好奇心旺盛なエンジニアによって検知されなかったとしたら、どのくらいの期間アクティブになっていたでしょうか?
そして、おそらくもっと心配なことは、この問題が以前に発生していた場合はどうなるのか、ということです。
検知と緩和
バージョン管理
Cybersecurity and Infrastructure Security Agency (CISA)が推奨するアクションは、 悪用されていないバージョン(5.4.6 など)にダウングレードすることです。
現在システムにインストールされている XZ Utils または liblzma のバージョンを確認するためには、次のクエリーを Akamai Guardicore Segmentation Insight で実行し、liblzma ライブラリーのロードされたインスタンスを探します(図 2)。
SELECT DISTINCT path AS liblzma_path
FROM process_memory_map
WHERE LOWER(path) LIKE "%liblzma%"
または、次のクエリーを実行して、インストールされているバージョンのパッケージマネージャーを検索します。
SELECT name AS vulnerable_item, 'DEB' AS type, version
FROM deb_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
UNION
SELECT name AS vulnerable_item, 'RPM' AS type, version
FROM rpm_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
もちろん、フィルタリングによって脆弱なアセットのみを表示することもできます。
SELECT path AS vulnerable_item, "Loaded Library" AS type, '5.6%' AS version
FROM process_memory_map
WHERE LOWER(path) LIKE "%liblzma%5.6%"
SELECT name AS vulnerable_item, 'DEB' AS type, version
FROM deb_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
AND version LIKE '5.6.%'
UNION
SELECT name AS vulnerable_item, 'RPM' AS type, version
FROM rpm_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
AND version LIKE '5.6.%'
脅威ハンティング
このバックドアは認証を可能にするだけでなく、実際にシステムコマンドを実行するため、プロセス追跡によってこのふるまいを検知できる場合があります。
通常、ログオン時に、ロギングユーザー用に新しいシェルが作成され、デフォルトのシェルプロセス(bash など)が実行されます。しかし、このバックドアを使用すると、実際に悪性コマンドが SSH デーモンプロセス( sshd)によって実行され、異常が発生する可能性があります。
Akamai の脅威ハンティングサービスである Akamai Huntには、このような異常を検知するためのメソッドが用意されています。たとえば、常にプロセスアクティビティとその子プロセスの ベースラインを追跡 します。
キルスイッチ
このバックドアに関するいくつかの分析結果によると、環境変数キルスイッチがあるようです。キー yolAbejyiejuvnup=Evjtgvsh5okmkAvj をシステムの環境変数に追加することで、バックドアが無効になる場合があります。