Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
同一オリジンポリシーとCORS
Search
carotene4035
July 29, 2018
1
770
同一オリジンポリシーとCORS
carotene4035
July 29, 2018
Tweet
Share
More Decks by carotene4035
See All by carotene4035
GraphQLのN+1問題を解決したい
carotene4035
1
190
読者を置き去りにする技術
carotene4035
13
8.1k
Aws is emotional.
carotene4035
2
270
名称未設定.pdf
carotene4035
0
200
migrationツールについて
carotene4035
0
77
AWSネットワーク入門
carotene4035
2
300
adtech history
carotene4035
0
66
ファイルアクセスに関する脆弱性
carotene4035
0
100
僕らだけのアニメを放映する
carotene4035
3
1.3k
Featured
See All Featured
Writing Fast Ruby
sferik
628
61k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
Six Lessons from altMBA
skipperchong
27
3.5k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Why Our Code Smells
bkeepers
PRO
335
57k
Making the Leap to Tech Lead
cromwellryan
133
9k
Optimizing for Happiness
mojombo
376
70k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
Transcript
徳丸本 輪読会 受動的攻撃と同一オリジンポリシー CORS かろてん@carotene
受動的攻撃 と 同一オリジンポリシー
あたまのわるいまとめ • いろんなこうげきほうほうがあるね – またないでこっちからいくやつ – わなをしかけてまつやつ
• どうすればこうげきをふせげるんだろうね – サーバ、ブラウザどっちもたいさくがいる • サーバがわはつぎのしょうで • ブラウザがわは「できることをせいげん」 – どういつオリジンポリシー
能動的攻撃と受動的攻撃 • 能動的攻撃
能動的攻撃と受動的攻撃 • 受動的攻撃(罠系) – 単純な受動的攻撃 – 正規サイトを悪用する受動的攻撃 – サイトをまたがった受動的攻撃
能動的攻撃と受動的攻撃 • 単純な受動的攻撃 – 罠を「自分が用意したサイト」に仕掛ける
能動的攻撃と受動的攻撃 • 正規サイトを悪用する受動的攻撃 – 罠を「正規サイト」に仕掛ける
能動的攻撃と受動的攻撃 • 正規サイトを悪用する受動的攻撃
能動的攻撃と受動的攻撃 • 正規サイトを悪用する受動的攻撃のメリット – 罠サイトに誘導しなくて良い → 楽 – 被害が拡大する可能性が高い →
楽 – 利用者の情報を得られる → いろいろできそう
能動的攻撃と受動的攻撃 • 正規サイトへの罠の仕込み方 – コンテンツ書き換え • FTPパスワード入手 •
Webサーバの脆弱性をつく • SQLインジェクション • クロスサイトスクリプティング脆弱性
能動的攻撃と受動的攻撃 • 事例 – Gumblar • ドライバダウンロードによってマルウェアを感染させ、 :pアカウントを送信させるなどした
能動的攻撃と受動的攻撃 • サイトをまたがった受動的攻撃
能動的攻撃と受動的攻撃 • サイトをまたがった受動的攻撃 • 正規サイトにログインしている利用者の アカウントを悪用した攻撃 • 正規サイトへリクエストを飛ばす際、
セッションクッキーを送るので、ログインしていれば ログインした状態で攻撃される
能動的攻撃と受動的攻撃 • サイトをまたがった受動的攻撃 • 例 – CSRF –
XSS – HTTPヘッダ・インジェクション 等
攻撃に対しては、 サーバとブラウザ両方で 対策しなくてはならない
ブラウザは どのように受動的攻撃を防ぐか
ブラウザでできることを 「制限」すれば良い
ブラウザの対策 • サンドボックスという考え方 • 同一オリジンポリシー – JavaScriptによるiframeアクセスの実験 – Iframeを悪用した罠の可能性
サンドボックスという考え方 • 「プログラムができることを制限する」 という考え方 – JavaScript, Javaアプレット, Flash Playerで
用いられている
サンドボックスという考え方 • 例えば、JavaScriptのサンドボックス – ローカルファイルへのアクセス禁止 – プリンタなどの資源の利用禁止 (画面表示はOK)
– ネットワークアクセスの制限 (同一オリジンポリシー)
同一オリジンポリシー • サンドボックスに用意された制限の1つ – クライアントスクリプトからサイトをまたがったアク セスを禁止する
同一オリジンポリシー
同一オリジンポリシー OK OK OK
同一オリジンポリシー
同一オリジンポリシー OK NG
同一オリジンポリシー • クライアントスクリプトからサイトをまたがった アクセスを禁止する場合がある
同一オリジンポリシー • なぜ必要なのか、Iframeを使った例で考える – Iframeの外側から内側の値を取得する例 外側
同一オリジンポリシー • iframe – 中 この値を取得する
同一オリジンポリシー • iframe -‐ 外 内側の値を取得する 内側のURL
同一オリジンポリシー • 内側のオリジン = 外側のオリジンの場合 外側 外:hMps://security-‐client-‐carotene.c9users.io 中:hMps://security-‐client-‐carotene.c9users.io
同一オリジンポリシー • 内側のオリジン = 外側のオリジンの場合 – 中の値を受け取れる
同一オリジンポリシー • 内側のオリジン ≠ 外側のオリジンの場合 外側 外:hMps://security-‐trap-‐carotene.c9users.io 中:hMps://security-‐client-‐carotene.c9users.io
同一オリジンポリシー • 内側のオリジン ≠ 外側のオリジンの場合 – 中の値を受け取れない
同一オリジンポリシー • もし、取得できてしまったら – 罠ページから、正規サイトの機密情報を得られ、 送信されてしまうかも 外側 外:罠ページ
中:正規サイトの機密情報
同一オリジンである条件
同一オリジンである条件 • 3条件 – URLのホストが一致している – スキーム(プロトコル)が一致している
– ポート番号が一致している • Cookieはスキームとポート関係ないから緩め • ただし、JavaScirptはディレクトリ関係ない
同一オリジンである条件 • 同一オリジンポリシーによる保護対象は iframeだけじゃない • 例えばXMLHMpRequestとか •
このあとでてくるよ
同一オリジンでも防げないやつ • XSS(クロスサイトスクリプティング攻撃) – Iframeの内側にJavaScriptを送り込んで実行する
[コラム]第三者のJavaScriptを許可 • サイト運営者が第三者を信頼して実行する – アクセス解析、バナー広告、ブログパーツなど • 実際には以下のような問題が発生している
– 提供元が意図的に個人情報を収集する – 提供元サーバに脆弱性があり、JSが差し替えられる – 提供元のJSに脆弱性があり、別のスクリプトが実行される
[コラム]第三者のJavaScriptを許可 • 提供元が信頼できるかどうかを調査すること が大事
[コラム]第三者のJavaScriptを許可 • 閲覧者が第三者を信頼して埋め込む JavaScript – Firefoxのグリースモンキーアドオン – 自分でスクリプトを自由に作成でき、また公開さ れているスクリプトを使うことができる
– 通常のJSよりも権限がつよいらしく、 怪しいスクリプトをinstallしないことが大事
JavaScript以外の クロスドメインアクセス
ほかのクロスドメインアクセス • <frame>, <iframe> • <img> • <script>
• <link type=‘text/stylesheet’> • <form ac^on=’’>
ほかのクロスドメインアクセス • <frame>, <iframe> – クロスドメインアクセスOK – ただしJavaScriptからクロスドメインのドキュメント にアクセスするのはだめ
ほかのクロスドメインアクセス • <img> – srcはクロスドメインの指定OK(そりゃそうじゃ) – 画像リクエストする時cookieもおくれる – 罠サイトに「認証の必要な画像」を表示すること ができる(?)
– JavaScriptからimgにアクセスする時(canvas等)は クロスドメインだとアクセスできない
ほかのクロスドメインアクセス • <script> – srcはクロスドメインの指定OK(そりゃそうじゃ:図) – ただし、特定の状況下において、 JSのソースコードが変化する事があるので注意
ほかのクロスドメインアクセス
ほかのクロスドメインアクセス • <css> – クロスドメイン読み込み可能(よく使う) • Link
• @import • addImport(JSのメソッド) – ただし、過去にCSSXSSという脆弱性がIEに存在した
ほかのクロスドメインアクセス • CSSXSS – Webブラウザが、CSSのつもりでHTMLなど異なる ファイルを呼んでしまう脆弱性を利用した攻撃 – 昔のIEはファイルの中に「 { 」が入っていればCSS
と認識してしまうらしい
ほかのクロスドメインアクセス • <form ac^on=“**”> – **はクロスドメインでも動作する – これを利用したのがCSRF(4.5節)
CORS
あたまのわるいまとめ • おりじんまたいでしゅとくすることもできるよ – しんぷるなリクエスト – しんぷるじゃないリクエスト – にんしょうじょうほうをおくるリクエスト
• どれもサーバがわのせっていがいるよ
CORSとは • Cross-‐Origin Resource Sharing • 越えられない壁(Originの壁)をこえる仕様 •
なんでもかんでも超えられるようにすると 危ないから仕様にしてる
シンプルなリクエストでCORS
シンプルなリクエストでCORS
シンプルなリクエストでCORS • クライアントはこんなかんじ
シンプルなリクエストでCORS • サーバはこんなかんじ
シンプルなリクエストでCORS • 結果:失敗 リクエストされたリソースには、Access-‐Control-‐Allow-‐Originヘッダがないって。 あと、Origin ‘hMps://~’からのアクセスは許可されてないってさ。
アクセスを許可する • 特定のOriginからのCORSアクセスを許可する
シンプルなリクエストでCORS • 結果:成功
シンプルなリクエスト #とは • 以下の3つの条件がある – メソッドの条件 – XMLHMpRequestオブジェクトで設定できるヘッダ の条件
– Content−Typeヘッダの条件
シンプルなリクエスト #とは • 以下の3つの条件がある – メソッドの条件 • GET
or HEAD or POST – XMLHMpRequestのヘッダの条件 – Content−Typeヘッダの条件
シンプルなリクエスト #とは • 以下の3つの条件がある – メソッドの条件 –
XMLHMpRequestのヘッダの条件 • Accept • Accept-‐Language • Content-‐Language • Content-‐Type – Content−Typeヘッダの条件
シンプルなリクエスト #とは • 以下の3つの条件がある – メソッドの条件 – XMLHMpRequestのヘッダの条件
– Content−Typeヘッダの条件 • applica^on/x-‐www-‐form-‐urlencoded • mul^part/form-‐data • text/plain
シンプルなリクエスト #とは • これらの条件は – HTMLフォームによる送信と比べて 過度にリスクが増加しない範囲で 条件が指定されている
プリフライトリクエストでCORS
プリフライトリクエスト • シンプルなリクエストの条件を満たさない場合、 pre-‐flight requestというHTTPリエクストを送信 • リクエストを投げる前
「このリクエスト、本当に送っていいっすか ね?」ってサーバに聞くためのリクエスト
プリフライトリクエスト • クライアント側ソース 「シンプルなリクエスト」の条件を 満たしていない
プリフライトリクエスト • サーバ側ソース
プリフライトリクエスト • 結果
プリフライトリクエスト XmlHMpRequestの前に、 プリフライトリクエストを送っている APIは左の2つに対して 「いっすよ」と応答する必要がある
プリフライトリクエスト これが「いっすよ」
プリフライトリクエスト • 結果 Postが送られた
プリフライトリクエスト • 結果 サーバはリクエストを送ることに対し て「いっすよ」とはいった レスポンスを返すとはいってない
プリフライトリクエスト POSTがきたときはこれで返す
プリフライトリクエスト • 結果
いっすか? いっすよ じゃおくりますね かえすわ
認証情報を含むリクエストでCORS
認証情報を含むリクエスト • クロスオリジンに対するリクエストの場合、 以下のリクエストヘッダは送信されない – HTTP認証 – Cookie (等、認証に用いられるもの)
認証情報を含むリクエスト • でも、送りたい時がある
認証情報を含むリクエスト • withCreden^alsを使って、cookieを送ろう
withCreden^alsを使わないとき • クライアントはこんなかんじ
withCreden^alsを使わないとき • サーバはこんなかんじ
withCreden^alsを使わないとき • 何度問い合わせても
withCreden^alsを使わないとき • ブラウザのcookieを見てみると PHP_SESSID的なやつがない
withCreden^alsを使わないとき • レスポンスヘッダを見てみると Set-‐cookieがある
withCreden^alsを使わないとき • つまり – サーバ側からはcookieをsetするように言ってる – でもブラウザがそうしないようにしている
withCreden^alsを使うとき • クライアントに1行ついか
withCreden^alsを使うとき • 失敗 リクエストがcreden^lasモードのときは、 レスポンスヘッダのAccess-‐Control-‐Allow-‐Creden^alsをtrueにしろっておこられた
withCreden^alsを使うとき • サーバに1行ついか
withCreden^alsを使わないとき • やったね!
まとめ • クッキーなど認証用のヘッダを伴う クロスオリジンアクセスは、 以下の両方を満たす必要がある –
XMLHMpRequestオブジェクトの withCreden^alsプロパティをtrueに – レスポンスヘッダに Access-‐Control-‐Allow-‐Creden^als: true