2023 年,一个被攻陷的广告 SDK——SpinOK——悄悄从 101 款安卓 App 中窃取用户数据,其中不少下载量以百万计,且全部仍躺在 Google Play 上。开发者没做错任何事,只是信任了一个运行时看不见的远端依赖。

博人眼球的是恶意 SDK。更日常、也更安静的那一版,就藏在你自己的 App 里:登录、支付、个人资料等核心链路,被渲染在一个从你自己服务器加载文档的 WebView 中。

你以为你控制着它。App 是你发的包。但当一条链路以远端 HTML 跑在 WebView 里,你其实已经把一部分安全边界,交给了「今晚负责提供那份文档的人」。

WebView 不是你拥有的沙箱

WebView 是嵌在 App 里的浏览器引擎。它加载远端页面时,那页面就表现得像一张网页。为了打通集成,如果你开启了 JavaScript 桥、文件访问或混合内容,那么一旦页面(或它前面的 CDN)被攻陷,攻击者就能从 Web 内容直接横向移动到原生 App 的功能里。

这不是理论。OWASP 移动端 Top 10(2024)把「平台使用不当」列为头号风险,其中 WebView 条目说得很直白:WebView 配置不当会把原生能力暴露给远端内容。在没有严格来源管控的情况下开启 JavaScript,是经典的横向移动入口。你信任的那张页面,变成了能触达用户令牌、通讯录、钱包的页面。

你继承了整个 Web 的供应链

更深层的问题,是远端页面把什么拉了进来。那张 HTML 里每一个统计脚本、每一个 CDN 资源、每一个第三方 SDK,现在都是你的攻击面——而你对其中的任何一个都没管辖权。

正因为如此,OWASP 在 2024 修订版里把「供应链安全不足」新增为移动端第二号风险。数字相当刺眼:

  • 91% 的企业在 2024 年遭遇过软件供应链攻击。
  • 85% 的移动 App 含有安全或隐私漏洞,多数可追溯到第三方组件。
  • 一项 2024 年对 158 个常用安卓 SDK 的学术研究发现 338 起隐私数据外泄实例,且 88% 虚假声称了自己实际使用的敏感权限。

当你的支付页是一张远端网页,你就把这一整笔负债进口了进来。结账流程里一个存在漏洞的脚本,是你的数据泄露,不是供应商的头条新闻。

边界到底在哪里崩掉

维度核心链路跑在 WebView核心链路跑在宿主自有 runtime
内容来源远端服务器,随时可变更来自受控目录的签名包
权限边界远端页面共享 WebView 能力(JS 桥横向移动风险)能力白名单,默认最小权限
供应链暴露每一个内嵌脚本、CDN、SDK经审核的、受控的组件目录
应用级控制商店审核与证书锁定从未看见那份远端 HTML与原生代码同一套签名与安全模型
事件响应等 CDN 或第三方打补丁分钟级的熔断开关或版本回滚

你花重金买的控制,够不到远端页面

这是团队最容易忽略的一点。你投入的应用级安全——证书锁定、代码签名、商店审核、运行时权限收窄——在 WebView 的边缘就停了。那份远端 HTML 不在你的构建产物里,没被你签名,也从没经过商店审核。商店过审是分发关卡,不是安全边界。

于是,一条看起来「在 App 里」的链路,在安全的意义上,跑在了你亲手搭建的每一道控制之外。

而搞砸这件事的代价并不抽象。IBM 2025 年数据泄露成本报告称,单次泄露的全球平均成本为 444 万美元(美国平均创下 1022 万美元 的纪录),几乎每个受害方都经历了运营中断,多数恢复耗时 超过 100 天。一次 WebView XSS 偷走的会话令牌,往往就是那扇前门。

宿主自有 runtime 关上了门

替代方案,是不再向一份远端文档租借你的安全边界。宿主自有 runtime 把小程序当作第一方、沙箱化、已签名、来自受控目录的组件来跑:

  • 来源你掌控。 内容是签名包,不是今晚从网络拉取的一张可变页面。
  • 能力收窄。 runtime 只授予组件声明过的权限——默认最小权限,没有沉默的 JS 桥后门。
  • 供应链受控。 组件来自审核过的目录,而非远端页面临时决定加载的任意脚本。
  • 即时响应。 一个坏组件,分钟级熔断或回滚,而不是等第三方打补丁。

你保留了 Web 的发布速度,却没有把威胁模型外包给陌生人。

一句话结论

H5 依赖被包装成便利:发一次、从服务器更新、跳过商店审核。但每当你把一条核心链路渲染成 WebView 里的远端 HTML,你就是用一道受控的边界,换了一道敞开的边界。我们之前写过的「合规黑盒」只是故事的一半;另一半是,攻击面现在已经归「提供文档的那一方」所有——而你要等到令牌被顺走,才知道发生了什么。

一个带开放、可治理目录的通用 runtime,让你既保住速度,又把边界拿回来。

参考来源