Microsoft が新たな権限昇格 Linux の脆弱性 Nimbuspwn を発見

Microsoft は、Nimbuspwn と総称される複数の脆弱性を発見しました。これらの脆弱性により、攻撃者は多くの Linux デスクトップ エンドポイントで root に権限を昇格できる可能性があります。脆弱性を連鎖させることで Linux システムのルート権限を取得できるため、攻撃者はルート バックドアのようなペイロードを展開し、任意のルート コードを実行して他の悪意のあるアクションを実行できます。さらに、Nimbuspwn の脆弱性は、マルウェアやランサムウェアなどのより高度な脅威によるルート アクセスのベクトルとして利用され、脆弱なデバイスにより大きな影響を与える可能性があります。

root として実行されるサービスのコード レビューと動的分析を実行しながらシステム バス上のメッセージをリッスンすることで脆弱性を発見し、 networkd-dispatcherと呼ばれる systemd ユニットの奇妙なパターンに気づきました。 networkd-dispatcherのコード フローを確認すると、ディレクトリ トラバーサル、シンボリック リンクの競合、チェック時間と使用時間の競合状態の問題など、複数のセキュリティ上の問題が明らかになりました。これらの問題は、権限の昇格やマルウェアの展開、その他の実行に利用される可能性があります。悪意のある活動。 Microsoft Security Vulnerability Research (MSVR) によるCoordinated Vulnerability Disclosure (CVD) を通じて、これらの脆弱性を関連するメンテナーと共有しました。これらの脆弱性に対する修正は、現在CVE-2022-29799およびCVE- 2022-29800 として特定されており、 networkd-dispatcherの管理者である Clayton Craft によって正常に展開されました。これらの問題を解決するための彼のプロフェッショナリズムと協力に対してクレイトンに感謝したいと思います. networkd-dispatcherのユーザーは、インスタンスを更新することをお勧めします。

組織環境は多様なデバイスやシステムに依存し続けるため、Nimbuspwn などの脅威を軽減するために、クロスプラットフォームの保護とセキュリティ体制の全体像を提供する包括的なソリューションが必要です。 Linux 環境における脆弱性の増加により、プラットフォームのオペレーティング システムとそのコンポーネントを強力に監視する必要性が強調されています。 Microsoft Defender for Endpoint を使用すると、組織はこの必要な可視性を獲得し、 Linux デバイスでそのような脅威を検出できます。これにより、組織は Windows、Linux、Mac、iOS、Android などのさまざまなプラットフォームで脆弱性と脅威を検出、管理、対応、修復できるようになります。

このブログ投稿では、影響を受けるコンポーネントに関する情報を共有し、発見した脆弱性を調べます。クロスドメインの可視性が新しい未知の脅威を発見してセキュリティを継続的に改善するのにどのように役立つかを詳しく説明し、プラットフォームとデバイスを保護することの重要性を強調するために、より大きなセキュリティ コミュニティと調査の詳細を共有しています。

背景 – D バス

D-Bus (「Desktop-Bus」の略) は、 freedesktop.orgプロジェクトによって開発されたプロセス間通信チャネル (IPC) メカニズムです。 D-Bus はソフトウェアバスであり、同じエンドポイント上のプロセスがメッセージを送信して応答することで通信できるようにします。 D-Bus は主に 2 つの通信方法をサポートしています。

  1. メソッド – 要求応答通信に使用されます。
  2. シグナル – パブリッシュ/サブスクライブ通信に使用されます。

D-Bus の使用例としては、一般的なビデオ会議アプリによるビデオ チャットの受信があります。ビデオが確立されると、ビデオ会議アプリは D-bus 信号を送信して、通話が開始されたことを公開できます。そのメッセージを聞いているアプリは、音声をミュートするなど、適切に応答できます。

一般的な Linux デスクトップ環境では、多くの D-Bus コンポーネントがデフォルトで出荷されています。これらのコンポーネントは異なる特権で実行され、メッセージに応答するため、D-Bus コンポーネントは攻撃者にとって格好の標的です。実際、 USBCreator Elevation of PrivilegeBlueman Elevation of Privilege by Command Injectionなど、バグのある D-Bus サービスに関連する興味深い脆弱性が過去にありました。

D-Bus は、グローバルSystem BusとセッションごとのSession Busを公開します。攻撃者の観点から見ると、システム バスはルートとして実行され、リッスンしているサービスが一般的に存在するため、より魅力的です。

D-Bus の名前の所有権

D-Bus に接続すると、コンポーネントに一意の識別子が割り当てられ、PID リサイクルを悪用する攻撃を軽減します。一意の識別子はコロンで始まり、「:1.337」のように数字がドットで区切られています。コンポーネントは D-Bus API を使用して、「org.freedesktop.Avahi」や「com.ubuntu.SystemService」などの識別可能な名前を所有できます。 D-Bus がそのような所有権を許可するには、要求しているプロセス コンテキストが D-Bus 構成ファイルで許可されている必要があります。これらの構成ファイルは、/usr/local/share/dbus-1/ system.conf および /usr/local/share/dbus-1/session.conf (一部のシステムでは/usr/local/dbus- 1直接)。具体的には、デフォルトのsystem.confは、含まれている他の構成ファイル (通常は/etc/dbus-1/system.dの下) で特に指定されていない限り、所有権を許可しません。

図 1 は、システム バスとセッション バスのさまざまな所有権ポリシーを示しています。
図 1: システム バスとセッション バスの異なる所有権ポリシー

さらに、要求された名前が既に存在する場合、所有しているプロセスが名前を解放するまで、要求は許可されません。

脆弱性ハンティング

私たちのチームは、ルートとして実行され、システム バス上のメッセージをリッスンし、コード レビューと動的分析の両方を実行するサービスの列挙を開始しました。その結果、次の 2 つの情報漏えいの問題が報告されています。

  1. Blueman でのディレクトリ情報の開示
  2. PackageKit でのディレクトリ情報の漏えい (CVE-2022-0987)

これらは興味深いものですが、重大度は低いです。攻撃者は、ファイルを一覧表示するために高い権限が必要なディレクトリの下にファイルを一覧表示できます。その後、 networkd-dispatcherと呼ばれるsystemd ユニットで興味深いパターンに気付き始めました。 networkd-dispatcherの目的は、ネットワーク ステータスの変更をディスパッチし、オプションで新しいステータスに基づいてさまざまなスクリプトを実行することです。興味深いことに、ブート時に root として実行されます。

図 2 は、root として実行されている networkd-dispatcher を示しています。
図 2: root として実行されているnetworkd-dispatcher

networkd-dispatcher のコード フロー

networkd-dispatcher のソース コードを調べたところ、興味深いフローに気付きました。

  1. 登録関数は、シグナル名「 PropertiesChanged 」に対して、システム バス上のサービス「 org.freedesktop.network1 」の新しいシグナル受信者を登録します。
  2. _receive_signal 」シグナル ハンドラーは、送信されるオブジェクト タイプに対していくつかの基本的なチェックを実行し、送信されるオブジェクト パスに基づいて変更されたネットワーク インターフェイスを結論付け、次にその新しい状態 (「 OperationalState 」および「 AdministrativeState 」) を結論付けます。データ。これらの状態のいずれについても (それらが空でない場合)、「 handle_state 」メソッドが呼び出されます。
  3. handle_state 」メソッドは、これら 2 つの状態のそれぞれに対して「 _handle_one_state 」を呼び出すだけです。
  4. _handle_one_state 」は、状態が空でないことを検証し、以前の状態と異なるかどうかを確認します。そうであれば、新しい状態を更新し、新しい状態のスクリプトを検出して実行する「 _run_hooks_for_state 」メソッドを呼び出します。
  5. _run_hooks_for_state 」は、次のロジックを実装します。
    • get_script_list 」メソッドを呼び出してスクリプト リストを検出します (新しい状態を文字列として取得します)。このメソッドは、「 /etc/networkd-dispatcher/<state>.d 」の下にあり、ルート ユーザーとルート グループが所有し、実行可能なすべてのファイルを返すことを意図した「 scripts_in_path 」を呼び出すだけです。
    • スクリプト リストを並べ替えます。
    • カスタム環境変数を提供しながら、 subprocess.Popenで各スクリプトを実行します。
図 3 は、_run_hooks_for_state ソース コードのスニペットを示しています。
図 3: _run_hooks_for_state ソース コード – 簡潔にするために一部省略

ステップ 5 には複数のセキュリティ上の問題があります。

  1. ディレクトリ トラバーサル( CVE-2022-29799 ) : フロー内のどの関数もOperationalStateまたはAdministrativeStateをサニタイズしません。状態はスクリプト パスの構築に使用されるため、状態には「 /etc/networkd-dispatcher 」ベース ディレクトリからエスケープするためのディレクトリ トラバーサル パターン (「 ../../ 」など) が含まれる可能性があります。
  2. シンボリック リンクの競合: スクリプトの検出とsubprocess.Popenの両方がシンボリック リンクをたどります。
  3. Time-of-check-time-of-use ( TOCTOU ) 競合状態 ( CVE-2022-29800 ) : スクリプトが検出されてから実行されるまでの間に一定の時間があります。攻撃者はこの脆弱性を悪用して、root が所有しているとnetworkd-dispatcherが認識しているスクリプトをそうでないスクリプトに置き換えることができます。
図 4 は、「scripts_in_path」メソッドでビルドされたスクリプト リストを示しています。これには、「subdir」が毒された脆弱なコードが含まれています。このコードは、「os.path.join(one path, subdir, filename)」というテキストの上に赤いボックスで強調表示されています。 .
図 4: 「scripts_in_path」メソッドで作成されたスクリプト リストには、「subdir」が毒された脆弱なコードが含まれています。

搾取

敵対者が、任意の信号を送信できる悪意のある D-Bus コンポーネントを持っていると仮定しましょう。したがって、攻撃者は次のことを行うことができます。

  1. ディレクトリ「 /tmp/nimbuspwn 」を準備し、「 /sbin 」を指すシンボリックリンク「 /tmp/nimbuspwn/poc.d 」を植えます。 「/sbin」ディレクトリが選択されたのは、追加の引数なしで実行した場合にブロックされない、root が所有する多くの実行可能ファイルがあるためです。これは、前述のシンボリック リンクの競合の問題を悪用します。
  2. root が所有する「 /sbin 」の下のすべての実行可能ファイル名について、「 /tmp/nimbuspwn 」の下に同じファイル名を植えます。たとえば、「 /sbin/vgs 」が実行可能であり、root によって所有されている場合、目的のペイロードを含む実行可能ファイル「 /tmp/nimbuspwn/vgs 」を植えます。これにより、攻撃者はTOCTOUの脆弱性によって課される競合状態に勝つことができます。
  3. OperationalState “../../../tmp/nimbuspwn/poc”でシグナルを送信します。これは、ディレクトリ トラバーサルの脆弱性を悪用し、スクリプト ディレクトリをエスケープします。
  4. networkd-dispatcherシグナル ハンドラが起動し、ディレクトリ「/etc/networkd-dispatcher/../../../tmp/nimbuspwn/poc.d」からスクリプト リストを作成します。これは、実際にはシンボリック リンク ( 「/ tmp/nimbuspwn/poc.d” )、 “/sbin”を指します。そのため、root が所有する多数の実行可能ファイルで構成されるリストが作成されます。
  5. シンボリックリンク「 /tmp/nimbuspwn/poc.d 」を「 /tmp/nimbuspwn 」を指すようにすばやく変更します。これは、 TOCTOU 競合状態の脆弱性を悪用します。スクリプト パスは、 networkd-dispatcherが認識せずに変更されます。
  6. ディスパッチャは、最初は「 /sbin 」の下にあったファイルの実行を開始しますが、実際には「 /tmp/nimbuspwn 」ディレクトリの下にあります。ディスパッチャは、これらのファイルが root によって所有されていると「信じている」ため、subprocess.Popen を root として盲目的に実行します。したがって、攻撃者はこの脆弱性を悪用することに成功しました。

高い確率でTOCTOU競合状態に勝つために、潜在的に実行できる多くのファイルを植えることに注意してください。私たちの実験では、 TOCTOU競合状態に勝つには 3 回の試行で十分でした。

図 5 は、3 段階の攻撃のフローチャートを示しています。最初の 3 つのステップは上の画像に示されており、攻撃者の最初のステップを示しています。 4 番目のステップは中央の画像に示されており、networkd-dispatcher が攻撃者の変更を処理する方法を示しています。ステップ 5 と 6 は最終的な画像に示され、攻撃者が TOCTOU 競合状態の欠陥を悪用して、ディスパッチャが最終的に Nimbuspwn エクスプロイトを許可する方法を示しています。
図 5: 3 段階の攻撃のフローチャート

root として実行するたびにエクスプロイトを実行したくないため、最終的に実装したペイロードは root バックドアを次のように残します。

  1. /bin/sh/tmp/ sh にコピーします。
  2. 新しい/tmp/shSet-UID (SUID) バイナリに変換します。
  3. /tmp/sh -pを実行します。 「 -p 」フラグは、最新のシェルが設計により権限を削除するために必要です。

バス名の所有

洞察力のある読者は、エクスプロイト コードが「 org.freedesktop.network1 」バス名を所有できると仮定して、エクスプロイト全体が権限を昇格していることに気付くでしょう。これは些細なことのように聞こえますが、これが発生する環境がいくつか見つかりました。具体的には:

  1. 多くの環境 (Linux Mint など) では、通常「 org.freedesktop.network1 」バス名を所有するサービスsystemd-networkdは、デフォルトでは起動時に開始されません。
  2. Microsoft Defender for Endpoint の高度な検索を使用して、 systemd-networkユーザー (必要なバス名を所有することが許可されている) として実行されている複数のプロセスが、誰でも書き込み可能な場所から任意のコードを実行しているのを見つけることができました。これらには、誰でも書き込み可能なディレクトリからスクリプトを実行するなど、 systemd-networkとして任意のコードを実行できる特定の環境でのいくつかのシナリオが含まれます。これらのシナリオの一部は、お客様の構成ミスに起因すると考えています。

使用したクエリは、Microsoft Defender for Endpoint のお客様でも実行できます。

DeviceProcessEvents
| |タイムスタンプ > ago(5d)
    および AccountName == "systemd-network"
    および isnotempty(InitiatingProcessAccountName)
    and isnotempty(ファイル名)
| |プロジェクトの DeviceId、FileName、FolderPath、ProcessCommandLine

したがって、これらのシナリオを悪用し、独自の悪用を実装することができました。

図 6 は、TOCTOU 競合状態に勝利した後、実装に成功したエクスプロイトを示しています。タイトルは「Nimbuspwn: networkd-dispatcher Linux EoP by Jonathan Bar Or ('JBO')」です。次に、プロセスが表示され、上から下に「dbus 名 org.freedesktop.network1 を所有しようとしています」、「名前パターンの検証」、「ベース ディレクトリの植え付け」、「symlink の植え付け」、「ペイロードの植え付け」が表示されます。 「(TOCTOU) レースに勝つ」状態を試みてから、「すばらしい、ルート バックドアができました。万歳!ルート権限をお楽しみください」と述べます。
図 6: 私たちのエクスプロイトが実装され、TOCTOU レースに勝利しました

ルートとして任意のスクリプトを実行できる一方で、このエクスプロイトは/bin/sh/tmpディレクトリにコピーし、 /tmp/shSet-UID (SUID) 実行可能ファイルとして設定し、「 /tmp/sh -p 」を呼び出します。シェルが特権をドロップしないようにするには、「 -p 」フラグが必要であることに注意してください。

デバイスのセキュリティと検出戦略の強化

進化する脅威のランドスケープが定期的に新しい脅威、手法、攻撃機能を提供しているにもかかわらず、攻撃者は、悪意のある目的でシステム、ネットワーク、および機密情報にアクセスするベクトルとして、パッチが適用されていない脆弱性と構成ミスを特定して悪用することに引き続き注力しています。幅広いプラットフォーム、デバイス、およびその他のドメインにまたがるこの絶え間ない攻撃の砲撃は、以前は知られていないエクスプロイトや問題をさらに特定して軽減できる、包括的でプロアクティブな脆弱性管理アプローチの必要性を強調しています。

Microsoft の脅威と脆弱性の管理機能は、組織が全体的なセキュリティ体制を監視するのに役立ち、継続的な脆弱性の発見、状況に応じたインテリジェントな優先順位付け、およびシームレスなワンクリックの欠陥修正により、リスクに関するリアルタイムの洞察を提供します。 Nimbuspwn の脆弱性に関する調査を活用してソリューションを改善することで、脅威と脆弱性の管理は既に CVE-2022-29799 と CVE-2022-29800 に対応しており、 Microsoft Defender for Endpointの脅威と脆弱性モジュールでそのような脆弱なデバイスを示しています。

特定の脆弱性に対処するために、Microsoft Defender for Endpoint のエンドポイントの検出と応答 (EDR)機能は、Nimbuspwn を活用するために必要なディレクトリ トラバーサル攻撃を検出します。さらに、Microsoft Defender for Endpoint 検出チームには、疑わしい Set-UID プロセス呼び出しの一般的な検出機能があり、事前の知識なしにエクスプロイトを検出しました。

図 7 は、マイクロソフトのエクスプロイトで使用された疑わしい SUID プロセスを検出した Microsoft Defender for Endpoint を示しています。これには、アラート ストーリーと検出されたアクティビティの詳細が含まれます。
図 7: マイクロソフトのエクスプロイトで使用された疑わしい SUID プロセスを検出する Microsoft Defender for Endpoint

進化する脅威のランドスケープを防御するには、Windows デバイスであれ Windows 以外のデバイスであれ、ユーザーのコンピューティング エクスペリエンスを保護および保護する機能が必要です。マイクロソフトは、毎日すべての主要なプラットフォームでユーザーと組織を保護するための堅牢な調査を通じて、保護テクノロジを継続的に強化しています。このケースは、使用中の脆弱なデバイスやプラットフォームに関係なく、問題を効果的に軽減するために、専門家の業界横断的なコラボレーションを通じてこのような調査を調整する能力がいかに重要であるかを示しています。私たちの研究やその他の形式の脅威インテリジェンスを共有することで、より大きなセキュリティ コミュニティと引き続き協力し、すべての人にとってより良い保護を構築するよう努めることができます。

ジョナサン・バー・オア

Microsoft 365 Defender 研究チーム

参照: https://www.microsoft.com/en-us/security/blog/2022/04/26/microsoft-finds-new-elevation-of-privilege-linux-vulnerability-nimbuspwn/

Comments

Copied title and URL