起因

前一段时间在工作中意外发现,CORS 并不适用于 Websocket 链接。
具体表现为,浏览器会忽略在websocket upgrade handshake过程中,所返回的 CORS 头。
比起类似的 CSRF 来说,感觉比较冷门,遂成文记录一下。

原因

WebSocket 标准中,选择了由服务端来全权处理连接是否应该断开的逻辑,浏览器会自动带上用户所拥有的对应域下 Cookie。
类似于 CSRF,但在 Websocket 世界中称之为 Cross-Site WebSocket Hijacking (CSWSH)

相关标准:https://tools.ietf.org/html/rfc6455#section-4.2.2

由此引发的问题

在流行的 Python-EngineIO 框架中,服务端依赖 CORS 来拒绝非法来源的 websocket 链接,显然该行为无法正确的拒绝连接
可能引发信息泄露,或服务器保持大量无效连接导致资源耗尽的问题。(CVE-2019-13611)

链接:https://github.com/miguelgrinberg/python-engineio/issues/128

标签: none

添加新评论