dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Enable passkeys in WebView-shell browsers (Via, Quark, ...) via the official androidx.webkit switch — LSPosed module, fully reversible
通行密钥的能力本来就在 Android 系统 WebView 里(v124+)。官方规范要求:每个内嵌 WebView 的宿主 app 都必须自己声明这一行:
WebSettingsCompat.setWebAuthenticationSupport(settings, WEB_AUTHENTICATION_SUPPORT_FOR_APP);
Via、夸克这类轻量"壳"浏览器全部走系统 WebView 渲染页面——但没有一家调用这行,于是 navigator.credentials() 根本到不了系统凭据栈:不是系统不支持,是壳没伸手喵。
本模块就是替它拨这根官方开关,不碰宿主代码。 一个很小的 LSPosed 模块,hook 目标浏览器进程里的 WebView 构造,替宿主完成官方集成,自带一份 androidx.webkit 库。
不碰系统密码本 · 不发任何网络请求 · 不注入任何 UI。 回滚 = LSPosed 里关掉开关。就这么简单。
graph LR
A[navigator.credentials] --> B{host 开关}
B -- 关 --> X[❌ passkey 弹不出来]
B -- 模块接管 --> C[WAShell hook]
C --> D[系统 WebView ≥ 124]
D --> E[系统凭据弹窗<br/>原生密码本接管]
| 浏览器 | 状态 |
|---|---|
Via GP(mark.via.gp 7.3.3) | ✅ 已实测——创建 + 验证全程正常 |
Via 国行(mark.via) | 默认接线,等实测反馈喵 |
| 其他所有壳 | ⚠️ 机制适用(WebView ≥ 124),但默认未接线——把包名加进 MainHook.java 的 TARGETS,重新构建即可 |
| 层 | 用什么 | 为什么 |
|---|---|---|
| Hook 运行时 | Xposed API 93 / LSPosed | 注入进浏览器自身进程;关模块 = 原生行为 |
| 桥接 | androidx.webkit 1.17(WebSettingsCompat.setWebAuthenticationSupport) | 官方 WebView ↔ Credential Manager 集成,随模块 dex 自带 |
| 目标底线 | Android 7.0+(API 24)/ 系统 WebView 124+ | 启用现成能力,不回填 |
| 构建 | javac → d8 → aapt2 → apksigner(纯 PowerShell,无 Gradle) | 约 350 行总量,一条脚本可复现 |
| 依赖广度 | 无网络、无 UI、无系统写入 | 可逆性就是设计约束喵 |
为什么要自带 androidx.webkit?因为壳们从来不带它——hook 必须供得起自己要应用的桥喵。
完全可逆:关掉开关或 pm uninstall io.github.cmyfqwq.webauthnshell,一切恢复原生,零残留。
不需要 Gradle——一条 PowerShell 脚本驱动 javac → d8 → aapt2 → apksigner:
pwsh build.ps1 # → build/WebAuthn-Shell-1.0.0.apk
想加浏览器?改 MainHook.java 里的 TARGETS 加包名,重建喵。
先自查再报"没效果"喵。 本模块存在的前提是"WebView 默认关闭 WebAuthn、宿主必须自己 opt in"——而新的 WebView/系统版本已经开始自己翻这个默认开关了:
| 设备情况 | 实际表现 |
|---|---|
| Android ≤ 16,WebView 约 124–13x(历史上需要壳主动 opt in) | ✅ 本模块的目标区间——不装的话壳浏览器报"没有平台验证器" |
| Android 16/17 + 新版 WebView(实测:HyperOS 4.0.0.24 / Android 17) | ⚠️ WebView 可能已默认对壳放行 navigator.credentials,模块在这些设备上变成冗余空转;那边的 passkey 成功是凭据提供方侧的功劳,与本 hook 无关 |
| 壳自己就调用 androidx 开关 | ✅ 任何版本——模块按设计变得多余(这正是理想结局) |
快速自查:在 LSPosed 里停用本模块 → 强杀浏览器 → 重试 passkey。还能用,说明你的设备已经不需要它了,不是坏了喵。
另外注意提供方一侧:小米 HyperOS 4 的默认凭据提供方可能仍拒绝 WebView 发起的请求(NotReadableError),见下方 FAQ。
这算漏洞利用吗? 不算喵。它只是在目标 app 自己的进程里设置一个公开的(androidx)配置——壳浏览器自己本来就该调这行。没有加任何 WebView 做不到的事,系统侧的守门逻辑原封不动。
为什么不直接找浏览器官方? 请务必去提喵——每个浏览器加 3 行原生就好了,那是本模块最理想的下场。这个模块的存在就是为了在官方补齐之前先把洞堵上。
小米 HyperOS 4.0 / Android 17 机型会怎样?
实测:hook 正常接通,但系统默认 provider(小米密码本 com.miui.passwords)对第三方 WebView 的 WebAuthn 请求会抛 NotReadableError: unknown error talking to the credential manager,密码本内查无写入记录喵 —— 这是小米侧 provider 未完整实现/未放行的问题(同机 Chrome 走 Google 密码管理工具可正常创建喵)。等小米在设置里放出 passkey 提供方切换或修复后,HyperOS 4 上即可恢复喵;欢迎把此结论反馈给小米喵。
androidx.webkit 的 WebView–Credential Manager 官方桥接MIT · 无追踪 · 无联网 · 一个开关
cmyfqwq 出品