Nimbuspwn という名の Linux 脆弱性:不正な root 権限の取得を許す?

New Nimbuspwn Linux vulnerability gives hackers root privileges

2022/04/26 BleepingComputer — Nimbuspwn として追跡されている新しい一連の脆弱性は、Linux システム上でローカル攻撃者による特権昇格を許し、バックドアからランサムウェアにいたるマルウェア展開が生じる可能性があると指摘されるものである。今日、Microsoft のセキュリティ研究者たちは、これらの問題を連鎖させることで root 権限の取得が可能であると指摘するレポートを発表した。

CVE-2022-29799/CVE-2022-29800 として追跡される Nimbuspwn 問題は、Linux マシンの接続状態の変化を送信する、コンポーネント networkd-dispatcher に存在する。これらの脆弱性の発見は、システムバス上のメッセージ・リスニングから始まり、研究者たちは networkd-dispatcher のコード・フローを見直すきっかけになったとしている。

Nimbuspwn のセキュリティ欠陥は、ディレクトリ・トラバーサル/シンボリック・リンク競合/TOCTOU (time-of-check-time-of-use) 競合の問題を指すと、Microsoft の研究者 Jonathan Bar Or は報告書で述べている。そして、興味深いのは、networkd-dispatcher デーモンが、システムの root 権限で起動時に実行されていたことだという。

networkd-dispatcher running as root
source: Microsoft

研究者たちは、このデーモンが “_run_hooks_for_state ” と呼ばれる方法により、検出されたネットワーク状態に応じてスクリプトを検出/実行していることに気づいた。この “_run_hooks_for_state ” により実装されたロジックには、/etc/networkd-dispatcher/.d ディレクトリに存在する、root ユーザー/グループが所有する実行スクリプト・ファイルを返すことも含まれている。そして、上記のロケーションにある各スクリプトを、カスタム環境変数を与えながら、subprocess.Popen というプロセスを用いて実行している。

Source code for _run_hooks_for_state
source: Microsoft

Microsoft のレポートでは、”_run_hooks_for_state” には、複数のセキュリティ上の問題があると指摘されている。

  1. ディレクトリ・トラバーサル (CVE-2022-29799):このフロー内の、あらゆる関数で OperationalState/AdministrativeState がサニタイズされていない。この状態でスクリプト・パスが構築されると、/etc/networkd-dispatcher のベース・ディレクトリから脱出するための、ディレクトリ・トラバーサル・パターン (例:…/../ ) が含まれる可能性が生じる。
  2. シンボリック・リンク競合:スクリプトの発見と、subprocess.Popen の両方が、シンボリック・リンクをたどることになる。
  3. TOCTOU (time-of-check-time-of-use) 競合 (CVE-2022-29800):スクリプトが発見されてから実行されるまでには、一定の時間がある。この脆弱性の悪用に成功した攻撃者は、networkd-dispatcher が root の所有物であると信じているスクリプトを、それ以外のものに置き換えることが可能になる。

対象となるシステム上で低い権限を持つ攻撃者は、上記の脆弱性を連鎖的に利用し、任意のシグナルを送信することで、root レベルの権限へと昇格することが可能になる。
この攻撃を成功させるための手順の概要は、以下の画像に示されており、攻撃の3つの段階がカバーされている。

Three-stage Nimbuspwn attack
source: Microsoft

Bar Or は、TOCTOU の競合状態を勝ち抜くにためは、複数のファイルを仕込む必要があると指摘している。彼の実験において、カスタム・エクスプロイトを実装したところ、3回の試行した後に成功したという。

Nimbuspwn exploit implemented and winning the TOCTOU race
source: Microsoft

Nimbuspwn の悪用は、特権レベルのサービス/プロセス下で、エクスプロイト・コードがバス名を所有できる場合に限られる。研究者によると、それが可能な環境は数多くあるという。たとえば、Linux Mint の場合には、通常は “org.freedesktop.Network1” を所有するサービスである systemd-networkd バス名は、デフォルトでの起動時には開始されないと述べている。

さらに Bar Or は、“systemd-network user” として実行されるプロセスが、world-writable ロケーションから任意のコードを実行できることを見つけ出した。たとえば、いくつかの gpgv プラグイン (apt-get のインストール/アップグレード時に起動) や、いくつかのシナリオで任意のコードを実行する Erlang Port Mapper Daemon (epmd) などがあるという。

networkd-dispatcher のメンテナである Clayton Craft は、Nimbuspwn の脆弱性に対処するために必要な更新を導入している。Linux ユーザーに対しては、使用中の OS で修正プログラムが利用可能になり次第、早急なパッチ適用が推奨される。

お隣のキュレーション・チームに聞いてみたら、5月7日のレポートで CVE-2022-29799/CVE-2022-29800 は対応とのことでした。ただし、Ubuntu にも影響しているようで、Debian や Red Hat などからアドバイザリが提供される可能性があるとのことでした。最近の Linux に関する記事としては、3月7日の「Linux Kernel の脆弱性 CVE-2022-0847 が FIX:Dirty Pipe という問題とは?」があり、さまざまなベンダーに影響を及ぼしているようです。この Nimbuspwn も、収束までには時間を要するのかもしれません。