サイバーリーズンでは、重要な脆弱性を含む新たな脅威に関する情報をお客様に提供するために、脅威分析レポートを発行しています。同レポートは、新たな脅威に関する情報をまとめた上で、それらの脅威から身を守るための実践的な推奨事項を提供するものです。

現在の状況

Linuxオペレーティングシステム向けのオープンソース圧縮ライブラリである「XZ Utils」のバージョン5.6.0および5.6.1に、巧妙なバックドアが発見されました。

XZはLinuxで広く使われている圧縮フォーマットであり、XZ Utilsはオープンソースであれ商用であれ、ほとんどのディストリビューションに含まれています。これは、大きなファイルをより小さなサイズへと圧縮することで、共有や転送を容易にするツールです。

今回のサプライチェーン攻撃は、Secure Shell (SSH) の完全性を侵害することを狙ったものです。SSHは暗号ネットワークプロトコルの1つであり、安全でないネットワーク経由でシステムをリモート操作する場合に、リモートコマンドを実行するために使用されます。

この脆弱性はCVE-2024-3094として追跡されており、そのCVSSスコアは10点満点中10点です。このバックドアは、SSHが提供する暗号化された通信チャネルの完全性を侵害し、脆弱性のあるXZ Utilsライブラリをインストールした端末を乗っ取る機能を持っていることが疑われています。

影響

現在、影響を受けるシステムは、脆弱性のあるライブラリを含んでいるLinuxディストリビューションを使用しているものに限られています。多くの場合、この脆弱性を持つライブラリは、各ディストリビューションのリリースチャネルにおける開発ブランチまたはExperimentalブランチ上に存在しています。

脆弱性のあるオペレーティングシステムとその対策

この脆弱性の影響を受けるLinuxオペレーティングシステムのディストリビューション名、ブランチ名、およびパッケージ名、そしてユーザーが取るべき対策を下記の表に示します。

ディストリビューション 影響を受けるブランチ 影響を受けるパッケージ 対策
Fedora 40、41、Rawhide
(アクティブ開発)
xz-5.6.0-*
xz-5.6.1-*
Fedora 40 BETA
ディストリビューションの場合:最新バージョン(5.4.x)にアップデートすること
Fedora 41およびRawhideの場合:直ちに利用を中止すること
Debian テスト中の不安定版(sid)、Experimental xz-utils 5.5.1alpha-0.1
(2024-02-01にアップロードされたもの)5.6.1-1を含む
最新バージョン(5.6.1+really5.4.5-1)にアップデートすること
Alpine Edge(アクティブ開発) xz 5.6.1-r0、5.6.1-r1 最新バージョン(5.6.1-r2)にアップデートすること
Kali なし xz-utils 5.6.0-0.2
(3月26日~29日の間にアップデートされたKali インストール環境)
最新バージョン(5.6.1+really5.4.5-1)にアップデートすること
OpenSUSE Tumbleweed xz-5.6.0、xz-5.6.1 最新バージョン(5.6.1.revertto5.4)にアップデートすること
Arch Linux なし xz 5.6.0-1 最新バージョン(5.6.1-2)にアップデートすること

■脆弱性のあるXZ Utilsのバージョン

  • xz-5.6.0
  • xz 5.6.0-1
  • xz 5.6.1-r0
  • xz-5.6.1
  • xz 5.6.1-r1
  • xz-utils 5.6.0-0.2

■推奨事項

  • 軽減策CISAは、ユーザーと開発者に、XZ UtilsをXZ Utils 5.4.6のような「脆弱性のないバージョン」にダウングレードすることを推奨しています。
  • 検知Cybereason EDRのようなEDRを通じて、組織が管理しているLinuxシステムを確実に監視することにより、同システムをプロアクティブに保護すること。
  • 検知:バックドア付きの脆弱なバージョンを特定すること。また問題のあるバージョンを見つけること。

主な調査結果

サプライチェーン攻撃とオープンソースソフトウェアについて
サプライチェーン攻撃は、ある組織のITインフラストラクチャ内で使用されているサードパーティ製の信頼できるソフトウェアコンポーネントを標的とすることで、当該組織をハッキングすることを目的としています。サイバーリーズンでは、サプライチェーン攻撃に関する記事をこれまで何度も公開しており、最も顕著な例としてSolarwindsへのサプライチェーン攻撃が挙げられます。

FOSS(Free and Open Source Software)は、ソースコードが公開されているため、ソースが公開されていないソフトウェアよりも安全だと思われがちです。しかし、FOSSプロジェクトは、しばしば重要なシステムのOSと統合されたソフトウェアを保守するために、過剰な人員と労働を強いられる献身的な開発者チームに依存しているのが実情です。FOSSのソースコードは公開されているものの、多くのプロジェクトは、コードベースのセキュリティをチェックするようなコードレビューをほとんど受けていません。

■XZ Utilsとは?
XZ Utilsとは、コマンドライン型のロスレスデータ圧縮を行うフリーソフトウェアであり、ほぼすべてのLinuxシステムに含まれています。XZ Utilsは、さまざまな操作でのデータの圧縮と解凍において重要な役割を果たします。さらに、同ツールはレガシーなlzmaフォーマットをサポートしているため、古いシステムとの互換性があります。

要するに、XZ UtilsはLinuxシステムの重要な一部であり、広く利用されています。XZ utilsプロジェクトは、公開コードリポジトリであるGithubでホスティングされています。XZ-utilsパッケージは、多くのLinux OSディストリビューションのコアシステムモジュールとして使用されており、LinuxオペレーティングシステムがXZおよびlzma圧縮ファイルフォーマットを扱うためのネイティブサポートを提供しています。

バックドアの概要

2024年3月29日(金)、XZ Utilsライブラリにバックドアが存在することが確認され、この件はAndres Freund氏により公開されました(同氏は、Microsoftの主任セキュリティエンジニアであり、PostgreSQLの開発者兼保守者でもあります)。この脆弱性を突くことで、攻撃者は、事前定義された暗号化された秘密鍵を利用して、被害者の端末上でrootとしてコマンドを実行することが可能になります。この脆弱性は、約2年間にわたって発生した巧妙なサプライチェーン攻撃により導入されたものです。

この2年間にわたり、XZ Utilsリポジトリを保守していたチームには、”JiaT75″という名のユーザーが参加していました。JiaT75は、オープンソースプロジェクトへの評判の良い貢献者としての地位を確立していたユーザーでしたが、JiaT75は最終的にXZ Utilsにこのバックドアを導入し、同バックドアはXZ Utilsバージョン5.6.0および5.6.1でエンドユーザーにプッシュされました。同時に、JiaT75は、OSS-Fuzzのようなプロジェクトでのセキュリティチェックを減らすことにより、このバックドアを隠そうとしていました。

このバックドアは、ペイロードを含む2つの「テストファイル」と、ペイロードのローディングプロセスを開始する改変されたm4スクリプト(m4/build-to-host.m4)を通じて、当該オープンソースプロジェクトに導入されました。テストファイルはまずオープンソースプロジェクトに追加され、これはgitリポジトリ内に見つかりました。しかし、m4の改変はgithubのtarボールの中でのみ行われており、gitに対してはチェックインされていません。この脆弱性のビルドプロセスを要約すると次のようになります。

  1. 悪意あるスクリプトbuild-to-host.m4が、被害者ホスト上でのライブラリのビルドプロセス中に実行されます。その結果、”test”ファイルであるbad-3-corrupt_lzma2.xzがデコードされ、”tests/files/bad-3-corrupt_lzma2.xz”に置かれているbashスクリプトへと変換されます。
  2. 続いて、このbashスクリプトは、もう1つの”test”ファイルであるgood-large_compressed.lzmaに対して、より複雑なデコード処理を行うことで、同ファイルをもう1つのスクリプトへとデコードします。
  3. その後、このスクリプトが、共有オブジェクトであるliblzma_la-crc64-fast.oを抽出します。この共有オブジェクトが、liblzmaのコンパイルプロセスに追加されます。

このバックドアは複雑であり、ビルドプロセス中に実行される複数のステージから構成されています。このバックドアの持つ全機能と内部構造は、セキュリティ研究者により現在もなお分析中です。このバックドアは、コード難読化、アンチ分析、条件付き実行の手法を採用することで、検知を回避しています。ペイロードの実行は、それ自体が複数のステップからなるプロセスです。

  1. このペイロードは、GNUの間接関数(ifunc)を、プログラムの電話交換手のように使用します。これにより、プログラムは実行時に関数の異なるバージョンを選択できるようになります。これは、ある関数の実装が複数存在し、それぞれが異なる種類のハードウェアや異なるシステム条件に対して最適化されているような状況を想定しています。この決定は、プログラムの主要部分が実行される前であっても、非常に早い段階で行われるため、プロセスの実行を動的に変更できます。これは、何かを作り始める前に、どのツールを使うかを決めるようなものです。
  2. ペイロードは、監査フックの改変を使用します。監査フックとは、プログラムの関数のマップGOT(グローバルオフセットテーブル)をメモリアドレスへと変換するツールのことです。この機能は通常、セキュリティ目的(バッファオーバーフローを防ぐため)に使用されますが、今回のケースでは、プログラムが開始され最初のリンクが行われた後でも、攻撃者は、この機能を使用して関数呼び出しを有害なコードへとリダイレクトできるようになります。これは、誰かがすでに目的に向かっている途中で、地図上の方向を変更するようなものです。これにより、攻撃者は、プログラムの実行中にそのプログラムが行うことを変更できるようになるのです。

今回のケースでは、監査フックはバックドアを発動させるために必要なダイナミックリンクプロセスの可視性と制御を得るために使われており、一方、ifuncは条件付き関数リダイレクトのメカニズムを提供します。ifuncは、特定の条件に基づいて自動車(関数)をリダイレクトできる「信号機」のようなものだと考えるとよいでしょう。

これらの機能を組み合わせることにより、攻撃者は当該テーブルがまだ編集可能な状態である間にそれをGOTにロードし、OpenSSL(汎用的な暗号化と安全な通信のためのオープンソースツールキット)の関数であるRSA_public_decryptをバックドア付きのバージョンに置き換えることが可能となりました。

同関数は、OpenSSHでは通常、鍵の事前認証に使われますが、今回のケースでは、攻撃者自身の悪意あるコードをポイントするために使われます。このコードは、接続が攻撃者からのものであることを(非対称鍵交換により)検証し、認証クライアントの証明書からコマンドを抽出します。これにより、攻撃者による認証前の完全なリモートコード実行が実現されるのです。

このバックドアは、認証局(CA)の署名鍵N値に含まれているペイロードを使って、SSH証明書を含む被害ホストへの接続を行うことでトリガされます。当該ペイロードは、攻撃者のED448鍵を使用して暗号化されています。証明書の交換が発生すると、このバックドアは、証明書が攻撃者により署名されているかどうかをチェックし、そのことが確認されると残りのステップを実行します。一方、このバックドアが、SSH証明書が攻撃者により署名されていることを確認できなかった場合、同バックドアは正常な機能に戻ります。これにより、このバックドアの検知が困難なものとなります。

バックドアが、SSH証明書が攻撃者のものであることを確認すると、CA署名鍵N値に含まれているペイロードが復号化されます。続いて、同ペイロードからのコマンドがsystem()に渡され、rootとして実行されます。Thomas Roccia氏(Microsoftのシニアセキュリティ研究者)は、このバックドアの発見実行を説明するために、下記の2つの図を提供しました。

バックドアがもたらす影響

実行バイナリは、そのリンク先となるライブラリの影響を受けることがあります。開発者は、実行バイナリを必要なライブラリにリンクするのが一般的です。Debianやその他多くのLinuxディストリビューションの場合、sshd(Secure Shell Daemon:SSH接続を処理するバックグラウンドプロセス)はライブラリliblzmaにリンクされていますが、このライブラリはXZ Utilsにsshdの動作を操作する機能を提供しています。

現在のところ、このバックドアの目的は、影響を受けやすいシステム上のsshdに自らを統合させることにより、リモート攻撃者に任意のコードを実行する能力を与えることにあります。これは、SSHをインターネットに公開しているシステムのうち、脆弱性のあるパッケージを利用しているシステムはすべて、root権限でリモートコードを実行される危険性があることを意味します。


▲sshdプロセスがliblzmaモジュール(この場合、脆弱性のないバージョン5.2.2)をロードしている:Cybereasonの調査画面(Processエレメント)での表示

■モジュール名
次に示すモジュール名を使うことで、このバックドアがシステム上に存在するかどうかを特定できます。

  • liblzma.so.5.6.0
  • liblzma.so.5.6.1

■脅威アクターの公開鍵
鍵交換を行うために、攻撃者の公開鍵は、lzmaファイルのバイナリ内に含まれています。
————————————————————————
0a 31 fd 3b 2f 1f c6 92 92 68 32 52 c8 c1 ac 28
34 d1 f2 c9 75 c4 76 5e b1 f6 88 58 88 93 3e 48
10 0c b0 6c 3a be 14 ee 89 55 d2 45 00 c7 7f 6e
20 d3 2c 60 2b 2c 6d 31 00
————————————————————————

著者について


Brian Fox(セキュリティアナリスト、Cybereason Global SOC)
CybereasonグローバルSOCチームのセキュリティアナリスト。脅威ハンティング、マルウェア分析、拡張検知とレスポンスに従事。アイルランド警察でモバイルフォレンジックに従事したほか、国際的なセキュリティ企業で2年以上にわたってサイバーセキュリティに従事。


Ruslan Rustchev(EMEAリージョン担当マネージャー、Cybereason Global SOC)
EMEAリージョンにおけるCybereason Global SOCチームのマネージャー。MDRの検知・対応サービスを提供しているアナリストチームを指揮。

サプライチェーン攻撃対策ガイド ~インシデントに備えて対策すべき経営リスクとは~

企業経営者の中にはいまだに「報道される事案は大手企業がほとんどなので、うちのような中堅・中小規模には関係がない」と考えている方も少なくないかもしれません。

しかし実際には、「サプライチェーン攻撃」と呼ばれる攻撃手法の多用によって、中堅・中小規模を敢えて狙った攻撃が近年多発しており、多くの被害が発生しています。

本資料では、中堅・中小企業がインシデントに備えて対策すべき「4つの経営リスク」についてご紹介します。
https://www.cybereason.co.jp/product-documents/white-paper/11005/