-
Notifications
You must be signed in to change notification settings - Fork 44
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
WebSocket协议中Masking Key有什么用? #47
Comments
兄弟,「针对基础设施的攻击」这段能表述得更详细一点吗?或者给一下你阅读的资料来源?感觉没太理解。。 |
嗯, 好, 在我看来, 意思就是利用 WebSocket 在 客户端浏览器 构造出 HTTP 请求格式的帧, 因为都是基于 TCP 之上的, 经过缓存服务器时, 这些服务器有可能就把这个帧作为 HTTP 请求来对待, 存在潜在的安全隐患. (mask 这里就是防止你构造出预想的数据格式(HTTP 报文), 以便缓存服务器能够 pass 这些伪造的 HTTP 报文). 原文在这里: https://tools.ietf.org/html/rfc6455#section-10.3 |
感谢答复 😺 那即是说,是因为这些缓存服务器并没有适配 WebSocket 的场景,才导致的问题?如果缓存服务器的实现更科学,是不是就不存在这种情况了? |
看下这里的解释,更加方便你们的理解.楼主说的我也没看懂,看了这个明白了 |
http://www.infoq.com/cn/articles/deep-in-websocket-protocol |
简单的说吧:
|
|
我觉得你对这个问题的理解似乎错了。 |
这么说吧,其实这个涉及到代理本身的工作原理。
对于请求 HTTPS 的情况下,一般客户端是这么请求的
在这种情况下,后续所有传输的信息都是加密信息,每个客户端都是不一样的。也就是说代理服务器看到的内容也是不一样的,即不存在缓存的问题。 另外一种情况是代理服务器直接转发 HTTPS 请求,这种情况我不大确定具体是怎么个协商法,但是确定无疑客户端失去了协商 SSL 协议的能力。只在特殊情况下才适用。 |
简单的发表一下个人的见解。
|
回来再看还是不太明白,作者提到:
不明白为何攻击者就无法获知网络链路上传输的数据了,攻击者只要建立一个钓鱼网站,则他在服务端不是依然可以获取到全部数据吗? 然后还有就是:
能举个例子说明一下,如果mask是可预测或者固定的话,攻击者会怎么利用这个来实施攻击? 实施污染攻击的原理是攻击者的服务端返回了一些毒数据,这些非法数据被proxy缓存之后具有毒性。感觉增加mask并不能阻止攻击者的服务端返回毒数据。不知道我哪里理解错了。 |
哦我明白了!
|
我还是不明白,攻击者当然知道mask的值,mask是客户端产生的,只要攻击者自己实现一个客户端,就可以构造自己想要的数据在网络上传送了。这时如果服务器返回了类似http响应的帧,缓存就被毒化了。 |
这是机智的面试官问的第三个问题~
我当时回答的比较含糊,因为毕竟一个网络协议的内容如此之复杂,之前也并没有过于关注掩码这东西究竟起什么作用。出于被自己熟悉领域难住的羞愧,面试后立马去翻看RFC,找到好长一大段的描述。
由于目前网络上还没有关于WebSocet各方面介绍与考量十分详尽的文章(当然英文版的RFC除外),这里我说一下那个神奇的Masking Key是做什么的吧。
首先不要把它与IP网络中的子网掩码弄混,绝壁不是一个概念,后者是用来划分子网的, 而前者是考虑到网络安全问题而设计的。
WebSocket协议规范里讲:“为了避免迷惑网络中介(如代理服务器),以及涉及到安全问题,客户端必须mask所有送给服务器的frame。”
不明白怎么回事?没关系,在此之前先了解下网络上针对基础设施的攻击,然后才能明白掩码的设计道理。
针对基础设施的攻击
通过WebSocket协议成为被攻击对象的,除了终端设备之外还有其他部分的web基础设施,比如代理服务器就可能成为攻击的对象。
随着websocket协议被开发出来,一项针对代理服务器的攻击(污染那些广泛部署的缓存代理服务器)实验也开始进行。
一般形式的攻击是跟被攻击者控制的服务器建立连接,并构造一个类似WebSocket握手一样的UPGRADE请求,随后通过UPGRADE建立的连接发送看起来就像GET请求的frame去获取一个已知资源(在攻击场景中可能是一个点击跟踪脚本或广告服务网络中的资源)。
之后远程服务器会返回某些东西,就像对于这个伪造GET请求的响应,并且这个响应会被很多广泛部署的网络中间设备缓存,从而达到了污染缓存服务器的目的。对于这个攻击的产生的效应,可能一个用户被诱导访问受攻击者操控的服务器,攻击者就有可能污染这个用户以及其他共享相同缓存服务用户的缓存服务器,并跨域执行恶意脚本,破坏web安全模型。
应对措施——掩码
为了避免面这种针对中间设备的攻击,以非HTTP标准的frame作为用户数据的前缀是没有说服力的,因为不太可能彻底发现并检测每个非标准的frame是否能够被非HTTP标准的中间设施识别并略过,也不清楚这些frame数据是否对中间设施的行为产生错误的影响。
对此,WebSocket的防御措施是mask所有从客户端发往服务器的数据,这样恶意脚本(攻击者)就没法获知网络链路上传输的数据是以何种形式呈现的,所以他没法构造可以被中间设施误解为HTTP请求的frame。
这就是掩码存在的原因。
继续安全性探究——如何选择掩码?
本来到这里就该结束了, 但是协议很负责的深入说明了掩码选择上的要求~
客户端必须为发送的每一个frame选择新的掩码,要求是这个掩码无法被提供数据的终端应用(即客户端)预测。
算法的选择上,为了保证随机性,可以借助密码学中的随机数生成器生成每个掩码。
倘若使用相同的掩码会有什么后果呢?
假设每次发送frame使用了相同的掩码或下一个掩码如何选择被猜出的话,攻击者就可以发送经过mask后类似HTTP请求的frame(做法很简单:攻击者以希望在网络链路上显示的形式构造数据,然后用下一个掩码mask再发出去)。
至于如何用掩码mask原始数据,在前面的 学习WebSocket协议—从顶层到底层的实现原理(修订版) 中已经说过了——按位做循环异或运算.
除此之外,另一个要求是一旦传输开始,客户端必须不准再修改传输的内容,否则攻击者将会发送一个用已知数据(如全0)初始化的frame,并通过第一部分数据的回执(经过mask的数据)计算本次使用的掩码,然后修改将要发送的frame使之mask后表现的是一个HTTP请求,原理同前面所讲,不再赘述。
什么数据需要Mask?
上面所描述的安全模型重点关注的是客户端发送类HTTP请求的frame给服务器,所以仅仅需要mask从客户端到服务器的数据,反之则没有mask,但是为了完成请求,前提是客户端必须能够伪造请求。因此,并不强制要求mask双向通信,只要保证一方的数据是经过mask的即可。
遗留问题
尽管掩码提供了保护,但不符合规定的HTTP代理服务器仍是那些“不使用掩码的客户端-服务器”攻击对象!
总结
所有内容归结为一句话:为防止攻击者获知网络链路中传输的原始数据,提供不可预测的掩码至关重要。
The text was updated successfully, but these errors were encountered: