Strict-Transport-Security
HSTS
response header
TOFUモデル
初回は防げない
RFC 6797
https://tools.ietf.org/html/rfc6797
mdn
directives
併用可
下2つがoptionalという感じ
Strict-Transport-Security: max-age=n
Strict-Transport-Security: includeSubDomains
Strict-Transport-Security: preload
directiveを3つとも指定している例
code:response
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
63,072,000 s = 2 years
ここで2yearsが推奨されている
初回(未登録時)にHTTPでreqしたときの動き
https://gyazo.com/402799667b0a0348b0fa1619a0ef322b
① HTTPでrequest
このサイトがhttpとhttpsの両方を提供している時の話
clientは両方でアクセスする選択の自由がある
② HTTPでresponse
3XX
HTTPSで送って来るようにredirectさせる
③ HTTPSでrequest
④ HTTPSでreponse
Strict-Transport-Securityのheaderを付与するのはココ
②で付けるわけではない
Strict-Transport-Security headerはHTTPSで来たものにしか付けられない
An HSTS Host MUST NOT include the STS header field in HTTP responses conveyed over non-secure transport. ref
⑤ 以降のrequstはHTTPSを使うようになる
browserが制御する
上の手順だけでは、①②はhttp通信になってしまう
ここで中間者攻撃が可能
それを防ぐのがHSTS preload
初回からHSTSに登録済みとして扱われる
HSTS登録済みの状態でHTTPでreqしたときの動き
https://gyazo.com/2718aacef1174507f2c908c06bfd2ade
①② HTTPでrequest
browserが内部でredirectする
307 Internal Redirect
このHTTP reqは、serverには届かない
③ HTTPSでrequest
例 GitHubにhttpでrequestを送る
①②
https://gyazo.com/72bbd420221b7f8b152fadd924891bde
③
https://gyazo.com/effe709c444c98360b731dce30df844b
試しに、HTTPieで送ってみると
$ http http://github.com/mrsekut
HTTP/1.1 301 Moved Permanentlyが返ってきた
参考
/mrsekut-book-4908686106/157 (5.2.2 HSTS)
#WIP
何を解決するか?もともとどういう問題があるか?
HTTPとHTTPSの両方を提供しているwebサイトがあったとき
userが、httpで初回のアクセスすると脆弱になる
httpはresponseを改竄できる
初回で改竄すれば、その後の通信にも入り込むことができる
中間者攻撃ができる
Server側は、HTTPSでreqestしてくることを強制したい
HSTSを使うことでこれができる
次回以降のreqをHTTPSでやるようにbrowserに指示する
#??
この辺のヤバさを具体レベルで理解していない
どれぐらい容易に可能なのか、
どこからどこまでの情報を奪取できて、
どういった改竄が可能なのか
中間者攻撃を理解していないのが原因かなmrsekut.icon
hstsをしていない場合の問題
これがわかっていないとHSTSの必要性が理解できないmrsekut.icon
「普通に毎回redirectすればいいじゃん」になる
①client → server
http
②client ← server
301 redirect
https
ってことか
reqがhttpだが、resがhttpsになる
HTTPからHTTPSにリダイレクトされる途中で第三者により攻撃を受ける可能性がある ref
どういうこと #??
redirectをちゃんと理解していないのが原因
あと、中間者攻撃の具体的な手法がわかっていない
https://n-laboratory.jp/nlab/contentspage/enable-hsts/
サイトが謎で、2回アクセスしないとこのページ見れないmrsekut.icon
chrome://net-internals/#hsts
1.「chrome://net-internals/#hsts」にアクセス
2.「Query HSTS/PKP domain」の「Domain」テキストボックスにドメイン(e.g. foobar.com)を入力し、「Query」を押下
3.「Found」が表示されていればHSTSが有効になっています
https://n-laboratory.jp/nlab/contentspage/enable-hsts/
#??
なんでhttpとhttpsの両方を提供しているの?
最初からhttps一択だとなんか問題があるの?
この選択肢って誰の裁量で提供されているの?
serverの管理者?
なぜ、Strict-Transport-Security#6252f9491982700000f44ddaの②でHSTSを付けられないのか?
An HSTS Host MUST NOT include the STS header field in HTTP responses conveyed over non-secure transport.という制約が存在するのはなぜか?
https://security.stackexchange.com/questions/84714/why-does-rfc6797-say-an-hsts-host-must-not-include-the-sts-header-field-in-http
#??
CSP: upgrade-insecure-requests