
CSE 5380: 情報セキュリティ論文 CVE-2022-0847 (Dirty Pipe)
著者
Karan Vasudevamurthy (UTA ID: 1002164438)
CVEとは?
Common Vulnerabilities and Exposures (CVE) は、公開されている情報セキュリティの脆弱性および暴露のリストです。MITREコーポレーションは、ソフトウェアおよびファームウェアの脆弱性を識別・分類するために1999年にCVEを導入しました。MITREは、米国で連邦政府資金による研究開発センターを運営する非営利団体です。CVEは、既知の脆弱性に関する情報の共有を促進し、サイバーセキュリティ計画が最新のセキュリティ問題や弱点を反映するよう更新されることを目的としています。そのために、CVEは各脆弱性または暴露に一意の識別子を割り当てます。CVE識別子は、CVE名またはCVE番号とも呼ばれます。Common Vulnerability Scoring System (CVSS) は、脆弱性の深刻度を評価するために数値を割り当てるためのオープン標準のセットです。CVSSスコアの範囲は0.0から10.0です。数値が大きくなるほどセキュリティの深刻度が高くなります。各CVE IDはCVE-YYYY-NNNNNという形式です。YYYYの部分は、CVE IDが割り当てられた年、または脆弱性が公開された年です。
パイプとは?
CVE-2022-0847の文脈では、パイプの内部動作、特にパイプバッファに関連する属性を理解することが重要です。Linuxのパイプは、プロセス間でのデータ転送を支援し、あるプロセスの出力が別のプロセスの入力になります。この仕組みにより、システム上で実行されている異なるプロセス間の通信と調整が容易になります。Linuxのパイプは単方向であり、データは一方向にのみ流れることを意味します。パイプバッファは通常、プロセス間で転送されるデータを一時的に保持する固定サイズの先入れ先出し (FIFO) データ構造で構成されます。プロセスがパイプにデータを書き込むと、別のプロセスが読み取るまでバッファに格納されます。データが読み取られると、バッファから削除され、新しいデータを書き込むことができます。
脆弱性
CVE-2022-0847については、パイプバッファ内の2つの関数を理解することが重要です。
Page | 1
Max Kellermann氏は、LinuxカーネルがUnixパイプを誤って処理することを発見しました。この脆弱性は、「copy_page_to_iter_pipe」および「push_pipe」関数内の特定の属性、特に「flags」パラメータの初期化が不十分であるために発生します。この見落としにより、フラグに古い値や誤った値が割り当てられる可能性が生じ、システムのセキュリティと整合性が損なわれる可能性があります。特権のないローカルユーザーがこの欠陥を利用して、読み取り専用ファイルに裏打ちされたページキャッシュ内のページに書き込むことができ、それによってシステム上で権限を昇格させる可能性があります。
攻撃手法
これはCVE-2016-5195「Dirty Cow」に似ていますが、悪用はより簡単です。CVE-2022-0847の悪用にはターゲットシステムへのローカルアクセスが必要であり、Linuxカーネルバージョン5.8以降に影響します。適切な初期化の欠如により、PIPE_BUF_FLAG_CAN_MERGEフラグが誤って設定された新しいパイプバッファを作成できます。このフラグはパイプバッファへの書き込みの結合 (coalescing) を制御し、そのためパイプにスプライスされた既存のページへの書き込みを可能にします。ファイルがこのスプライスされたページを許可する場合、メモリ内のファイルの共有されたシステム全体のビューに変更が反映されます。その後のキャッシュフラッシュは、現在のLinux権限制御設定を無視して、変更されたデータをディスクにコピーします。これにより、特権のないユーザーが、SELinux、標準のLinux権限、高度なアクセス制御、不変ファイルなどの読み取り専用アクセス制御によってのみ変更から保護されているファイルであっても、そのファイルの特定の内容 (ディスク上またはメモリ内) を変更できるようになります。したがって、攻撃者は、Linuxシステムに関する基本的な知識と悪意のあるコードを実行する能力を持つ、特権のないローカルユーザーであると想定できます。そのような個人は権限を昇格させ、システム全体を危険にさらす可能性があり、重大なセキュリティリスクをもたらします。
概念実証
以下は、Linuxを実行している仮想マシン上でCVE-2022-0847を悪用するために私が実行した手順です。
お使いのLinuxディストリビューションが悪用可能かどうかを確認する
5.8より新しいLinuxカーネルはすべて影響を受けます。ただし、バージョン5.16.11、5.15.25、および5.10.102はCVE-2022-0847を悪用できません。カーネルバージョンを確認するには、*uname -r* を実行するだけです。ターゲットシステムが脆弱かどうか不明な場合は、このbashスクリプトを実行することもできます。
適切なLinuxカーネルのダウンロード
デモンストレーションには、Ubuntu 20.04.1 LTSを使用することにしました。ただし、このバージョンのUbuntuは現在Linuxカーネル5.15で動作しており、CVE-2022-0847はこのカーネルバージョンでは悪用できません。Linuxカーネル5.8をダウンロードするには、*sudo apt install linux-image-5.8.0-63-generic linux-headers-5.8.0-63-generic* を実行するだけです。
エクスプロイトのダウンロード
エクスプロイトはGitHubにあります。これは、ファイルが書き込みを許可されていない場合、不変の場合、または読み取り専用マウント上にある場合でも、ページキャッシュ内のファイル内容を上書きする方法を示しています。ターミナルで *git clone[ https://github.com/karanlvm/Infosec.git* ](https://github.com/karanlvm/Infosec.git%60)*を実行することもできます。
元のpasswdファイルをコピーする
*cp /etc/passwd /tmp/passwd.bak* を実行します。これにより、エクスプロイト実行前後のpasswdファイルの違いを特定できます。
エクスプロイトのコンパイル
エクスプロイトを正常にコンパイルするには、GCCがインストールされている必要があります。GCCは *sudo apt-get install gcc* でインストールできます。エクスプロイトをコンパイルするには、*gcc exp.c -o exp* を実行します。
エクスプロイトの実行
制限事項
このエクスプロイトには2つの主要な制限があります。
現在の状況と修正
2024年1月12日時点で、今後30日間の悪用活動の確率は7.58%です (Exploit prediction scoring system (EPSS))。以下はCVE-2022-0487のCVSS (Common Vulnerability Scoring System) です:
この脆弱性は、5.8より新しい任意のLinuxカーネルで悪用される可能性があります。ただし、この脆弱性はLinux 5.16.11、5.15.25、および5.10.102で修正されています。したがって、Linuxディストリビューションのメンテナが提供するパッチまたはアップデートを適用するだけで、この脆弱性を修正できます。これを行うには、次のコマンド *sudo apt update* および *sudo apt upgrade* を実行するだけです。
参考文献
Page | 5
エクスプロイトを実行するには、読み取り専用ファイル、オフセット、および挿入されるいくつかの文字をパラメータとして指定する必要があります。この場合、*./exp /etc/passwd 1 ootz:* を実行します。「It worked !」という出力が得られた場合、Dirty Pipe脆弱性の悪用に成功したことを意味し、パスワードなしでルートアクセスを取得できます。
ルートアクセスへの切り替え
次に、*su rootz* を実行するだけでルートアクセスを取得できます。確認するには、id コマンドを実行します。