1. ホーム
  2. tcp

WebSocketフレーム内のマスクとは何ですか?

2023-11-05 20:39:15

質問

ウェブソケットの実装に取り組んでいますが、フレーム内のマスクの意味がわかりません。

誰か、それが何をするのか、なぜそれが推奨されるのかを説明していただけませんか?

  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 ...                |
 +---------------------------------------------------------------+

どのように解決するのですか?

WebsocketはRFC6455で定義されており、その中で次のように述べられています。 セクション5.3 :

マスキング・キーの予測不可能性は 悪意のあるアプリケーションの作者が、電線に表示されるバイトを選択できないようにするために不可欠です。 を選択することを防ぐために不可欠です。

での ブログのエントリで という説明を見つけました。

masking-key (32 bits): マスクビットが設定されている場合(サーバー側で書いていればそうなります)、ここでペイロードのxorに使われる符号なしバイトを読み込むことができます。 これは、くだらないプロキシがクライアント側からの攻撃者によって悪用されないようにするために使用されます。 .

しかし、私が見つけた最も明確な答えは メーリングリストアーカイブ . そこではJohn Tamplinがこう述べています。

基本的に、WebSocket は、クライアントで敵対的なコードが実行されていても、ネットワークとインフラを保護する必要があるという点でユニークです。 クライアントで敵対的なコードが実行され、サーバーが完全に敵対的に制御されたとしても、ネットワーク インフラストラクチャを保護する必要があるという点でWebSocketはユニークです。 サーバーを完全に敵対的に制御し、信頼できるのはクライアント ブラウザだけである場合でも、ネットワーク インフラストラクチャを保護する必要があるという点で、WebSocket はユニークです。 クライアントブラウザです。 ブラウザがフレームごとにランダムなマスクを生成することで、敵対的なクライアントコードは フレームごとにランダムなマスクを生成させることで、敵対的なクライアントコードは、ワイヤー上に現れるバイトパターンを選択できず それを使って脆弱なネットワーク インフラストラクチャを攻撃することはできません。 .

kmkaplan が述べているように、攻撃ベクトルは セクション 10.3 に記載されています。

これは、プロキシキャッシュポイズニング攻撃を防ぐための対策で 1 . これは、いくつかのランダム性を作成することです。ペイロードをランダムなマスキングキーとXORする必要があります。

ところで。これは単に推奨されているわけではありません。それは 義務です。 .

1: 参照 Huang, Lin-Shung, et al. "Talking to yourself for fun and profit." Proceedings of W2SP (2011)