开发者不了解 CORS 现状
从事全栈咨询工作能让人与不同公司、不同技能水平的开发者合作,从而了解大家面临的难题。近期常见问题是,太多 Web 开发者不了解跨域资源共享(Cross - Origin Resource Sharing,CORS)的工作原理。
Zoom 漏洞案例分析
鉴于近期 Zoom 出现的漏洞,此问题显得尤为及时。安全研究员乔纳森·莱奇舒发现,Zoom 在机器上有一个监听 `http://localhost:19421` 的 Web 服务器,加载 Zoom 链接时,Zoom 网站会向本地 Web 服务器发送请求以打开原生 Zoom 应用。文章提到该页面从本地运行的 Zoom Web 服务器加载图片,以图片尺寸编码返回数据是为了绕过跨域资源共享(CORS),但实际上 Chrome 会遵守本地 Web 服务器的 CORS 标头。
这表明 Zoom 可能急于推出功能却不了解 CORS,采用图片技巧绕过 CORS 让 Zoom 面临巨大安全漏洞,因为其他网站也能触发原生客户端操作并获取响应。
Zoom 功能安全实现方式
监听 `localhost:19421` 的 Web 服务器应实现一个 REST API,并设置 `Access - Control - Allow - Origin` 标头,值为 `https://zoom.us`,确保只有在 zoom.us 域名上运行的 JavaScript 才能与本地 Web 服务器通信。此外,zoom.us 应设置内容安全策略标头,阻止在 iframe 中渲染,防止页面在后台自动打开 Zoom 会议。
不过,仍存在漏洞,即任何页面可将浏览器重定向到意想不到的 zoom.us 会议链接,但这是 Zoom 在用户体验方面的决策。良好用户体验设计原则是软件具有可预测性,而 Zoom 打破了这一预期,谷歌会议在这方面做得较好。
对绕过 CORS 做法的探讨
不能确定 Zoom 采用现有实现方式是否因为不了解 CORS,虽有观点认为 Firefox 可能阻止从安全源到非安全源的 XHR 请求,但源是本地主机时 Firefox 支持这种请求,且原生应用可生成唯一自签名证书或使用浏览器扩展,所以这不是忘记过滤源的合理理由。
开发者普遍问题及思考
不只是 Zoom,很多开发者不太了解 CORS 工作原理,Stack Overflow 上有大量相关问题,相关页面推荐的默认设置可能让应用面临安全风险,其他厂商也存在相同安全漏洞。
开发者绕过同源策略可能让代码正常运行,但会面临问题。有经验和新手开发者都会对 CORS 感到困惑,是 CORS API 太复杂,还是需要对开发者进行更好的教育,目前情况不太乐观。