# Shizuku Privileged API {{#include ../../banners/hacktricks-training.md}} Shizukuは、**`app_process`を使用して特権のあるJavaプロセスを生成し**、選択された**AndroidシステムAPIをBinder経由で公開する**オープンソースサービスです。プロセスはADBが使用するのと同じ**`shell` UID権限で起動されるため、エクスポートされたAIDLインターフェースにバインドする任意のアプリケーション(またはターミナル)は、通常**`WRITE_SECURE_SETTINGS`、`INSTALL_PACKAGES`、`/data`内のファイルI/O**などを必要とする多くのアクションを**デバイスをルート化せずに**実行できます。 典型的な使用例: * ルート化されていないハンドセットからのセキュリティ監査 * ブloatwareの削除 / システムアプリのデブロート * ブルーチーム/DFIRのためのログ、Wi-Fiキー、プロセスおよびソケット情報の収集 * カスタムアプリやシェルスクリプトからのデバイス設定の自動化 --- ## 1. 特権サービスの開始 `moe.shizuku.privileged.api`は、3つの異なる方法で開始できます。結果として得られるBinderサービスは、すべての方法で同じように動作します。 ### 1.1 ワイヤレスADB(Android 11+) 1. **開発者オプション ➜ ワイヤレスデバッグ**を有効にし、デバイスをペアリングします。 2. Shizukuアプリ内で**「ワイヤレスデバッグ経由で開始」**を選択し、ペアリングコードをコピーします。 3. サービスは次回の再起動まで生存します(ワイヤレスデバッグセッションはブート時にクリアされます)。 ### 1.2 USB / ローカルADBワンライナー ```bash adb push start.sh \ /storage/emulated/0/Android/data/moe.shizuku.privileged.api/ # spawn the privileged process adb shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh ``` 同じスクリプトは**ネットワーク ADB** 接続(`adb connect :5555`)を介して実行できます。 ### 1.3 ルート化されたデバイス デバイスがすでにルート化されている場合は、次のコマンドを実行します: ```bash su -c sh /data/adb/shizuku/start.sh ``` ### 1.4 実行中であることの確認 ```bash adb shell dumpsys activity service moe.shizuku.privileged.api | head ``` 成功した開始は、特権プロセスのPIDと共に `Running services (1)` を返します。 --- ## 2. アプリケーションからのバインディング サードパーティアプリは、`AndroidManifest.xml` 内に以下を必要とします: ```xml ``` 実行時にバインダーを取得します: ```java IBinder binder = ShizukuProvider.getBinder(); IPackageManager pm = IPackageManager.Stub.asInterface(binder); ``` この時点から、アプリは**`shell`ユーザー**が呼び出す可能性のある任意のメソッドを呼び出すことができます – 例えば: ```java pm.installPackage(new Uri("file:///sdcard/app.apk"), null, 0, null); Settings.Global.putInt(resolver, Settings.Global.ADB_ENABLED, 1); ``` 170以上の**Shizuku対応アプリ**のキュレーションリストは[awesome-shizuku](https://github.com/timschneeb/awesome-shizuku)で管理されています。 --- ## 3. Rish – Termux内の昇格シェル Shizuku設定画面では**「ターミナルアプリでShizukuを使用」**が表示されます。これを有効にすると*rish*(`/data/local/tmp/rish`)がダウンロードされます。 ```bash pkg install wget wget https://rikka.app/rish/latest -O rish && chmod +x rish # start elevated shell (inherits the binder connection) ./rish whoami # ➜ shell id # uid=2000(shell) gid=2000(shell) groups=... context=u:r:shell:s0 ``` ### 3.1 有用なコマンド rish シェルから * 特定のパッケージの実行中プロセスをリストする: ```bash ps -A | grep com.facebook.katana ``` * リスニングソケットを列挙し、それらをパッケージにマッピングする(例: **CVE-2019-6447 ES File Explorer**): ```bash netstat -tuln for pid in $(lsof -nP -iTCP -sTCP:LISTEN -t); do printf "%s -> %s\n" "$pid" "$(cat /proc/$pid/cmdline)"; done ``` * すべてのアプリケーションのログをダンプする: ```bash logcat -d | grep -iE "(error|exception)" ``` * 保存されたWi-Fi資格情報を読む(Android 11 +): ```bash cat /data/misc/wifi/WifiConfigStore.xml | grep -i "" ``` * バルクデブロート(例): ```bash pm uninstall --user 0 com.miui.weather2 ``` --- ## 4. セキュリティ考慮事項 / 検出 1. Shizukuは**ADBデバッグ**権限が必要であるため、_開発者オプション → USB/ワイヤレスデバッグ_を**有効**にする必要があります。 組織はこれをMDMを通じてブロックするか、`settings put global development_settings_enabled 0`を使用できます。 2. サービスは`moe.shizuku.privileged.api`という名前で自らを登録します。 シンプルな`adb shell service list | grep shizuku`(またはエンドポイントセキュリティルール)がその存在を検出します。 3. 機能は`shell`ユーザーがすでにできることに制限されており、**rootではありません**。 `system`または`root`ユーザーを必要とする敏感なAPIには依然としてアクセスできません。 4. セッションは**再起動後に生き残りません**、デバイスがルート化されており、Shizukuがスタートアップデーモンとして構成されている場合を除きます。 --- ## 5. 緩和策 * 生産デバイスでUSB/ワイヤレスデバッグを無効にする。 * `moe.shizuku.privileged.api`を公開しているBinderサービスを監視する。 * SELinuxポリシー(Androidエンタープライズ)を使用して、管理されていないアプリケーションからAIDLインターフェースをブロックする。 --- ## 参考文献 - [Blog – Shizuku: Unlocking Advanced Android Capabilities Without Root](https://www.mobile-hacker.com/2025/07/14/shizuku-unlocking-advanced-android-capabilities-without-root/) - [Shizuku Official Documentation](https://shizuku.rikka.app/) - [awesome-shizuku – list of supported apps](https://github.com/timschneeb/awesome-shizuku) - [rish shell (privileged reverse-adb shell)](https://github.com/RikkaApps/Shizuku/blob/master/RISH.md) {{#include ../../banners/hacktricks-training.md}}