独立式 Web 应用 (IWA) 提供了一种安全模型,使 Web 应用能够访问强大的功能(例如直接套接字和受控框架),而这些功能通常在标准的“顺便访问”Web 中受到限制。由于 IWA 在高信任环境中运行,因此必须遵守严格的安全和隐私权政策。这些准则旨在确保随着 Web 平台的功能越来越强大,用户仍然安全无虞,并且浏览器环境的完整性得以保持。
IWA 信任模型
IWA 平台的核心是围绕严格的技术政策构建的,这些政策可强制开发者保持高安全级别。虽然标准 Web 应用依赖于灵活的权限模型,但 IWA 经过加密签名,并使用 Web Bundle 交付,这使得可以验证其来源和完整性。
作为对这种已验证身份的回报,IWA 可以访问特权 API。为了维护这种信任,开发者必须遵循“安全第一”的方法,遵守更严格的政策(包括强大的内容安全政策 [CSP] 和可信类型),即使在使用强大的功能时也能确保用户安全。这意味着:
- 透明度:应用对特权 API 的使用绝不应让用户感到意外。
- 最小权限:应用应仅请求和使用其声明的用途所需的特定功能。
- 静态完整性:所有可执行逻辑都必须包含在应用软件包中,以便进行安全审核并防止恶意代码旁加载。
虽然 IWA 包含强大的内置保护措施(例如可防止执行外部脚本的严格内容安全政策 [CSP]),但仅靠技术限制无法缓解所有风险。即使在高度信任的环境中,某些实现模式或开发者选择也可能会在无意中损害用户安全或隐私。本指南概述了这些受限场景以及管理特权 API 使用的政策。
这些准则的重要性
遵守这些政策不仅是为了合规,更是为了为高级 Web 应用打造可持续的生态系统。遵循这些准则可确保您的应用:
- 避免出现安全回归:通过保持逻辑自包含来防止出现跨站脚本攻击 (XSS) 和远程代码执行等漏洞。
- 保护用户隐私:确保仅在用户明确表示意图并保持透明的情况下处理敏感数据和硬件访问权限。
- 确保平台长久运行:有助于保持 IWA 平台所需的高安全标准,以便继续扩展其功能集。
核心原则
透明度和用户意图
最基本的规则是:不要让用户感到意外。应用的行为必须与其声明的用途和用户预期相符。
- 保持在范围内:请勿实现超出应用明确用途的功能。
- 尽可能减少 API 占用空间:仅请求和使用实现应用核心功能所需的特定 IWA API 集。
无动态代码旁加载
IWA 安全模型取决于管理员或浏览器供应商验证所有可执行逻辑的能力。因此,您的 IWA 软件包必须保持独立。平台通过严格的内容安全政策 (CSP) 来强制执行此要求,该政策会屏蔽基于字符串的执行,例如 eval() 和 new Function():
script-src 'self' 'wasm-unsafe-eval';
require-trusted-types-for 'script';
虽然 CSP 允许 'wasm-unsafe-eval' 支持 WebAssembly,但您不得绕过此安全边界的初衷。
严禁的行为
- 针对远程代码的传送解释器:您不得包含代码解释器(例如编译为 WASM 的 Python 或 Lua),以使用 Direct Sockets 等特权网络访问权限下载和执行外部脚本。
- 远程加载的逻辑:请勿使用服务工作线程将远程加载的代码嵌入到 IWA 源中。
- 代码与数据:虽然允许下载数据(例如 JSON),但下载任何旨在解释或运行的代码都直接违反了政策。
最小权限原则
始终使用能够完成任务的最低功率 API。特权 IWA 特有的 API 绝不应作为绕过标准 Web API 的安全限制或用户提示的捷径来使用。下表列出了常见用例,可帮助您确定何时使用传统 Web API,何时使用 IWA 特有的功能:
| 任务 | 使用标准 Web API(推荐) | 避免使用特权 IWA API(受限) |
|---|---|---|
| 外接硬盘访问权限 | 使用 File System Access API 进行标准文件 I/O。 | 请勿使用不受限制的 WebUSB 来访问存储空间。 |
| 智能卡互动 | 使用 Smart Card API。 | 请勿将不受限的 WebUSB 用于智能卡。 |
| 串行设备通信 | 如果 WebSerial API 足够满足您的设备需求,请使用该 API。 | 如果 WebSerial 可以执行相应任务,请避免使用 Unrestricted WebUSB。 |
| 嵌入可信内容 | 使用标准 <iframe>。 |
除非需要隔离,否则请勿使用 <controlledframe> 进行简单嵌入。 |
特定于 API 的准则
IWA API 提供强大的功能,这些功能通常在浏览器中受到限制。一般而言,请勿以会令用户感到意外或损害其信任和数据的方式使用这些特权功能。
Direct Sockets API
Direct Sockets API 授予原始 TCP 和 UDP 访问权限,包括多播和本地网络访问权限。
允许
- 支持自定义协议:连接到使用自定义协议的远程服务器,目前尚无更高级别的 Web API 可用于这些协议。
- 维护后端服务:连接到专门用于应用后端服务的预定义硬编码服务器。
- 发现必要的硬件:访问本地网络或使用多播来发现对应用功能至关重要的特定相关硬件(例如,视频编辑应用定位网络附加存储设备)。
不允许
- 让用户感到意外:实现网络访问,但应用的这项功能并未明确与应用的主要功能相关联,例如文本编辑器与本地网络设备通信。
- 随意扫描网络:对用户的本地网络进行广泛扫描(例如,对 192.168.1.0/24 进行端口扫描),以分析用户或发现无关设备。
- 针对本地设备:严禁尝试探测、重新配置或攻击本地网络中的其他设备。
Controlled Frame API
<controlledframe> 元素允许嵌入和修改跨源内容,包括注入脚本和更改标头。
允许
- 简化界面:嵌入第三方服务并注入 CSS 以隐藏不相关的界面元素或提供更流畅的体验。
- 中介安全通信:通过接收来自嵌入式网页(带有
postMessage)的请求来充当门卫,并仅返回通过特权 API 提取的经过清理的必要数据。
不允许
- 窃取用户凭据:注入脚本以从嵌入的内容中捕获密码、会话 Cookie 或其他敏感用户数据。
- 违反服务条款:以违反嵌入式平台服务条款的方式更改这些平台,例如以程序化方式点击广告或未经授权地抓取数据。
- 代理特权访问权限:创建直通,使不受信任的嵌入式内容能够直接或不受控制地访问特权 IWA API。
- 实现不受控制的 AI:通过 AI 代表已登录的用户执行操作,但没有明确、透明的用例限制。
不受限制的屏幕录制
允许截取屏幕,而无需像标准 Web 中那样反复提示用户授予权限。
允许
- 提供核心功能:将屏幕捕获作为应用服务的一个明显部分,例如在虚拟会议或教程录制功能中。
- 确保用户知情:在用户与应用互动之前,明确告知用户可能会进行录制。
不允许
- 秘密录制:在用户不知情或未明确同意的情况下,捕获用户的屏幕内容。
- 违反隐私权法规:从事任何违反当地或国际隐私权法的录制行为。
不受限的 WebUSB
不受限的 WebUSB 会绕过标准 WebUSB 屏蔽名单,以允许与设备进行低级别互动。
允许
- 支持专有硬件:与没有高级别 Web API 的专用或旧版硬件(例如工业控制器)进行交互。
现在允许
- 绕过专用 API:针对具有更具体、受限的 API 的设备使用 WebUSB,例如智能卡(使用 Smart Card API)或外部存储空间(使用 File System Access API)。
窗口管理(window.open 和 window.focus)
IWA 可以创建弹出式窗口和焦点窗口,而无需用户执行标准 Web 所需的手势。
允许
- 通知任务完成:当用户发起的关键后台任务(例如视频渲染)完成时,将应用窗口设为焦点。
不允许
- 垃圾广告:向用户显示多个未经请求的窗口。
- 网络钓鱼:打开旨在模仿系统对话框或欺骗用户的窗口。
- 抢占焦点:通过从其他应用抢占焦点来中断用户操作,以处理非关键事件。
总结
隔离 Web 应用的安全架构旨在为开发者提供支持,同时为用户维护高信任度的环境。遵循这些准则可确保您的应用在 IWA 生态系统中保持负责任的状态。本指南中最重要的内容包括:
- 优先考虑透明度:应用的行为应始终与其声明的用途保持一致;切勿实现会让用户感到意外或背叛用户的功能。
- 强制执行软件包完整性:所有可执行逻辑都必须包含在 IWA 软件包中,以便进行静态验证。严禁通过动态代码旁加载或远程解释器绕过安全模型。
- 遵循最小权限原则:请始终为给定任务选择限制最多的可用 API。仅当标准 Web API 不足以支持应用的核心功能时,才应使用特权 IWA API。
- 充当门卫:使用
<controlledframe>等强大的工具时,IWA 必须充当可信内容的透明代理,而不是不受信任内容的透明代理。
在发布 IWA 之前,请通过提出以下问题来对您的实现进行最终审核:
- 我是否使用了最简单、限制最多的 API 来完成此任务?
- 用户是否会对我的应用的行为感到意外或背叛?
如果第一个问题的答案为“否”,或者第二个问题的答案为“是”,则您的应用很可能违反了 IWA 安全政策,可能会被移除。