
これは、初期のSamsung製スマートフォンで導入された/dev/exynos-mem脆弱性を悪用するためのPOCです。
これはカーネル脆弱性研究への興味と、CTFチャレンジの一環として作成されました。
これらのスマートフォンで導入された脆弱性は、exynos-memデバイスのパーミッションです。非rootユーザーでも読み書き(R/W)を許可していました!
exynos-memデバイスは、/dev/memに対して直接読み書きできるデバイスであり、つまりカーネルのコードやデータに直接書き込むことができます。
/proc/iomemを利用することで、どの物理アドレスがオペレーティングシステム上のどのメモリに対応するかを素早く見つけ出し、Kernel Code / Dataメモリがどこにあるかも特定できます。
このエクスプロイトは、rootを取得するために以下のことを行います:
/proc/kallsymsにアクセスできず、それが障害となります。そこで、カーネルメモリをスキャンしてkallsymsで使用されているフォーマット文字列(seq_printf(m, "%pK %c %s\n", (void *)iter->value, iter->type, iter->name);)を見つけ、それを%pKの代わりに%pにパッチして、シンボルアドレスをユーザーとして表示できるようにします。/proc/kallsymsを読み取り、シンボルnsown_capableのアドレスを見つけます。このシンボルは、setuid()を呼び出すユーザーにその権限があるかどうかを識別するために使用されます。nsown_capableの関数コードを単にreturn true;に上書きし、任意のユーザーが任意のuidに対してsetuid()を呼び出せるようにします。setuid(0)とsystem(/bin/sh)を呼び出します。ファイル内の定数は、お使いのシステムに合わせて少し変更する必要があるかもしれません。必要に応じて設定してください。