
2022年3月7日にMax Kellerman[2]によって公開されたCVE-2022-0847は、Linuxカーネル(バージョン5.8から5.16.11まで)の脆弱性で、攻撃者が読み取り専用または不変のファイルを置き換え、被害者のシステムで権限を昇格させることを可能にします。CVE-2022-0847はDirty Pipeと呼ばれ、CVSSスコアは7.8(高)です。
Dirty Pipe脆弱性は、Linuxカーネルのcopy_page_to_iter_pipeおよびpush_pipe関数において、struct pipe_buffer[7]のflags属性が適切に初期化されておらず、そのため古くなった値を含む可能性があるという欠陥として説明されています。struct pipe_bufferのflags属性に設定できるフラグの1つにPIPE_BUF_FLAG_CAN_MERGEというフラグがあります。これは、pipe_bufferへのデータのマージが許可されているかどうかを示します。このように、データがpipe_bufferにコピーされると、コピーされたページのサイズが4096バイト未満であれば、さらにデータをpipe_bufferに追加できます。
PIPE_BUF_FLAG_CAN_MERGEをページキャッシュ参照に注入することで、特別に準備されたパイプに新しいデータを書き込むだけで、ページキャッシュ内のデータを上書きできるようになりました(このプロセスは以下の段落で説明します)。これにより、権限のないローカルユーザーは、この欠陥を使用して、読み取り専用ファイルにバックアップされたページキャッシュ内のページを上書き/書き込みし、システムの権限を昇格させることができます。
したがって、脆弱性を悪用するには、次の手順を実行する必要があります。
以下のコマンドですべてをコンパイルします。
make
./exploit-1
リポジトリ内のexploit-1.cファイルにあるエクスプロイト1は、/etc/passwdファイル(このファイルには暗号化されたパスワードなどのユーザーアカウント情報が含まれています)内のrootユーザーのパスワードを上書きし、最終的にrootアクセスを持つターミナルを提供するものです。そのために、以下が必要でした。
/etc/passwdファイルのバックアップを作成します。/etc/passwdファイルをパイプに転送し、このファイルの内容を既知の新しいrootパスワードで上書きします(上記の手順4と5に従って)。find / -perm -4000 2>/dev/null
./exploit-2 <path-of-suid-binary>
リポジトリ内のexploit-2.cファイルにあるエクスプロイト2は、SUIDバイナリを上書きしてハイジャックし(この種の攻撃はセクション3.5.2で報告されています)、最終的にrootアクセスを持つターミナルを提供するものです。そのために、以下が必要でした。
/tmp/sh)を作成し、それがrootアクセスを持つシェルターミナルを作成します。/tmp/shが実行され、rootアクセスを持つ新しいシェルが開かれます。./exploit-3
リポジトリ内のexploit-3.cファイルにあるエクスプロイト3は、ルートシェルアクセスを取得するためにエクスプロイト1と同じ手順を使用します。違いは、エクスプロイト3はルートシェルアクセスを取得した後、攻撃者のSSH(Secure Shell)公開鍵を/root/.ssh/authorized_keysファイルに読み込み、Ngrokプラットフォームを使用してSSHリモートアクセス用のTCP(Transmission Control Protocol)トンネルを作成することです。
[1] AHMED, Alexis. Privilege Escalation Techniques: Learn the art of exploiting Windows and Linux systems. Birmingham: Packt Publishing, 2021年10月.
[2] KELLERMANN, Max. The Dirty Pipe Vulnerability. 入手先: https://dirtypipe.cm4all.com/. アクセス日: 2022年7月23日.
[3] Exploit Database. 入手先: https://www.exploit-db.com/. アクセス日: 2022年8月3日.
[4] Traitor: Automatically exploit low-hanging fruit to pop a root shell. 入手先: https://github.com/liamg/traitor. アクセス日: 2022年8月3日.
[5] PayloadsAllTheThings. Linux - Privilege Escalation. 入手先: https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md#cve-2022-0847-dirtypipe. アクセス日: 2022年8月3日.
[6] Linux Kernel Repository - Struct pipe_inode_info. 入手先: https://github.com/torvalds/linux/blob/v5.8/include/linux/pipe_fs_i.h#L76. アクセス日: 2022年8月3日.
[7] Linux Kernel Repository - Struct pipe_buffer. 入手先: https://github.com/torvalds/linux/blob/v5.8/include/linux/pipe_fs_i.h#L26-L32. アクセス日: 2022年8月3日.
[8] ARNTZ, Pieter. Linux "Dirty Pipe" vulnerability gives unprivileged users root access. Malwarebytes Lab. 入手先: https://www.malwarebytes.com/blog/news/2022/03/linux-dirty-pipe-vulnerability-gives-unprivileged-users-root-access. アクセス日: 2022年8月3日.
[9] Picus Security. Linux “Dirty Pipe” CVE-2022-0847 Vulnerability Exploitation Explained. 入手先: https://www.picussecurity.com/resource/linux-dirty-pipe-cve-2022-0847-vulnerability-exploitation-explained. アクセス日: 2022年8月3日.
[10] Exploit Database - Local Privilege Escalation (Dirty Pipe). 入手先: https://www.exploit-db.com/exploits/50808. アクセス日: 2022年8月3日.