mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 10:03:23 +09:00
2.9 KiB
2.9 KiB
P11 B1 预探针:无 Context 的 app_process helper 能否经 Binder 拿到连 server 的套接字(真机)
2026-09-29,Redmi 2f7cbe2e(Android 16 / HyperOS),代码 2fcde6eb(PAIR 之前)。报告 ~/w7/notes/p11/hspike-report.md,证据 ~/w7/notes/p11/evidence/hspike/,工具提交 59a5ceeb(p11/hspike,保留到 B 落地),未提交的 fd: 端点补丁 evidence/hspike/fd-endpoint.diff。
结论:两条路都通,原生路线可行
| 路线 | helper 所在上下文 | 结果 |
|---|---|---|
| (a) | adb shell app_process(u:r:shell:s0) |
通;openra ssim 1.0,rd12 0.99988(Espryt)/ 0.999884(Magma) |
| (b) | 从 APK #2 的进程 exec app_process(untrusted_app:c84,代表 Termux 一类) |
通;同上 |
| 令牌错或缺 | 两条路 | 按名拒绝("token mismatch" / "no expected token configured"),不给 fd、不起会话 |
链路:helper 自建 Binder → 经隐藏接口 IActivityManager.broadcastIntentWithFeature(与 am 同路,参数按类型填)发显式广播 → server app 里导出的 broker 核对 IPC 令牌 → 连两次自己的 @mglb0(同 app 允许)→ 两个 client 端作为 ParcelFileDescriptor 回给 helper → helper 清 FD_CLOEXEC、带 MOBILEGL_IPC_CONTROL=fd:<control>,<aux> execve 原生 retrace client。跨类别把 c83 建的套接字交给 c84 使用,无任何 avc 拒绝(补上 B0 §6 #1 未验证的一项)。
依赖 ROM 的前提:直接跑的 app_process 不是 zygote fork 出来的,不受 app 的隐藏 API 黑名单约束,所以 IActivityManager 可用;若某个 ROM 对它也强制执行,原生路线就断——am broadcast 这类命令带不了 Binder,没有替代。
顺带查出(B1 要处理)
| # | 现象 | 对 B1 的意义 |
|---|---|---|
| 1 | 从 app uid 调 pm path 查 server APK 被包可见性过滤;但 c84 的 app_process 用 APK #1 的 base.apk 作 CLASSPATH 能正常加载,显式组件广播也不需要可见性 |
无 Context 的 client 缺的只是"发现";由 server 界面生成可复制的启动命令(APK 路径、组件、令牌) |
| 2 | HyperOS 熄屏约 7 s 后冻结 server uid,在飞会话 120 s 后 Fatal{BarrierTimeout};helper 的 Binder 在 execve 之后就没了,保不住 server。冻结也会落到 client app 上,路线 (b) 的 rd12 要靠 root 解冻才跑完 |
防冻结要另想办法(前台服务 + 文档化的每 app 电池设置),并且门要在用户能达到的拓扑下量 |
| 3 | 路线 (a) 默认落位 23.5 fps → 手工定核 118.5(与 B0 的 26 → 118 一致,helper 与 fd: 在数据面上零成本);路线 (b) 两种落位都约 49:退到后台的 client app 被 HyperOS 关进小核 /background cpuset,调用方的 taskset 无效 |
server 侧的亲和 / 自旋策略是最大的杠杆;client 在前台时才有大核可用 |