124 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Shizuku Privileged API
{{#include ../../banners/hacktricks-training.md}}
Shizuku 是一个开源服务,**使用 `app_process` 启动一个特权 Java 进程**,并通过 Binder 暴露选定的 **Android 系统 API**。由于该进程以与 ADB 相同的 **`shell` UID 权限**启动,任何绑定到导出的 AIDL 接口的应用程序(或终端)都可以执行许多通常需要 **`WRITE_SECURE_SETTINGS``INSTALL_PACKAGES`、在 `/data` 内的文件 I/O** 等操作 **无需获取设备的 root 权限**
典型用例:
* 从未 root 的手机进行安全审计
* 移除预装软件 / 精简系统应用
* 收集日志、Wi-Fi 密钥、进程和套接字信息以供蓝队/DFIR 使用
* 从自定义应用或 shell 脚本自动配置设备
---
## 1. 启动特权服务
`moe.shizuku.privileged.api` 可以通过三种不同方式启动 结果 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
```
同样的脚本可以通过 **network ADB** 连接执行(`adb connect <IP>:5555`)。
### 1.3 已获取root权限的设备
如果设备已经获取root权限请运行
```bash
su -c sh /data/adb/shizuku/start.sh
```
### 1.4 验证它是否正在运行
```bash
adb shell dumpsys activity service moe.shizuku.privileged.api | head
```
成功启动会返回 `Running services (1)` 以及特权进程的 PID。
---
## 2. 从应用程序绑定
第三方应用只需在其 `AndroidManifest.xml` 中包含以下内容:
```xml
<uses-permission android:name="moe.shizuku.manager.permission.API"/>
```
在运行时,他们获取了 binder
```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 中的提升 shell
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 shell 命令
* 列出给定包的运行进程:
```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 "<ConfigKey>"
```
* 批量卸载(示例):
```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. 会话在重启后 **不会存活**,除非设备已获得 root 权限并且 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 官方文档](https://shizuku.rikka.app/)
- [awesome-shizuku 支持的应用程序列表](https://github.com/timschneeb/awesome-shizuku)
- [rish shell (特权反向 adb shell)](https://github.com/RikkaApps/Shizuku/blob/master/RISH.md)
{{#include ../../banners/hacktricks-training.md}}