Access-Control-Allow-Originを設定することのセキュリティリスクは何ですか?


124

最近、クロスサブドメインのajax呼び出しを行うことができるように設定Access-Control-Allow-Originする*必要がありました。
今、私は自分の環境をセキュリティリスクにさらしていると感じざるを得ません。
私がそれを間違えているなら助けてください。

回答:


69

で応答することによりAccess-Control-Allow-Origin: *、要求されたリソースはすべてのオリジンとの共有を許可します。これは基本的に、どのCORS応答も実装していなかった場合、XHRリクエストをサイトに送信してサーバーの応答にアクセスできることを意味します。

そのため、どのサイトでも、訪問者に代わってサイトにリクエストを送信し、その応答を処理できます。ブラウザーによって自動的に提供されるもの(Cookie、Cookieベースのセッションなど)に基づく認証または承認スキームのようなものを実装している場合、サードパーティのサイトによってトリガーされるリクエストもそれらを使用します。

これは確かに、特に選択したリソースだけでなくすべてのリソースに対してリソース共有を許可する場合に、セキュリティ上のリスクをもたらします。このコンテキストでは、いつCORSを有効にしても安全ですか?


2
共有認証アクセスがセキュリティリスクをもたらす方法の具体例を示すことができる場合は、これに賛成します。
Petrus Theron 2013

1
@ガンボ静的コンテンツはどうですか?(例:JavaScript、CSS、静的HTMLなどの静的CDNコンテンツ)Access-Control-Allow-Origin: *それらを設定することでセキュリティ上の問題はありますか?noginはありません、それらは誰にでも公開されますか?
Umut Benzer 2013年

2
@UmutBenzer大丈夫です。
ガンボ2013年

25
実際、現在のCORS標準によれば、この回答は正しくありません。「資格情報をサポートするリソースには文字列 '*'を使用できません。」したがって、Cookie、キャッシュされたHTTP認証、またはクライアントSSL証明書の形式で一時認証を使用するように要求を強制することはできません。ただし、Webサイトが認証にローカルストレージを使用する場合などは問題になります。
Niklas B.

2
@NiklasB:私はこのシナリオを試しましたが、Chromeはあなたが述べたようにCORS標準に従います。つまり、文字列 " "は、認証情報リクエストではサポートされていません。Chromeが報告する内容は次のとおりです。「XMLHttpRequestはlocalhost:12346 / helloを読み込めません。資格情報フラグがtrueの場合、ワイルドカード ' 'を 'Access-Control-Allow-Origin'ヘッダーで使用できません。オリジン ' localhost:12345 'したがって、アクセスは許可されません。XMLHttpRequestの資格情報モードは、withCredentials属性によって制御されます。
factotum

37

Access-Control-Allow-Origin: *リソースに標準の資格情報(Cookie、基本認証、TLSクライアント証明書)以外のもので保護されたプライベートデータが含まれていない限り、リソースに追加しても完全に安全です。

例:Cookieで保護されたデータは安全です

想像してみてくださいhttps://example.com/users-private-data。ユーザーのログイン状態によってはプライベートデータが公開される可能性があります。この状態はセッションCookieを使用します。それはだ、安全追加するAccess-Control-Allow-Origin: *要求は、クッキーなしで行われている場合は、このヘッダにのみ応答へのアクセスを可能にするように、このリソースに、そしてクッキーはプライベートなデータを取得するために必要とされます。その結果、個人情報が漏洩することはありません。

例:場所/ IP /内部ネットワークで保護されたデータは安全ではありません(残念ながらイントラネットや家電では一般的です):

想像してくださいhttps://intranet.example.com/company-private-data。これは、会社のプライベートデータを公開しますが、会社のWi-Fiネットワークを使用している場合にのみアクセスできます。このリソースは標準の資格情報以外のものを使用して保護されているため、このリソースに追加するのは安全ではありませんAccess-Control-Allow-Origin: *。さもなければ、悪いスクリプトがイントラネットへのトンネルとしてあなたを使うかもしれません。

経験則

シークレットウィンドウでリソースにアクセスした場合にユーザーに表示される画像を想像してみてください。このコンテンツ(ブラウザが受け取ったソースコードを含む)をすべての人に見て満足している場合は、追加しても安全Access-Control-Allow-Origin: *です。


「Cookieなしのリクエストのみを許可するため」は「Cookie付きのリクエストのみを許可するため」であるべきですか?
DJCordhose

3
@DJCordhoseいいえ。Cookie なしのAccess-Control-Allow-Origin: *リクエストのみを許可します。少しわかりやすくするために、回答を編集しました。
JaffaTheCake

「*」とこのヘッダーがないケースの違いは何ですか?同じですか?
Nigrimmist

「そうでなければ、悪いスクリプトがあなたをイントラネットへのトンネルとして使用する可能性がある」とさらに説明できたら嬉しいです。
Sam Rueby

@Nigrimmistその後、プリフライトリクエストは失敗し、リソースアクセスはブロックされます
iamareebjamal

9

AFAIK、Access-Control-Allow-Originは、サーバーからブラウザーに送信される単なるhttpヘッダーです。特定のアドレスに制限(または無効化)しても、ロボットなどのサイトの安全性は向上しません。ロボットが望むなら、彼らはヘッダーを無視することができます。通常のブラウザー(Explorer、Chromeなど)は、デフォルトでヘッダーを受け入れます。しかし、Postmanのようなアプリケーションは単にそれを無視します。

サーバー側は、応答を返すときに、要求の「起点」が何であるかを実際には確認しません。httpヘッダーを追加するだけです。アクセス制御ヘッダーを読み取ってそれに基づいて動作することを決定するのは、リクエストを送信したブラウザー(クライアント側)です。XHRの場合、最初にヘッダーを要求するために特別な「OPTIONS」リクエストを使用する場合があることに注意してください。

したがって、創造的なスクリプト作成機能を持つ人は、ヘッダーに設定されているものは何でも、ヘッダー全体を簡単に無視できます。

Access-Control-Allow-Originの設定で起こり得るセキュリティの問題も参照してください。


今実際に質問に答えるために

私は自分の環境をセキュリティリスクにさらしていると感じざるを得ません。

誰かがあなたを攻撃したい場合、彼らは簡単にAccess-Control-Allow-Originをバイパスできます。しかし、「*」を有効にすることで、HTTPヘッダーを尊重する通常のWebブラウザーを使用するなど、攻撃者にさらにいくつかの「攻撃ベクトル」を与えることができます。


6
不注意なエンドユーザーの視点からこれを見てください。誰かがJavaScriptを挿入して実際のサイトと悪意のあるサイトの間でデータをやり取りする悪意のあるWebページを設定することができます(パスワードを盗もうとしているとしましょう)。エンドユーザーのWebブラウザーは通常、このクロスサイト通信をブロックしますが、Access-Control-Allow-Originが設定されている場合は許可され、エンドユーザーは賢くなりません。
Brain2000 14

3
はい、Access-Control-Allow-Origin *スクリプトをホストしてパスワードを盗む悪意のあるWebサイトに設定することは強くお勧めしません:-)
commonpike 14

6
@commonpike正解ですが、誰かがスクリプトを作成して、ヘッダーを完全に無視することができます。データにアクセスできる場合は、CORSヘッダーの有無にかかわらずアクセスできます。あなたが考慮していない別の攻撃ベクトルがあります。銀行のWebサイトにログインするとします。別のページに移動してから銀行に戻ると、Cookieが原因でまだログインしています。インターネット上の他のユーザーは私と同じように私の銀行で同じURLにアクセスできますが、Cookieがないと私のアカウントにアクセスできません。クロスオリジンリクエストが許可されている場合、悪意のあるWebサイトが事実上偽装する可能性があります...
Brad

5
@commonpike ...ユーザー。別の言い方をすれば、私のサイトにアクセスするだけかもしれません(通常のサイトで、疑わしいものは何もない...たぶん、それはハイジャックされただけの本当のサイトです)。私の口座への資金。銀行は、そのページからの要求と他のページからの要求の違いを知りません。どちらにも、リクエストを成功させるためのCookieがあります。
ブラッド、

3
@commonpikeより一般的な例を挙げましょう...常に発生する例です。Linksys WRT54gなどの一般的なホームルーターがあるとします。ルーターがクロスオリジンリクエストを許可するとします。私のWebページのスクリプトは、一般的なルーターのIPアドレス(など192.168.1.1)にHTTPリクエストを送信し、攻撃を許可するようにルーターを再構成できます。ルーターを直接DDoSノードとして使用することもできます。(ほとんどのルーターには、pingまたは単純なHTTPサーバーチェックを可能にするテストページがあります。これらはまとめて悪用される可能性があります。)
Brad

7

ワイルドカードが本当に問題である場合、コメントとして投稿された2つの例を次に示します。

銀行のWebサイトにログインするとします。別のページに移動してから銀行に戻ると、Cookieが原因でまだログインしています。インターネット上の他のユーザーは私と同じように私の銀行で同じURLにアクセスできますが、Cookieがないと私のアカウントにアクセスできません。クロスオリジンリクエストが許可されている場合、悪意のあるWebサイトがユーザーになりすますことができます。

ブラッド

Linksys WRT54gなどの一般的なホームルーターがあるとします。ルーターがクロスオリジンリクエストを許可するとします。私のWebページのスクリプトは、一般的なルーターのIPアドレス(192.168.1.1など)にHTTP要求を送信し、攻撃を許可するようにルーターを再構成できます。ルーターを直接DDoSノードとして使用することもできます。(ほとんどのルーターには、pingまたは単純なHTTPサーバーチェックを可能にするテストページがあります。これらはまとめて悪用される可能性があります。)

ブラッド

これらのコメントは実際の例で問題を説明しているので、これらのコメントは答えである必要があると思います。


8
ただし、これは機能しません。「文字列 '*'は、資格情報をサポートするリソースには使用できません。」w3.org/TR/cors/#resource-requests
2017年

@bayotop認証を必要とするページと、ヘッダーに他のデータがあるページを、ブラウザーはどのように区別しますか?
wedstrom 2017

提供されたリンクを読んだ後、この目的で使用される「サポート資格情報フラグ」があります。これは手動で設定されているようです。おそらく誰かがCORSを正しく設定する方法を知らなかった場合、このフラグも間違って取得する可能性があるため、上記の脆弱性が考えられます。
wedstrom 2017

2
@wedstromフラグは、リクエストを出した人によって設定されます。とにかく、上記のシナリオはCSRF攻撃の例です。「*」のオリジンを許可しても、すでに脆弱になります(まれなケースですが)。ほとんどの場合、フォームを使用して悪意のあるクロスサイトリクエストを行うことができるため、CORSは問題になりません。AJAXリクエストを実行する必要がある場合は、プリフライトリクエストが邪魔になります(これは、ACAO: '*'およびAccess-Control-Allow-Credentials: 'true'のときにブラウザーが入るポイントです)。
バヨ2017

0

サーバーがヘッダーの下に設定することでCORSを完全に無効にしようとするシナリオ。

  • Access-Control-Allow-Origin:*(サーバーが任意のORIGINからのクロスサイト要求を受け入れることをブラウザーに通知します)

  • Access-Control-Allow-Credentials:true(クロスサイト要求がCookieを送信できることをブラウザーに通知します)

ブラウザに実装されているフェイルセーフにより、以下のエラーが発生します

"Credential is not supported if the CORS header ‘Access-Control-Allow-Origin’ is ‘*’"

したがって、ほとんどのシナリオでは、「Access-Control-Allow-Origin」を *に設定しても問題ありません。ただし、攻撃から保護するために、サーバーは許可されたオリジンのリストを維持でき、サーバーがクロスオリジン要求を受信するたびに、許可されたオリジンのリストに対してORIGINヘッダーを検証し、Access-Control-Allow-Originで同じメッセージをエコーバックできます。ヘッダ。

ORIGINヘッダーはブラウザーで実行されているJavaScriptによって変更できないため、悪意のあるサイトはスプーフィングできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.