WebSocket 作为 HTML5 的新特性之一格外吸引着开发人员的注意,因为它的出现使得客户端(主要指浏览器)提供对 Socket 的支持成为可能,从而在客户端和服务器之间提供了一个基于单 TCP 连接的双向通道。对于实时性要求比较高的应用而言,譬如在线证券、在线游戏,以及不同设备之间信息同步。信息实时同步一直是技术难题,在 WebSocket 出现之前,常见解决方案一般就是轮询(Polling)和 Comet 技术,但这些技术增加了设计复杂度,也造成了网络和服务器的额外负担,在负载较大的情况下效率相对低下,导致应用的可伸缩行收到制约。对于此类应用的开发者来说,WebSocket 技术简直就是神兵利器,读者可以登陆 websocket.org 网站观看特色案例,以及它提供的 WebSocket 和 Comet 的性能对比分析报告。最近几年内 WebSocket 技术被开发人员广泛应用到各类实际应用中。
不幸的是,WebSocket 相关的安全漏洞也逐步被披露出来,其中最容易发生的就是跨站点 WebSocket 劫持漏洞。本文将深入浅出为读者介绍跨站点 WebSocket 漏洞的原理、检测方法和修复方法,希望能帮助广大读者在实际工作中避免这个已知安全漏洞。
WebSocket 协议握手和安全保障
为了便于阐述跨站点 WebSocket 劫持漏洞原理,本文将简单描述 WebSocket 协议的握手和切换过程。建议有兴趣的读者阅读 RFC 6455 规范,深入学习 WebSocket 协议。
跨站点 WebSocket 劫持漏洞原理
尽管 WebSocket 协议设计时充分考虑了安全保障机制,但随着 WebSocket 技术推广,安全工作者们慢慢还是发现了一些 WebSocket 相关的安全漏洞,譬如 Wireshark 的漏洞 CVE-2013-3562 (Wireshark 1.8.7 之前的 1.8.x