/
290.txt
303 lines (232 loc) · 15.2 KB
/
290.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
[4] [DFN[[[HSTS]]]] ([DFN[HTTP Strict Transport Security]]) は、
素の [[HTTP]] を用いず、専ら [[HTTPS]] のみを用いることを [[Webサーバー]]から
[[Webブラウザー]]に伝達するための仕組みです。
[5] 2010年代になって [[Webブラウザー]]に実装されると共に、 [DFN[[[RFC 6797]]]]
として出版されています。
* 仕様書
[REFS[
- [3] [CITE@en[RFC 6797 - HTTP Strict Transport Security (HSTS)]] ([TIME[2014-06-02 05:16:10 +09:00]] 版) <http://tools.ietf.org/html/rfc6797>
]REFS]
* 概要
[44] [[HTTPS]] によって(のみ)提供される [[Webサーバー]]では、 [[HSTS]]
を使うことにより、もし [CODE(URI)@en[[[http:]]]] [[URL]] で当該[[サーバー]]の[[資源]]が参照されていたとしても、
[CODE(URI)@en[[[https:]]]] [[URL]] に読み替えてアクセスするよう [[Webブラウザー]]に要請することができます。
[45] これにより、意図せず素の [[HTTP]] によって接続され、
[[利用者]]が [[MIIM]] 攻撃などの被害を受けることを防止できます。
* 脅威モデル
[6] [[HSTS]] は、次のような脅威に対処することを想定しています [SRC[>>3 2.]]。
[FIG(list)[
- [7] ネットワーク上の受動的な攻撃。例えば[[無線LAN]]で[[パケット]]を盗聴して[[セッションID]]
を盗むなど。
- [8] ネットワーク上の能動的な攻撃。[[DNS]] や[[アクセスポイント]]を汚染するなど。
- [9] [[Webサイト]]の実装上の不備。一部のファイルだけ [[HTTPS]] でなくてもアクセスできてしまうなど。
]FIG]
[10] こうした問題は [[HTTPS]] ([[HTTP]] over [[TLS]]) で解決できるとされていますが、
[[HTTP]] と [[HTTPS]] の両方が提供されていると [[HTTP]] 側が脆弱なままになってしまいます。
[[サーバー]]側が[[HTTP]] を提供していなくても、攻撃者が偽の [[HTTP]]
[[サーバー]]を用意してそこにアクセスさせることが原理的に可能です。
[[HSTS]] は [[HTTPS]] のみ提供し、 [[HTTP]] は提供しないことを明確にすることで、
こうした問題を回避しようとしています。
[11] [[フィッシング]]の防止や不正なソフトウェアや [[Webブラウザー]]の不具合による問題は、
[[HSTS]] の対象外です [SRC[>>3 2.]]。
* ヘッダー
[14] 次の[[HTTPヘッダー]]が定義されています。
[FIG(short list)[
- [CODE(HTTP)@en[[[Strict-Transport-Security:]]]] ([[応答ヘッダー]])
]FIG]
* [CODE(HTTP)@en[Strict-Transport-Security:]] ヘッダー (HTTP)
[18] [[HTTP]] の [DFN[[CODE(HTTP)@en[[[Strict-Transport-Security:]]]]]]
[[応答ヘッダー]] (通称 [DFN[[[STS]]]]) は、
当該[[ホスト]]に関する[[HSTSポリシー]]を示すものです [SRC[>>3 6.1.]]。
** 意味
[21] [[利用者エージェント]]がこの[[ヘッダー]]を含む[[応答]]を送った[[ホスト]]に関する[[HSTSポリシー]]を適用しなければ[['''ならない''']]ことを表します
[SRC[>>3 6.1.]]。
** 文脈
[34] [[安全な輸送路]]上の [[HTTP]] にあっては、[[応答メッセージ]]に
[CODE(HTTP)@en[[[Strict-Transport-Security:]]]] [[ヘッダー]]を含める[['''べきです''']]。
これは複数あっては[['''なりません''']]。 [SRC[>>3 7.1.]]
;; [35] [[キャッシュ]]や[[負荷分散]]の仕組みなどの都合で一様に付加することが難しいこともあるため、
[['''必須''']]ではなく[['''推奨''']]となっています [SRC[>>3 7.1.]]。
[36] [[安全でない輸送路]]上の [[HTTP]] にあっては、[[応答メッセージ]]に
[CODE(HTTP)@en[[[Strict-Transport-Security:]]]] [[ヘッダー]]を含めては[['''なりません''']]。
[SRC[>>3 7.2.]]
** 構文
[22] [[STS]] [[ヘッダー]]の値は、[[指令]] ([[directive]])
の零個以上の列です。[[指令]]同士は [CODE[[[;]]]] で区切ります。
その前後には [[LWS]] も挿入できます。
[[指令]]同士の順序は意味を持ちません。 [SRC[>>3 6.1.]]
;; [23] 完全に空になることや、[CODE[[[;]]]] が先頭や末尾に来ることや、
[CODE[[[;]]]] が連続することも認められています。
[FIG(railroad)[
= ?
== [[指令]]
== *
=== [[OWS]]
=== [CODE(HTTP)[[[;]]]]
=== [[OWS]]
=== [[指令]]
]FIG]
[24] [[指令]]は名前と値で構成され、両者は [CODE[[[=]]]] で区切ります。
[CODE[[[=]]]] と値を省略することもできます。 [CODE[[[=]]]] の前後には [[LWS]]
も挿入できます。 [SRC[>>3 6.1.]]
[25] 名前は [[RFC 2616]] [[字句]]です。
[[大文字・小文字不区別]]です。 [SRC[>>3 6.1.]]
;; [28] [[字句]]は [[ASCII文字]]なので、[[ASCII大文字・小文字不区別]]です。
[27] 同じ名前の[[指令]]を複数含めては[['''なりません''']]。 [SRC[>>3 6.1.]]
[26] 値は [[RFC 2616]] の[[字句]]または[[引用文字列]]です。
[SRC[>>3 6.1.]]
[FIG(railroad)[
= [[字句]]
= [CODE(HTTP)[[[=]]]]
= |
== [[字句]]
== [[引用文字列]]
]FIG]
[29] [[利用者エージェント]]は、この構文に適合しない[[ヘッダー]]を無視しなければ[['''なりません''']]。
[SRC[>>3 6.1.]]
[30] [[利用者エージェント]]は、認識できない[[指令]]を無視し、
認識できる[[指令]]を処理しなければ[['''なりません''']]。 [SRC[>>3 6.1.]]
* 指令
[32] [CODE(HTTP)@en[[[Strict-Transport-Policy:]]]] [[ヘッダー]]には次の[[指令]]があります。
[FIG(short list)[
- [CODE(HTTP)@en[[[max-age]]]] [SRC[>>3 6.1.1.]]
- [CODE(HTTP)@en[[[includeSubDomains]]]] [SRC[>>3 6.1.2.]]
- [CODE(HTTP)@en[[[preload]]]]
]FIG]
[31] 追加の[[指令]]が必要になった時には [[IETF Review]] を経て追加する
[[IANA登録簿]]が用意されることとされています。 [SRC[>>3 6.1.]]
現時点では[[IANA登録簿]]は存在しません。
[33] [CODE(HTTP)@en[[[max-age]]]] は[['''必須''']]です。
* サーバーの処理
[303] [[サーバー]]は、[[安全な輸送路]]で[[要求]]を受け取った時は、
[CODE(HTTP)@en[[[Strict-Transport-Security:]]]] [[ヘッダー]]を送るべきです。
[37] [[サーバー]]は、[[安全でない輸送路]]で[[要求]]を受け取った時は、
[CODE(HTTP)[[[301]]]] などの永続的な[[リダイレクト]]を表す[[応答メッセージ]]を返す[['''べきです''']]。
この時 [CODE(HTTP)@en[[[Location:]]]] [[ヘッダー]]には、元の[[実効要求URL]]
の [[URL scheme]] を [CODE(URI)@en[[[https:]]]] に変えたものか、
その他何らかの方法で決めた [CODE(URI)@en[[[https:]]]] [[URL]]
を指定したものとする[['''べきです''']]。 [SRC[>>3 7.2.]]
;; [302] [['''必須''']]でなく[['''推奨''']]であるのは、サーバー側の構成上の都合でそう設定できない場合があり得ることや、
[[リダイレクト]]の存在によって攻撃の危険性が生じることを避けたい場合を考慮しているようです。
[SRC[>>3 7.2.]]
;; [46] 一旦 [[Webブラウザー]]が [[HSTS]] を受信すると、 ([[既知HSTSホスト]]である間は)
その[[サーバー]]に素の [[HTTP]] で接続することはできなくなります。
ですから、 [[HSTS]] を使う場合には、素の [[HTTP]] の[[サーバー]]は [[HTTPS]]
に[[リダイレクト]]する以外の機能を提供しても意味がありません。
* 利用者エージェントの処理
[304] [[利用者エージェント]]は[[応答メッセージ]]の
[CODE(HTTP)@en[[[Strict-Transport-Security:]]]] [[ヘッダー]]を次のようにしなければなりません
[SRC[>>3 8.1., >>8.4.]]。
[FIG(steps)[
= [305] [[安全でない輸送路]]なら、無視します。
= [308] [[安全な輸送路]]に関する[[誤り]]や[[警告]]があれば、無視します。
= [306] 複数の[[ヘッダー]]があれば、最初のもののみを処理し、他は無視します。
= [307] 構文的に正しくなければ、無視します。
= [312] [[合同一致]]する[[既知HSTSホスト]]を探します。
=- [313] 見つかれば、
=-- [311] [CODE(HTTP)@en[[[max-age]]]] が[[零]]なら、この[[既知HSTSホスト]]の情報を削除します。
=-- [310] それ以外なら、 [CODE(HTTP)@en[[[max-age]]]] や
[CODE(HTTP)@en[[[includeSubDomains]]]] の情報を更新します。
=- [314] 見つからなければ、
=-- [315] [[ホスト]]が[[IPアドレス]]で指定されたものなら、何もしません。
=-- [309] そうでなければ、新たに[[既知HSTSホスト]]とします。
]FIG]
;; [445] [CODE(HTTP)@en[[[Strict-Transport-Security:]]]] [[ヘッダー]]が指定されていないからといって[[既知HSTSホスト]]から削除してはいけません。
[316] [[利用者エージェント]]は [CODE(URI)@en[[[http:]]]] [[URL]]
によって [[HTTP]] [[要求]]を行う前に次のように処理します [SRC[>>3 8.3.]]。
[FIG(steps)[
= [317] [[URL]] に[[ホスト]]が含まれていなければ、一致する[[既知HSTSホスト]]はありません。
= [318] [[URL]] の[[ホスト]]が[[IPアドレス]]なら、一致する[[既知HSTSホスト]]はありません。
= [319] それ以外で[[ホスト]]が[[ドメイン名]]な場合で、
[[既知HSTSホストドメイン一致]]により、
[[合同一致]]する[[既知HSTSホスト]]が存在するか、
[[超ドメイン一致]]する[[既知HSTSホスト]]が存在してその
[CODE(HTTP)@en[[[includeSubDomains]]]] [[指令]]が指定されている場合には、
次のように [[URL]] を書き換えます。
=- [320] [[URL scheme]] を [CODE(URI)@en[[[https:]]]] とします。
=- [321] [[ポート]]が明示されていて [[80]] なら、 [[443]] とします。
]FIG]
;; [446] この書き換え処理は [[Fetch Standard]] が定義する [[fetch]]
[[アルゴリズム]]から参照されています。
[444] [[利用者エージェント]]は、 [[既知HSTSホスト]]に[[接続]]する際に、
[[安全な輸送路]]の[[誤り]]や[[警告]]があれば、[[接続]]を終端しなければ[['''なりません''']]
[SRC[>>3 8.3.]]。
* セキュリティー
[39] [[Webブラウザー]]は、[[HSTSスーパークッキー]]脆弱性に注意が必要です。
* 歴史
[REFS[
- [20] [CITE[ForceHTTPS]] ([TIME[2014-06-06 14:25:14 +09:00]] 版) <https://crypto.stanford.edu/forcehttps/>
- [19] [CITE@en[fyi: Strict Transport Security specification]]
([[Hodges, Jeff]] 著, [TIME[2009-09-19 07:21:05 +09:00]] 版)
<http://lists.w3.org/Archives/Public/public-webapps/2009JulSep/1160.html>
- [17] [CITE[Chromium Blog: Security in Depth: New Security Features]]
( ([TIME[2012-11-17 12:03:40 +09:00]] 版))
<http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html>
- [13] [CITE@en-US[Firefox 4: HTTP Strict Transport Security (force HTTPS) ✩ Mozilla Hacks – the Web developer blog]]
( ([TIME[2011-04-24 12:29:35 +09:00]] 版))
<http://hacks.mozilla.org/2010/08/firefox-4-http-strict-transport-security-force-https/>
- [12] [CITE@en[draft-hodges-strict-transport-sec - HTTP Strict Transport Security (HSTS)]]
<http://tools.ietf.org/html/draft-hodges-strict-transport-sec>
- [16] [CITE@en[draft-ietf-websec-strict-transport-sec-14 - HTTP Strict Transport Security (HSTS)]]
( ([TIME[2012-10-04 06:12:04 +09:00]] 版))
<http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14>
]REFS]
** Fetch との統合
[REFS[
- [1] [CITE[Call out HSTS. https://www.w3.org/Bugs/Public/show_bug.cgi?id=22645 · d64282d · whatwg/fetch]]
( ([TIME[2013-11-15 08:34:35 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/d64282df7f5ca668f79b3f8d2cdbb99cae303476>
- [2] [CITE[Make HSTS text more detailed per https://www.w3.org/Bugs/Public/show_bug... · 6ae0b8e · whatwg/fetch]]
( ([TIME[2014-06-05 12:00:21 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/6ae0b8e2bbf7362396eb697203753d09cfca6ea0>
]REFS]
[448] [CITE@en[Re: Redirects and HSTS]]
( ([[Anne van Kesteren]] 著, [TIME[2014-09-26 21:11:35 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-webappsec/2014Sep/0110.html>
[38] [CITE@en[Fix the order of CSP, HSTS, Mixed Content, and Referrer https://www.w3.o... · b8c2c49 · whatwg/fetch]]
([TIME[2015-01-28 18:20:37 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/b8c2c4964c233cd3616042c04e2c14e0ff25485d>
** Web Sockets への適用
[449] [CITE@en[664284 – Add HSTS support for websockets]]
( ([TIME[2014-12-11 11:50:38 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=664284>
[450] [CITE@en[''''''[''''''chrome'''''']'''''' Revision 82069]]
( ([TIME[2014-12-11 11:51:03 +09:00]] 版))
<http://src.chromium.org/viewvc/chrome?revision=82069&view=revision>
[451] [CITE@en[Bug 27554 – After the WebSocket object is returned we should probably integrate with HSTS. For Fetch that happen ''''''[''''''...'''''']'''''']]
( ([TIME[2014-12-11 11:51:13 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=27554>
** HSTS スーパークッキー問題
[452] [CITE@en[RadicalResearch HSTS Super Cookies]]
( ([TIME[2015-01-08 12:25:38 +09:00]] 版))
<http://www.radicalresearch.co.uk/lab/hstssupercookies/>
[453] [CITE[Issue 104935 - chromium - Security: HSTS "cookies" do not obey expected policy. - An open-source project to help move the web forward. - Google Project Hosting]]
( ([TIME[2015-01-08 12:25:59 +09:00]] 版))
<https://code.google.com/p/chromium/issues/detail?id=104935>
[454] [CITE[Issue 258667 - chromium - HSTS pins and HSTS metadata stored even when cookies are rejected - An open-source project to help move the web forward. - Google Project Hosting]]
( ([TIME[2015-01-08 12:26:08 +09:00]] 版))
<https://code.google.com/p/chromium/issues/detail?id=258667>
[455] [CITE[Chrome Fixes STS Privacy Issue ha.ckers.org web application security lab]]
( ([TIME[2015-01-08 12:26:25 +09:00]] 版))
<http://ha.ckers.org/blog/20100413/chrome-fixes-sts-privacy-issue/>
* 実装
[REFS[
- [15] [CITE@ja[HTTP Strict Transport Security - Security | MDN]]
( ([TIME[2012-08-04 21:26:55 +09:00]] 版))
<https://developer.mozilla.org/ja/docs/Security/HTTP_Strict_Transport_Security>
]REFS]
[447] [CITE[HSTS Preload Submission]]
( ([TIME[2014-09-16 03:36:42 +09:00]] 版))
<https://hstspreload.appspot.com/>
[40] [CITE@en[UPGRADE: Relation to HSTS. · df9adb8 · w3c/webappsec]]
([TIME[2015-02-13 13:56:15 +09:00]] 版)
<https://github.com/w3c/webappsec/commit/df9adb8910b1b09b72dce5cc999b3b725fbcd4f3>
[41] [CITE@en-US[Preloading HSTS | Mozilla Security Blog]]
([TIME[2015-03-11 18:32:56 +09:00]] 版)
<https://blog.mozilla.org/security/2012/11/01/preloading-hsts/>
[42] [CITE@en[''''''[''''''chrome'''''']'''''' Contents of /trunk/src/net/http/transport_security_state_static.json]]
([TIME[2015-03-11 18:33:29 +09:00]] 版)
<https://src.chromium.org/viewvc/chrome/trunk/src/net/http/transport_security_state_static.json>
[43] [CITE@en[HTTP Strict Transport Security comes to Internet Explorer - IEBlog - Site Home - MSDN Blogs]]
([TIME[2015-03-11 18:36:00 +09:00]] 版)
<http://blogs.msdn.com/b/ie/archive/2015/02/16/http-strict-transport-security-comes-to-internet-explorer.aspx>