现场测试状态:诊断已通过;上游方向待定。
这与合并后的补丁报告不同。
电子(Electron)案例产生了一个范围狭窄的草稿修复方案和一个聚焦的回归测试,但它并未按原样被合并。维护者审查提出了一个安全边界方面的担忧,因此在澄清电子(Electron)的预期行为之前,修复工作暂停。
尽管如此,这仍然是一次有用的现场测试。
有时,诊断性现场测试能验证补丁的有效性。
有时,它能验证边界问题。
这一次属于后者。
目标
仓库:electron/electron
议题:#48240
草稿拉取请求:#51991
议题标题:[24.1.0 回归] 非沙箱预加载脚本受内容安全策略限制,但仅在就绪状态变为交互态之后
公开拉取请求标题:修复:不要将页面内容安全策略应用于隔离的预加载代码生成
报告的故障
该议题报告了电子(Electron)预加载执行中的不一致行为。
在启用了上下文隔离且未使用沙箱的预加载脚本中,诸如 new Function(...) 这样的字符串代码生成可能在预加载执行的早期被允许,但在文档进入交互阶段后却被阻止。
这一点很重要,因为某些库只检测一次代码生成支持情况,缓存结果,然后在后续依赖该结果。
因此,故障不仅仅是“内容安全策略阻止了 eval”。
故障在于时间上的不一致性。
同一个预加载上下文似乎在执行开始时对代码生成问题给出一种答案,而在文档解析进展后给出另一种答案。
这是一种漂移型故障。
真相在上下文中间发生了改变。
为何这是一个边界问题
电子(Electron)同时处于多个世界之间:
铬内核(Chromium)页面行为。
电子(Electron)预加载行为。
启用节点(Node)的应用程序行为。
内容安全策略。
上下文隔离。
应用程序安全预期。
这使得边界变得重要。
诊断问题不仅仅是:
“是否应允许代码生成?”
更好的问题是:
“在隔离的预加载世界中,哪个策略拥有代码生成的控制权,并且该答案是否应在文档解析开始后发生改变?”
这就是边界所在。
页面有一个内容安全策略。
预加载脚本在由电子(Electron)管理的隔离世界中运行。
应用程序可能依赖于预加载行为。
安全模型可能依赖于页面内容安全策略的传递性应用。
如果这些所有权界限不明确,运行时可能会出现不一致。
这正是该议题所暴露的问题。
第一条修复路径
草稿修复方案测试了对边界的一种解释:
如果预加载脚本在电子(Electron)的隔离世界中运行,那么页面内容安全策略不应导致预加载字符串代码生成在文档解析开始后发生变化。
该补丁增加了对电子(Electron)隔离世界的检查,并将该情况绕过页面内容安全策略的代码生成回调,同时保持对主世界渲染器代码的页面内容安全策略强制执行。
它还为一个在限制性页面内容安全策略下的非沙箱、上下文隔离预加载添加了回归测试。该测试验证了在 DOMContentLoaded 事件前后,字符串代码生成始终保持一致地被允许。
这是一个范围狭窄的补丁。
更改了两个文件:
shell/common/node_bindings.cc
spec/chromium-spec.ts
聚焦的回归测试在本地通过。
维护者审查改变了修复路径
电子(Electron)维护者审查提出了关键担忧:
如果应用程序已经依赖页面内容安全策略作为防止 eval-l
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。