0x00 背景
前两天苹果通过全新的“后台安全改进”功能推送了一个webkit漏洞的补丁CVE-2026-20643,漏洞描述:
A cross-origin issue in the Navigation API was addressed with improved input validation.
WebKit Bugzilla: 306050
CVE-2026-20643: Thomas Espach
既然是webkit,那岂不是可以去GitHub commit记录里捞补丁了,于是就去webkit的commit记录里找(瞎猜)了一下。
0x01 关于Navigation API
简单来说,Navigation API 是 Web 平台为了解决 单页应用(SPA)路由管理 痛点而推出的“现代版”浏览器历史记录与导航管理接口。
在它出现之前,我们一直在忍受复杂的 window.history 和 popstate 事件。到了 2026 年,Navigation API 已经正式成为主流浏览器的“基准特性”(Baseline),彻底改变了前端路由的写法。
其中,chrome最早支持,大概在2022年,而safari和Firefox分别是2026年初和2025年底正式提供了支持,版本号如下:

来源:https://developer.mozilla.org/en-US/docs/Web/API/Navigation#browser_compatibility
0x02 漏洞分析
既然是Navigation API,同时又提到了cross-origin issue,那搜索的目标大概就能围绕navigation/canIntercept之类的关键词了,大概搜了一下GitHub,就发现了这个commit记录:
NavigationEvent#canIntercept is true when navigating to a different port
意思是canIntercept的实现没有严格按照whatwg文档的描述:
If targetURL and documentURL differ in their scheme, username, password, host, or port components, then return false.
相同域名不同端口的地址canIntercept也返回了true,从而导致了像从localhost:3000 到localhost:3001 这样不同端口的跳转event也可以被Navigation API拦截,符合公告里的cross-origin描述。
修改的代码是Source/WebCore/page/Navigation.cpp ,增加了对上面几个参数的验证:
1 | // https://html.spec.whatwg.org/multipage/nav-history-apis.html#can-have-its-url-rewritten |
同时commit记录里也给了测试用例navigate-event-canintercept-cross-port.html,直接把html和js依赖下载放到本地server,用safari打开页面测试就行了。
试了下已打了补丁的iPhone打开的结果:

没打补丁的:

做了一个去除测试框架js的精简版验证poc,这样看起来更直观一点:
https://www.flvin.com/CVE-2026-20643/
1 |
|
如果页面和console里显示event.canIntercept: true说明存在漏洞。
0x03 后记
打补丁的方式参照苹果的文档:https://support.apple.com/zh-cn/102657
如果没有自动安装可以手动选择安装。
今天突然想起去GitHub上搜一下这个CVE,然后发现苹果刚发补丁的那天就有大佬靠逆向扒出补丁了orz:https://github.com/zeroxjf/WebKit-NavigationAPI-SOP-Bypass

看来猜对了。