← 返回列表
未验证
🔑 WebAuthn for WebView Shells
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/7 · 已提供中文文档
通过官方 androidx.webkit 开关在 WebView 壳浏览器(Via、Quark……)中启用通行密钥——LSPosed 模块;针对较旧的 WebView(约 124-13x),其中 WebAuthn 未默认启用;完全可逆
综合分
29.7
GitHub 分
29.7
用户评分
—
★ Stars
1
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add cmyfqwq/webauthn-for-webview-shells该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/18(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
🔑 WebAuthn for WebView Shells
让轻量 WebView 壳浏览器用上通行密钥——拨的只是官方本来就有的那个开关。
License: MIT
Requires LSPosed
Android 7.0+
System WebView 124+
English · 简体中文
🧠 这到底是什么
通行密钥的能力本来就在 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[系统凭据弹窗原生密码本接管]
- 网站立刻能识别"这台手机有平台认证器"喵
- 创建/验证通行密钥全走原生密码本(ColorOS 密码本、谷歌密码管理工具等)
- 宿主重新改设置时模块会自动把开关粘回去
📦 壳浏览器支持
| 浏览器 | 状态 |
| --- | --- |
| 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 必须供得起自己要应用的桥喵。
🚀 安装
1. 前提:root + LSPosed,Android 7.0+,系统 WebView 124+
2. 从 Releases 下载 APK 安装
3. LSPosed 管理器里启用模块(作用域已按 manifest 预填),重启浏览器
4. 打开任意支持 passkey 的网站,等系统凭据弹窗冒出来喵
完全可逆:关掉开关或 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。
🧭 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 上即可恢复喵;欢迎把此结论反馈给小米喵。
☕ Credits
- 基于 androidx.webkit 的 WebView–Credential Manager 官方桥接
- 问题情报来自 caniuse passkey 支持矩阵(QQ 14.9 / 百度 13.52 不支持)和上游壳浏览器翻车报告(如 openai/codex #31204)
MIT · 无追踪 · 无联网 · 一个开关
cmyfqwq 出品扫码进群