WebSocketに同一生成元ポリシーがないのはなぜですか?なぜws:// localhostに接続できるのですか?


84

アプリケーションのプロセス間通信にWebSocketを使用したい(Daemon <-> WebGUIおよびDaemon <-> FatClientなど)。テスト中に、websocket.org(http://www.websocket.org/echo.html)のJavaScript WebSocketクライアントを介してローカルで実行されているWebソケットサーバー(ws:// localhost:1234)に接続しようとしました。

私の質問は今です:
なぜこれが可能ですか?ブラウザ(ここでは:LinuxのFF29)にクロスオリジンポリシーが実装されていませんか?

websocket.orgが悪かった場合、ローカルWSサーバーと通信して、ローカルホストから受信したすべてのメッセージを他のサーバーにリダイレクトしようとする可能性があるため、私は尋ねています。

ローカルWebSocketサーバーブラウザ邪悪なWebサーバー
ws:// localhost:1234、http://evil.tld
        | | |
        | | ------ [GET /] ---------> |
        | | <----- [HTML + EvilJS] ---- |
        | <------ [connect ws:// ..] ---- | |
        | <---- [いくつかのコミュニケーション]-> | |
        | | ---- [邪悪な前進] ----> |
        | | |

ユースケース全体をテストしたわけではありませんが、websocket.orgによって提供されるJSからws:// localhostへの接続は確実に機能します。


2
websocket.orgは悪であってはならず、Webソケットは悪になる可能性があります;)
kuldeep.kamboj 2014年

回答:


51

「なぜ?」に対処するため 部分的には、ブラウザーがAJAX呼び出しではなくWebSocketに同一生成元ポリシー(CORSは緩和)を適用しない理由は、クロスオリジンリクエストの値が確立された後にWebSocketが導入されたためです。そもそもSOPの対象ではないため、CORSクライアント側チェックの歴史的な理由は当てはまりません。

AJAXの場合、包括的な単一生成元ポリシーの時代には、サーバーは認証されたブラウザーが別のドメインからリクエストを送信することを期待していなかったため1、リクエストが信頼できる場所からのものであることを確認する必要はありませんでした2。セッションCookie。CORSのような後の緩和策では、この仮定に違反することで既存のアプリケーションが悪用されるのを防ぐために、クライアント側のチェックを行う必要がありました(効果的にCSRF攻撃を実行します)。

私たちが今知っていることを知って、今日Webが発明されていたとしたら、AJAXにはSOPもCORSも必要なく、すべての検証がサーバーに任せられる可能性があります。

新しいテクノロジーであるWebSocketは、最初からクロスドメインシナリオをサポートするように設計されています。サーバーロジックを作成する人は誰でも、クロスオリジンリクエストの可能性を認識し、CORSのようなブラウザ側の手間のかかる予防策を必要とせずに、必要な検証を実行する必要があります。


1これは単純化です。リソース(<img>、<link>、<script>タグを含む)に対するクロスオリジンGETリクエストとフォーム送信POSTリクエストは、Webの基本機能として常に許可されていました。現在、リクエストが同じプロパティを持つクロスオリジンAJAX呼び出しも許可されており、単純なクロスオリジンリクエストと呼ばれています。ただし、サーバーのCORSヘッダーで明示的に許可されていない限り、コード内のそのようなリクエストから返されたデータにアクセスすることは許可されていません。また、サーバーが悪意のあるWebサイトから自身を保護するためにアンチCSRFトークンが必要な主な理由は、これらの「単純な」POSTリクエストです。

2実際、Refererオープンリダイレクトの脆弱性を使用するなどしてヘッダーがスプーフィングされる可能性があるため、リクエストソースをチェックする安全な方法も利用できませんでした。これは、CSRFの脆弱性が当時どのように理解されていなかったかを示しています。


6
これは確かに質問に答えるので、+ 1します。しかし、記録のために、私はこの推論に強く反対します。この設計上の決定の結果として、WebSocketを使用するかなりの数のサイトがOriginヘッダーの検証に失敗し、その結果、プライベートユーザーデータがサードパーティのサイトに漏洩すると予測しています。Access-Control-Allow-OriginWeb上の他のクロスオリジンHTTPリクエストへの応答へのJSアクセスを許可する前と同様に、ヘッダーをチェックするクライアントは、このクラス全体の攻撃(クロスサイトWebSocketハイジャック)を防ぐ簡単な方法でした。今では遅すぎます。
ajedi32 2018年

3
私は同意する傾向があります。設計変更は基本的にホワイトリストベースのアプローチからブラックリストアプローチに移行しているため、リスクが伴います。フェアポイント。
staafl 2018年

42

oberstetは質問に答えました。ありがとうございました!残念ながら、コメントだったので「正解」とは言えません。ブラウザは、アプリケーションで確認できる「origin」ヘッダーを送信します。

Javaの場合[1]:

@オーバーライド
public void onOpen(WebSocket clientSocket、ClientHandshakeハンドシェイク){
    String clientOrigin = handshake.getFieldValue( "origin");

    if(clientOrigin == null ||!clientOrigin.equals(WEBSOCKET_ALLOWED_ORIGIN_HEADER)){
        logger.log(Level.WARNING、 "クライアントが正しいオリジンヘッダーを送信しませんでした:" + clientOrigin);        

        clientSocket.close();
        戻る;
    }

    //..。
}

[1] https://github.com/TooTallNate/Java-WebSocketを使用する


OWASPは、CSRFチートシートのOrigin(および場合によってはReferer)ヘッダーを最初の最も重要なステップとしてチェックすることに言及していますが、さらに一歩進んでCSRF固有の防御を実装することも推奨しています。WebSocketの場合、これはXSRF偽造防止トークンをクエリパラメーターとしてWS URIに追加し、オリジンチェック後にサーバー側で検証している可能性があります。
Kevin Secrist 2018年

18

WebSocketはドメイン間通信を行うことができ、SOP(同一生成元ポリシー)によって制限されません。

あなたが説明したのと同じセキュリティの問題は、WebSocketなしで発生する可能性があります。

邪悪なJSは次のことができます。

  • evil.tldへのURLを使用してスクリプト/画像タグを作成し、クエリ文字列にデータを入力します。
  • フォームタグを作成し、フィールドにデータを入力して、フォームの「送信」アクションを呼び出し、HTTP POSTを実行します。これは、クロスドメインにすることができます。AJAXはSOPによって制限されますが、通常のHTTPPOSTは制限されません。XSRFWebセキュリティの問題を確認してください。

何かがページにjavascriptを挿入したり、悪意のあるjavascriptを取得したりすると、セキュリティはすでに破られています。


1
私は邪悪なJSについて心配していません。私はこれが常に可能であることを知っています。私が本当に心配しているのは、ブラウザーのブレイクアウトです。これで、どのWebサイトもローカルにバインドされたWSソケットと通信し、そこからデータを盗むことができます。
binwiederhier 2014年

53
SOP / CORSはWebSocketには適用されませんが、ブラウザーはorigin、WebSocket接続を開いたJSでHTMLを提供したサーバーのホスト名を含むヘッダーを送信します。WebSocketサーバーは、をチェックすることでアクセスを制限できますorigin
oberstet 2014年

これは質問に答えません。問題は、別のドメインのWebページ がローカルWebSocketにアクセスできる理由でした。OPシナリオでは、「ページにJavaScriptを挿入する」ものは何もありません。これは別のシナリオです。WebSocketがないと、リモートWebページはローカルホスト上のリソースを読み取ることができません。これはまさにSOPが防止しているためです。
sleske
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.