Strict-Transport-Security
response header
初回は防げない
directives
併用可
下2つがoptionalという感じ
directiveを3つとも指定している例
responseStrict-Transport-Security: max-age=63072000; includeSubDomains; preload
63,072,000 s = 2 years
初回(未登録時)にHTTPでreqしたときの動き
① 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に登録済みとして扱われる
HSTS登録済みの状態でHTTPでreqしたときの動き
①② HTTPでrequest
browserが内部でredirectする
このHTTP reqは、serverには届かない
③ HTTPSでrequest
例 GitHubにhttpでrequestを送る
①②
③
試しに、HTTPieで送ってみると
$ http http://github.com/mrsekut
HTTP/1.1 301 Moved Permanently
が返ってきた
参考
何を解決するか?もともとどういう問題があるか?
HTTPとHTTPSの両方を提供しているwebサイトがあったとき
userが、httpで初回のアクセスすると脆弱になる
httpはresponseを改竄できる
初回で改竄すれば、その後の通信にも入り込むことができる
Server側は、HTTPSでreqestしてくることを強制したい
HSTSを使うことでこれができる
次回以降のreqをHTTPSでやるようにbrowserに指示する
この辺のヤバさを具体レベルで理解していない
どれぐらい容易に可能なのか、
どこからどこまでの情報を奪取できて、
どういった改竄が可能なのか
hstsをしていない場合の問題
これがわかっていないとHSTSの必要性が理解できない

「普通に毎回redirectすればいいじゃん」になる
①client → server
http
②client ← server
301 redirect
https
ってことか
reqがhttpだが、resがhttpsになる
>HTTPからHTTPSにリダイレクトされる途中で第三者により攻撃を受ける可能性がある ref
redirectをちゃんと理解していないのが原因
あと、中間者攻撃の具体的な手法がわかっていない
サイトが謎で、2回アクセスしないとこのページ見れない

chrome://net-internals/#hsts
>1.「chrome://net-internals/#hsts」にアクセス
> 2.「Query HSTS/PKP domain」の「Domain」テキストボックスにドメイン(e.g. foobar.com)を入力し、「Query」を押下
> 3.「Found」が表示されていればHSTSが有効になっています
なんでhttpとhttpsの両方を提供しているの?
最初からhttps一択だとなんか問題があるの?
この選択肢って誰の裁量で提供されているの?
serverの管理者?
An HSTS Host MUST NOT include the STS header field in HTTP responses conveyed over non-secure transport.
という制約が存在するのはなぜか?