
waitid システムコールを利用した Linux 権限昇格。このエクスプロイトは
@XeR_0x2A と @chaign_c によって HexpressoTeam から提供されており、
教育目的のみで使用されます。
このバグは2017-05-21に導入され、2017-10-09に修正されました。4.14.0-rc4+ は既知の脆弱性が
あります。
初級者または中級者のエクスプロイト作成者であれば、私たちの実装を読む前に
自分でエクスプロイトしてみることをお勧めします。簡単なエクスプロイトプリミティブ
(書き込み可能なカーネルメモリへの任意書き込み)を伴う非常に良い練習になります。
また、@LiveOverflow にも挑戦してみることをお勧めします。
以下が説明です:
oss-security:
こんにちは、Chris Salls 氏は、Linux カーネルの waitid() システムコールが
v4.13 でリファクタリングされた際、入力引数がユーザースペースを指しているかどうかの
チェックが誤って省略されたことを発見しました。これにより、ローカルの攻撃者が
カーネルメモリに直接書き込むことが可能になり、権限昇格につながる可能性があります。このコミットで導入されました:
https://git.kernel.org/linus/4c48abe91be03d191d0c20cc755877da2cb35622メインラインツリーのこのコミットで修正されました:
https://git.kernel.org/linus/96ca579a1ecc943b75beba58bebb0356f6cc4b51この問題は間もなく -stable リリース(将来の v4.13.7)で修正される予定です:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/log/?h=linux-4.13.yありがとう、
waitid:
waitid -- 子プロセスの状態変化を待ちます。
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
カーネルは infop がカーネル空間かユーザー空間かをチェックしないため、
書き込み権限のある任意のカーネルメモリページのメモリを上書きできます。
面白いのは、書き込む内容を部分的にしか制御できないことです。
この脆弱性の悪用方法は千通り以上あります。私たちはこの書き込みプリミティブを
ヌルポインタ参照に変換することにしました。カーネルの .BSS セクションにある
have_canfork_callback 変数を上書きしました。この変数を 0(真)以外の値に設定すると、
未設定のコールバック(null)が「プロセスが公開される前に新しいタスクで呼び出される」ことになります。
Chris Salls 氏と @kees_cook に CVE を共有していただき感謝します。
初の「実世界」Linux カーネルエクスプロイト、 @XeR_0x2A と @chaign_c から HexpressoTeam。
2017-10-22