代表性面试主题

系统设计面试:如何用 Web Threat Model 评审一个浏览器系统?

系统设计困难
Offer.cc 编辑团队发布 更新

题干

请评审一个浏览器访问多租户 Web 应用的架构。你如何画出系统边界和数据流,识别资产与威胁来源,区分目标、实现和外部威胁,并把响应写成可验证的安全不变量?

题干与适用场景

请评审一个浏览器访问多租户 Web 应用的架构。你如何画出系统边界和数据流,识别资产与威胁来源,区分目标、实现和外部威胁,并把响应写成可验证的安全不变量?

W3C Security Interest Group 于 2026 年 5 月 26 日发布了 Threat Model for the Web Group Note Draft。该草案是信息性、非规范性文件,用于新 Web 规范的安全评审,并以浏览器、DNS、Web Server、用户和网络运营者等简化组件说明威胁模型。面试重点是方法和证据链,不是背诵草案结论。

面试官考察点

面试官会看你能否先画出系统和数据流,再讨论资产、利益相关者和威胁来源;能否区分威胁、漏洞、影响和响应;能否把安全目标写成可检查的不变量;能否持续更新模型并把结论放入设计和评审文档。优秀回答还会说明模型的抽象边界、未建模攻击者假设,以及如何处理规范外的依赖风险。

回答前需要澄清的问题

  • 评审对象是浏览器平台、某个 Web 应用,还是两者之间的新 Web API?
  • 要保护的资产包括凭据、用户数据、代码、会话、网络元数据还是可用性?
  • 数据流是否包含第三方脚本、CDN、DNS、身份提供商和跨站请求?
  • 威胁模型用于设计初审、发布前安全审查,还是线上变更评估?
  • 哪些依赖和外部威胁明确在范围外,谁负责接续评审?

30 秒回答框架

“我先用一张带唯一 ID 的数据流图定义边界,列出组件、存储、流和利益相关者,再逐项列资产与威胁来源。对每个威胁记录前置条件、受影响流、影响、已有控制和残余风险,并把它归类为规范目标、实现风险或外部依赖。然后将响应写成安全不变量和验证证据,分配负责人和更新触发器。模型应与系统设计同步开始,在正式安全评审前形成可审计版本。”

分步骤深入解答

1. 先画清系统边界

从最小可用场景开始,标出浏览器进程与存储、DNS 服务、Web Server、用户、站点管理员和网络运营者。每个组件使用唯一短 ID,并配套文字字典解释职责和信任边界。若评审的是新 API,再把 API 的输入、输出、权限和依赖嵌入这张图,而不是另画一张孤立图。

2. 列出资产与利益相关者

资产可以是凭据、会话令牌、用户内容、脚本、来源身份、DNS 解析结果、可用性和隐私元数据。利益相关者包括终端用户、网站运营者、网络运营者、应用提供方和公共部门。把“谁受影响”与“谁可能攻击”分开,避免只把用户当成需要保护的对象。

3. 记录威胁来源和高层威胁

对每项威胁说明来源、目标资产、攻击路径和影响。可以用仿冒、篡改、信息泄露、拒绝服务、权限绕过等类别组织清单,但必须回到具体数据流。将威胁分成规范希望处理的目标威胁、实现者已知但不适合写入规范约束的实现威胁,以及依赖或部署环境造成的外部威胁。

4. 把响应写成不变量

安全不变量是系统在所有允许执行中都应保持的条件,例如“跨来源响应不会把未授权凭据交给调用方”“脚本来源和权限边界不能被响应重定向绕过”。每条不变量关联控制、测试、日志或审计证据,并注明是规范保证、实现保证还是部署前提。

text
component/flow -> asset -> threat source -> impact
             -> invariant -> control -> evidence -> owner

5. 处理依赖和外部威胁

Web 依赖 DNS、TLS、HTTP、证书、路由和脚本等多层协议。模型不应假装覆盖所有依赖,而要列出依赖威胁、继承的安全假设和交接点。例如 DNS 欺骗、资源篡改或网络监视可能超出当前规范范围,但必须引用相关技术的威胁模型,并记录采用的前提。

6. 让模型与生命周期同步

威胁模型应在用例、解释文档和设计初稿阶段开始,随着功能和数据流变化持续更新;正式横向安全评审前应准备完成。变更触发器包括新增入口、权限变化、新依赖、浏览器进程边界变化和现实事件。版本化模型、评审记录和差异说明,才能知道风险是新增、关闭还是被重新分类。

7. 证明响应有效

设计评审阶段可用单元测试、集成测试、浏览器安全测试、攻击模拟、配置检查和日志查询验证响应。对无法测试的不变量,给出可审查的理由、残余风险和接受者。不要把“没有发现漏洞”写成证明;要说明观察范围、测试条件和未覆盖区域。

高质量示范回答

我会先定义一个最小浏览器访问场景,用唯一 ID 标出浏览器进程及其存储、DNS、Web Server、用户和网络运营者,并为每条数据流写字典。接着列出凭据、会话、用户内容、脚本、解析结果和隐私元数据等资产,再记录每个威胁的来源、前置条件、受影响流和影响。威胁清单区分规范目标、实现风险和外部依赖,避免把部署前提伪装成规范保证。每个响应都写成可检查的不变量,绑定控制、测试或审计证据和负责人。模型从用例和设计初稿开始,新增入口、依赖或权限变化时更新,正式安全评审前冻结一个带版本的模型。对 DNS、TLS、脚本和路由等外部依赖,我会明确引用其模型或安全假设,并保留残余风险。这样评审结果既能指导设计,也能在后续变更中复用和追踪。

常见错误

  • 只列漏洞名称 → 没有系统边界和数据流 → 先画组件、流和信任边界。
  • 把威胁、漏洞和影响混为一谈 → 响应无法验证 → 逐项记录来源、前置条件、影响和控制。
  • 把所有风险都塞进当前规范 → 范围失真 → 区分目标、实现和外部威胁并标注依赖。
  • 只在发布前做一次模型 → 设计变化未被覆盖 → 从用例阶段开始并设置更新触发器。
  • 把安全目标写成口号 → 没有验收证据 → 改写为不变量并绑定测试、日志或审计。
  • 忽略残余风险 → 决策不可追踪 → 写明未覆盖区域、接受者和后续行动。

追问及应对

为什么不先枚举所有攻击者?

先定义组件、资产和数据流可减少范围漂移。攻击者模型仍可补充,但不能让对攻击者动机的猜测替代对系统边界和可验证控制的分析。

如何处理第三方脚本?

把脚本来源、加载流、可访问凭据和执行权限画入模型,定义来源约束、隔离和监控不变量;若由供应商负责,记录交接证据和残余风险。

什么时候把外部依赖升级为当前项目风险?

当依赖的安全假设直接影响当前资产或不变量,或项目无法验证依赖承诺时,就应列为当前风险并指定缓解或接受者,而不是留在脚注。

安全评审发现模型过于复杂怎么办?

保留覆盖主要风险的最小图,拆出协议或部署层的子模型,并通过组件 ID、流 ID 和链接保持可追溯;复杂度不能通过删除关键边界来降低。

如何向产品负责人解释残余风险?

用受影响资产、可能路径、当前控制、测试证据和业务影响说明,给出选项、成本、期限和明确接受者,不用“绝对安全”或不可验证的概率承诺。

公开来源

同类题目

相关面试工具

用 Solve 整理系统设计回答

从澄清需求开始,展开规模、架构、组件选择和取舍。

查看工具