题 WebSocket框架中的掩码是什么?


我正在开发一个websocket实现,不知道一个框架中的掩码是什么意思。

有人可以解释一下它的作用以及推荐的原因吗?

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-------+-+-------------+-------------------------------+
 |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
 |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
 |N|V|V|V|       |S|             |   (if payload len==126/127)   |
 | |1|2|3|       |K|             |                               |
 +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 |     Extended payload length continued, if payload len == 127  |
 + - - - - - - - - - - - - - - - +-------------------------------+
 |                               |Masking-key, if MASK set to 1  |
 +-------------------------------+-------------------------------+
 | Masking-key (continued)       |          Payload Data         |
 +-------------------------------- - - - - - - - - - - - - - - - +
 :                     Payload Data continued ...                :
 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
 |                     Payload Data continued ...                |
 +---------------------------------------------------------------+

44
2018-01-05 17:07


起源




答案:


Websockets在RFC6455中定义,其中包含 第5.3节

掩蔽键的不可预测性是      对于防止恶意应用程序的作者选择至关重要      线上出现的字节。

在一个 关于Websockets的博客文章 我找到了以下解释:

掩码密钥(32位):如果掩码位已设置(并且信任我,如果你为服务器端编写),你可以在这里读取无符号字节,用于与有效载荷进行对比。 它用于确保来自客户端的攻击者不会滥用糟糕的代理

但是我发现的最清楚的答案 邮件列表存档。约翰坦普林说:

基本上,WebSockets的独特之处在于您需要保护网络   基础设施,即使你在客户端运行恶意代码,也是完整的   对服务器的恶意控制,唯一值得信赖的是   客户浏览器。 通过让浏览器为每个浏览器生成随机掩码   框架,恶意客户端代码无法选择出现的字节模式   在线上并使用它来攻击易受攻击的网络基础设施

正如kmkaplan所说,攻击向量在中描述 第10.3节 的RFC。
这是一种防止代理缓存中毒攻击的措施(参见 关于袭击的论文)。 它的作用是创造一些随机性。您必须使用随机屏蔽键对有效负载进行异或。

顺便说一下:不仅仅是推荐。它是 必修


50
2018-01-05 17:30



谢谢你的回答。但是,滥用代理仍然无法解开框架吗? - bodokaiser
解释本身 是 在RFC 6455第10.3节中。对基础设施的攻击(掩蔽) - kmkaplan
我仍然完全不知道这种掩蔽技术试图阻止什么。如果我知道代理容易受到某个字节序列的影响,我可以实现自己的TCP服务器和客户端来利用它。 - pwuertz
@pwuertz:但是你不能通过在页面上包含恶意JavaScript来导致在不幸的用户机器上发生这种情况,是吗? - Ashe
这有点荒谬 - 任何“真正的”黑客都不会试图通过编写在浏览器中运行的Javascript代码来执行缓存中毒攻击。使用非浏览器WebSocket库并修改它以使用固定的屏蔽密钥非常简单,从而使您的代码能够通过线路发送您想要的任何字节(只需使用屏蔽密钥对字节进行预先异或,然后libary会将它反正到你想要的任何东西上。)虽然任何“真正的”代理都应该意识到连接使用WebSocket框架,并且不应该尝试将数据解析为其他任何东西。 - Luke Hutchison


本文

需要屏蔽从客户端到服务器的WebSocket流量,因为恶意代码不太可能导致某些损坏的代理执行错误操作并将其用作某种攻击。没有人证明这可能实际发生,但由于它可能发生的事实足以让浏览器供应商变得抽搐,因此增加了屏蔽以消除它被用作攻击的可能性。

因此,假设攻击者能够同时破坏在浏览器和后端服务器中执行的JavaScript代码,屏蔽旨在防止在这两个端点之间发送的字节序列以特殊方式制作,可能会破坏任何损坏的代理在这两个端点之间(通过破坏,这意味着代理可能会尝试将websocket流解释为HTTP,而事实上它们不应该)。

浏览器(而不是浏览器中的JavaScript代码)对用于发送消息的随机生成的掩码有最终决定权,这就是为什么攻击者不可能知道代理可能看到的最终字节流是什么。

请注意,如果WebSocket流已加密(应该是),则掩码是冗余的。 文章 来自Python's Flask的作者:

为什么要掩盖呢?因为很明显有足够的基础架构可以让升级标头通过,然后将其余的连接作为第二个HTTP请求处理,然后将其填入缓存。我对此没有任何言论。在任何情况下,对此的防御基本上是一个强大的32位随机数作为掩蔽密钥。或者你知道......使用TLS而不使用shitty代理。


10
2017-08-29 20:22