
CVE-2015-1805 を使用した HP Slate 7 2800 Android 4.1.1 root化キット。
English | Русский
このリポジトリには、ローカル脆弱性 CVE-2015-1805 を悪用して、ファームウェア 1.05.18 とカーネル Linux 3.0.8+ を搭載した HP Slate 7 2800 で永続的な root アクセスを取得するための、完全かつ自己完結型のキットが含まれています。このキットは実機のタブレットで実行され、その結果は新しい ADB セッションと通常の再起動後に検証されました。
これは汎用的な Android ルート化ツールではありません。このエクスプロイトは、この HP カーネル構成に固有のものです。異なるモデル、ファームウェア、またはカーネルバージョンでは実行しないでください。
| パラメーター | 検証済みの値 |
|---|---|
| メーカーとモデル | HP Slate 7 2800 |
| Android | 4.1.1、API 16、ビルド JRO03H |
| プロダクト / デバイス | t7h / pine |
| プロセッサー | Rockchip RK3066、ARMv7 |
| ビルドフィンガープリント | hp/t7h/pine:4.1.1/JRO03H/v1.05.18_user:user/release-keys |
| カーネル | 3.0.8+ #13 SMP PREEMPT Tue Jul 28 15:24:30 CST 2015 |
| ABI | 32ビット ARM EABI5 |
| SELinux | カーネル構成には存在しない (CONFIG_SECURITY は無効) |
/system パーティション | ext4、デフォルトでは読み取り専用でマウント |
以下のコマンドで、デバイスに変更を加えずに確認できます:
adb devices -l
adb shell getprop ro.product.model
adb shell getprop ro.build.fingerprint
adb shell getprop ro.build.version.sdk
adb shell cat /proc/version
または、以下のスクリプトを使用してください。フィンガープリントまたはカーネルバージョンのいずれかが一致しない場合、実行を拒否します:
./scripts/check-target.sh
./scripts/check-target.sh ADB_SERIAL
.
├── bin/
│ ├── hp-slate7-cve-2015-1805-root # verified exploit
│ ├── hp-slate7-install-root # installs su into /system
│ └── hp-slate7-su # minimal setuid-root wrapper
├── src/
│ ├── exploit/ # CVE source and device-specific changes
│ ├── installer/install-root.c # installer source
│ └── su/rootsh.S # minimal su source
├── scripts/
│ ├── build.sh # rebuilds all three ELF files
│ ├── check-target.sh # safe compatibility check
│ └── root-device.sh # verifies, uploads, and runs the kit
├── SHA256SUMS # hashes of the verified bin/* files
├── NOTICE # attribution for the original PoC
└── LICENSE # GPL-3.0
| ファイル | 形式 | サイズ | 目的 |
|---|---|---|---|
bin/hp-slate7-cve-2015-1805-root | ELF 32ビット ARM EABI5、静的、strip なし | 2,722,320 バイト | CVE を悪用して uid 0 を取得し、インストーラーを起動 |
bin/hp-slate7-install-root | ELF 32ビット ARM EABI5、静的、strip 済み | 22,596 バイト | /system を一時的に rw で再マウントし、su をインストールして ro に戻す |
bin/hp-slate7-su | ELF 32ビット ARM EABI5、静的、strip 済み | 656 バイト | setresgid(0,0,0) と setresuid(0,0,0) を呼び出してから /system/bin/sh を起動 |
検証済みバイナリの SHA-256 チェックサム:
6bf8ea09efb9f409dfc7aa5efbc3108e5c1a19fc5b07ae913328ef4639a7644f bin/hp-slate7-cve-2015-1805-root
4857c71efc846636afc5b50d7f3c971c6eb68d3760f652086f2a38c5dc50bc4a bin/hp-slate7-install-root
40626e555f71b71aa5ef7a727e9f6be55e552ef998ae3f49e9390f3e213c610e bin/hp-slate7-su
macOS での検証:
shasum -a 256 -c SHA256SUMS
Linux での検証:
sha256sum -c SHA256SUMS
タブレットでは bin/ 内のファイルを使用してください。これらはデバイス上で検証された正確なバイト列です。build/ ディレクトリはローカルでの再ビルド用であり、Git では追跡されません。
CVE-2015-1805 は、古い Linux カーネルの pipe_read() および pipe_write() の実装に存在する欠陥です。アトミックコピーが失敗すると、コードは誤って iovec 配列の走査を継続し、ポインターが境界を超えて移動する可能性があります。その結果、特権を持たないローカルプロセスがメモリを破壊し、カーネルをクラッシュさせたり、特権を昇格させたりすることができます。この仕組みの詳細な解説は oss-security で公開されています。修正は、とりわけ上流 Linux のコミット 637b58c と f0d1bec に含まれています。
タブレットの 3.0.8+ カーネルは脆弱であることが確認されました。カーネルメモリを変更する前に、同じ競合状態が、2つの書き込み先が両方ともテストプロセスの通常メモリ内にある無害なプローブで別途テストされました。プローブは CVE-2015-1805: VULNERABLE を報告し、タブレットは ADB 経由でアクセス可能なままでした。
readv()、メモリマッピングの変更、およびカーネルの脆弱なパイプコードでの大きな iovec 配列の処理の間で競合状態を作り出します。sys_call_table の未使用エントリ 222 を、エクスプロイトプロセス内の小さな ARM トランポリンのアドレスで一時的に置き換えます。0xffff0008 のハイベクタを介して計算されます。検証済みデバイスでは、命令は 0xe59ff410 であり、そのリテラルは vector_swi = 0xc04d0d40 を指しています。vector_swi と sys_call_table は、公式 HP Open Source 1.05.10 カーネルアーカイブ (アーカイブ SHA-256: dd69f0468973714fd9ba22cdfea7e96f39f651ee51b9cb537728d9dcadbafda2) から rk30_t7h_dvt_defconfig defconfig を使用して独立に組み立てられました。それらのオフセットは 0xc4 です。インストールされているファームウェアには OABI も seccomp もないため、テーブルの最終的な実行時アドレスは 0xc04d0e04 です。sp を取得し、8,192バイトのカーネルスタックサイズに整列させ、オフセット 8 の thread_info.addr_limit にのみ -1 を書き込みます。外部呼び出し、プロローグ、コンパイラのランタイムコードは含まれていません。sys_ni_syscall です。検証済みカーネルで復元されたポインターは 0xc051900c です。addr_limit が拡張されると、パイプコピーは現在の task_struct を読み取り、cred を見つけ、現在の uid/gid 値、アライメント、参照カウント、および real_cred == cred 条件を使用して構造体を検証します。これらのチェックの後でのみ、uid/gid 値がゼロにされ、ケーパビリティマスクがすべて 1 で埋められます。uid=0 を取得し、/data/local/tmp/install-root を起動します。インストーラーは /system を rw で再マウントし、ペイロードを /system/xbin/su にコピーし、root:root の所有権とモード 06755 を設定し、sync() を呼び出し、/system を読み取り専用で再マウントします。古いカーネルヘッダーの元の current_thread_info() 関数は、-O0 では最新の Clang と互換性がありませんでした。初期のプロトタイプは sp レジスタではなく初期化されていないワードを読み取り、カーネルをクラッシュさせる可能性がありました。このリポジトリでは、検証済みの naked ARM トランポリンに置き換えられています。初期のバイナリはリポジトリには含まれていません。
bin/ の既製ファイルを使用する場合adb。Android NDK、Java、Python、fastboot、ロック解除されたブートローダー、カスタムリカバリ、ルート化 APK、ネットワークアクセスは不要です。エクスプロイトとペイロードは静的リンクされています。
shasum または sha256sum。Android NDK はやはり不要です。Zig が ARM musl クロスツールチェーンを提供します。
接続を確認します:
adb devices -l
ステータスは device である必要があり、offline や unauthorized であってはなりません。
リポジトリのルートに移動し、まずデバイスが完全に一致することを確認します:
./scripts/check-target.sh
複数のデバイスが接続されている場合は、adb -s SERIAL を使用してすべてのコマンドにシリアル番号を渡すか、ANDROID_SERIAL 環境変数を設定してください。
相互に期待される名前を使用して、3つのファイルをアップロードします:
adb push bin/hp-slate7-cve-2015-1805-root /data/local/tmp/cve-2015-1805-root
adb push bin/hp-slate7-install-root /data/local/tmp/install-root
adb push bin/hp-slate7-su /data/local/tmp/rootsh-armv7
パーミッションを設定し、ステージングされたファイルをストレージにフラッシュします:
adb shell 'chmod 755 /data/local/tmp/cve-2015-1805-root /data/local/tmp/install-root /data/local/tmp/rootsh-armv7; sync'
エクスプロイトを 1回だけ 実行します:
adb shell '/data/local/tmp/cve-2015-1805-root; rc=$?; echo DEVICE_RC=$rc; exit $rc'
検証済みの成功出力:
offset:c4
addr:c04d0d40
[+] Done
restored syscall 222 to 0xc051900c
exploit rc=0 uid=0 gid=0
installer uid=0 gid=0
install-su ok
DEVICE_RC=0
デバイスが数秒間 ADB から消えても、エクスプロイトを再度実行しないでください。戻ってくるのを待ちます:
adb wait-for-device
このスクリプトは、フィンガープリントとカーネルを検証し、SHA-256 ハッシュをチェックし、ファイルをアップロードし、ROOT の入力を求めて、エクスプロイトを実行し、uid=0 を検証します:
./scripts/root-device.sh
複数のデバイスの場合:
./scripts/root-device.sh --serial ADB_SERIAL
--yes オプションはインタラクティブな確認を無効にし、意図的な自動化でのみ使用することを想定しています:
./scripts/root-device.sh --serial ADB_SERIAL --yes
エクスプロイトプロセスの uid からではなく、新しい ADB シェルから root を検証します:
adb shell 'id; /system/xbin/su -c id; echo SU_RC=$?'
adb shell 'ls -l /system/xbin/su'
adb shell 'cat /proc/mounts' | grep ' /system '
期待される出力: