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リリースにだけ含めることにより、検知を回避しようとしているようです。これにより、バックドアのパーツは比較的検知されづらくなり、依然として依存プロジェクトのビルドプロセス中に使用されています。
バックドアは、複数のコミットで導入される多くのパーツで構成されています。
ビルドプロセスでIFUNCを使用。これは、マルウェアによるシンボル解決機能のハイジャックに使用される
難読化された共有オブジェクトがテストファイルに隠されている
共有オブジェクト(リポジトリには含まれず、リリースにのみ含まれるが、.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が実行されます。
図 1:liblzma フックプロセス
バックドアのパーツの詳細については、Andres Freund氏によるopenwallでの投稿を参照してください。
潜在的な影響
現在は、バックドアが脆弱なマシンのSSHデーモンに追加されているようであり、これによってリモート攻撃者が任意のコードを実行できるようになります。つまり、SSHをインターネットに公開する脆弱なパッケージを持つすべてのマシンが脆弱である可能性があります。
このバックドアは、これまでで最も重大な侵入イネーブラーの1つになりつつあり、それによってSolarWindsバックドアが矮小化されるところでした。攻撃者は、Fedora、Ubuntu、Debianなど、感染ディストリビューションを実行しているすべてのLinuxマシンに即座にアクセスすることができそうでした。あと少しのところでした。
これを止めたのは、Andres Freund氏です。ソフトウェアの更新後に発生した500ミリ秒のレイテンシーの問題を調査した後、Freund氏は問題を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をシステムの環境変数に追加することで、バックドアが無効になる場合があります。