
CVE-2019-2215 — Android Binder Use-After-Free 特権昇格 説明
CVE-2019-2215 の脆弱性 (Android カーネルの binder ドライバーにおける use-after-free) のエクスプロイト。脆弱なデバイス上で root への特権昇格を可能にします。 脆弱性
CVE-2019-2215 — epoll 使用時の binder_thread における use-after-free。このエラーは binder_poll() の wait キューの不適切な処理に起因し、カーネルメモリの上書きを可能にします。 動作原理
ポインタのリーク (leakTaskStruct)
epoll と binder 間のレースにより、writev/pipe を介して現在のプロセスの task_struct へのポインタが読み取られます。
addr_limit の上書き (clobberAddrLimit)
同じレースを使用して task_struct 構造体の addr_limit フィールドに 0xFFFFFFFFFFFFFFFE を書き込み、カーネルメモリ全体へのアクセスを開放します。
cred のパッチ (patchCred)
pipe チャネル (kernel_fd) を介して現在のプロセスの cred 構造体を読み取り、上書きします:
UID/GID = 0 (root)
完全な capabilities (CAP_FULL_SET)
SELinux の無効化 (disableSELinuxEnforcing)
nsproxy を介してカーネルのベースアドレスを計算し、selinux_enforcing フラグをゼロにします。
root 権限でのシェル起動: system("/bin/sh")
要件
脆弱なバージョンの Android (2019年10月のパッチ適用前) を搭載したデバイス
ARM64 アーキテクチャ
/dev/binder が存在すること
コンパイル時にカーネルシンボルを指定する必要があります:
init_nsproxy — カーネルベースの計算用
selinux_enforcing — SELinux の無効化用
シンボルはターゲットシステムの /proc/kallsyms から取得できます。