ほとんどのLinuxシステムでRootアクセスが可能になるSequoia(境界外読み取り)の脆弱性が発見:CVE-2021-33909

セキュリティ監査会社のQualysは、Ubuntu、Debian、FedoraなどのほとんどのLinux OSにRootアクセスを許可してしまう新たな脆弱性を発見したと発表しました。

https://www.qualys.com/2021/07/20/cve-2021-33909/sequoia-local-privilege-escalation-linux.txt

Sequoiaと名付けられたこの脆弱性は、CVE-2021-33909としてトラックされており、Linuxのファイルシステムレイヤー上に発見されました。このレイヤーは、ローカルファイルのやり取りと管理を行うOSコンポーネントです。

Qualys社のセキュリティ研究者であるBharat Jogi(バラット・ジョギ)氏によると、パス長が1GBを超えるような非常に長いディレクトリ構造を作成、マウント、削除すると、Linux OSのファイルシステム・コンポーネントにSequoiaバグ(境界外読み取り)が発生し、権限の低いローカルアカウントであれば誰でもルート権限でコードを実行できるようになります。

「我々は、Ubuntu 20.04、Ubuntu 20.10、Ubuntu 21.04、Debian 11、Fedora 34 Workstation のデフォルト状態において、この制御不能な境界外書き込みを悪用し、完全な root 権限を取得することに成功しました」と発表しています。

“他の Linux ディストリビューションにも脆弱性があり、おそらく悪用される可能性があります。” とコメントしています。

Qualys社が6月初旬にLinuxカーネルチームに通知した後、いくつかのLinux OSからこの問題に対処するパッチがリリースされました。

この脆弱性を利用してLinux OSにリモートで侵入することはできませんが、攻撃者が何らかのシステムにアクセスした後、Sequoiaバグを利用してOS全体をハイジャックすることができるため、第2段階のペイロードとしては理想的なものになっています。

この脆弱性はほとんどのLinux OSに影響を与えるため、Sequoiaバグがサーバー、ワークステーション、クラウドインフラ、IoTデバイス、スマートフォンなどのLinuxを搭載したデバイスを標的としたエクスプロイトチェーンに組み込まれることは予想されるはずです。

似たような脆弱性として、2017年にセキュリティ研究者が公開した特権昇格バグ「Dirty COW(CVE-2016-5195)」でも発生し、脆弱性が公開された後に広く攻撃に利用された過去があります。

対応策

この脆弱性を完全に修正するには、カーネルにパッチを適用する必要があります。

  • proc/sys/kernel/unprivileged_userns_cloneを0に設定することで、攻撃者がユーザーネームスペースに長いディレクトリをマウントすることを防ぎます。攻撃者が長いディレクトリ (8MB 以上) を FUSE マウントすると、systemd がスタックを使い果たしてクラッシュし、その結果 OS 全体がクラッシュします (カーネルパニック)。
  • 攻撃者が eBPF プログラムをカーネルにロードできないように、/proc/sys/kernel/unprivileged_bpf_disabled を 1 に設定します。ただし,攻撃者は,代わりに他の vmalloc()ated オブジェクト (例えば,スレッドスタック) を破壊する可能性がありますが,この可能性については調査していません。

実証可能コード要約

1.総パス長が1GBを超える深いディレクトリ構造(約1Mのネストしたディレクトリ)をmkdir()し、非特権ユーザの名前空間にバインドマウントし、rmdir()します。

2.小さなeBPFプログラムをvmalloc()ated するスレッドを作成し(BPF_PROG_LOAD経由)、eBPFプログラムがカーネルのeBPF verifierで検証された後、カーネルでJITコンパイルされる前に、このスレッドを(userfaultfdまたはFUSE経由で)ブロックします

3.非特権ユーザの名前空間で/proc/self/mountinfoをオープンし、バインドマウントされたディレクトリのロングパスのread()を開始して、文字列「//deleted」をvmalloc()されたバッファの先頭からちょうど-2GB-10Bのオフセットに書き込みます。

4.この「//deleted」という文字列が、検証済みのeBPFプログラムの命令を上書きするように手配し(つまりカーネルのeBPF検証者のセキュリティチェックを無効にします)、この制御されていない境界外書き込みを情報開示に変え、限定的に制御された境界外書き込みに変えます。

5.Manfred Paulのbtfとmap_push_elemの技術を再利用し、この限定的な境界外書き込みを、カーネルメモリの任意の読み書きに変換します。

https://www.thezdi.com/blog/2020/4/8/cve-2020-8835-linux-kernel-privilege-escalation-via-improper-ebpf-program-verification

6.この任意の読み取りを利用して、カーネルメモリ内のmodprobe_path[]バッファの位置を特定し、任意の書き込みを利用して、このバッファの内容(デフォルトでは「/sbin/modprobe」)を自分の実行ファイルへのパスに置き換えることで、完全なroot権限を取得します。

Leave a Reply

Your email address will not be published.