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
760
同一オリジンポリシーとCORS
carotene4035
July 29, 2018
Tweet
Share
More Decks by carotene4035
See All by carotene4035
GraphQLのN+1問題を解決したい
carotene4035
1
180
読者を置き去りにする技術
carotene4035
13
8.1k
Aws is emotional.
carotene4035
2
270
名称未設定.pdf
carotene4035
0
200
migrationツールについて
carotene4035
0
75
AWSネットワーク入門
carotene4035
2
300
adtech history
carotene4035
0
63
ファイルアクセスに関する脆弱性
carotene4035
0
100
僕らだけのアニメを放映する
carotene4035
3
1.3k
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
65
11k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Code Reviewing Like a Champion
maltzj
520
39k
Optimising Largest Contentful Paint
csswizardry
33
2.9k
Done Done
chrislema
181
16k
Code Review Best Practice
trishagee
64
17k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
Fireside Chat
paigeccino
33
3k
StorybookのUI Testing Handbookを読んだ
zakiyama
26
5.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