セキュリティ:Cookie 名のエンコードを削除
HTTP Cookie 標準では、Cookie の名前と値で特定の文字のみが許可されます。 許可されていない文字をサポートするため、ASP.NET Core は次のように動作します。
- 応答 Cookie の作成時にエンコードします。
- 要求 Cookie の読み取り時にデコードします。
ASP.NET Core 5.0 では、あるセキュリティ問題に対処するため、このエンコード動作が変更されました。
ディスカッションについては、GitHub イシュー dotnet/aspnetcore#23578 を参照してください。
導入されたバージョン
5.0 Preview 8
以前の動作
応答 Cookie 名がエンコードされます。 要求 Cookie 名がデコードされます。
新しい動作
Cookie 名のエンコードとデコードがなくなりました。 以前にサポートされていたバージョンの ASP.NET Core の場合、チームはその場でデコード問題を軽減することを計画します。 また、無効な Cookie 名で IResponseCookies.Append を呼び出すと、型 ArgumentException の例外がスローされます。 Cookie 値のエンコードとデコードは変更されていません。
変更理由
複数の Web フレームワークで問題が検出されました。 このエンコードとデコードでは、攻撃者は __%48ost-
のようなエンコード値で __Host-
のような予約済みプレフィックスになりすますことで Cookie プレフィックスと呼ばれているセキュリティ機能を迂回できます。 この攻撃では、Web サイトで、クロスサイト スクリプティング (XSS) の脆弱性など、なりすまし Cookie を挿入するため、第二のエクスプロイトが必要になります。 こうしたプレフィックスは既定で、ASP.NET Core や Microsoft.Owin
のライブラリまたはテンプレートでは使用されません。
推奨アクション
ASP.NET Core 5.0 以降にプロジェクトを移動する場合、Cookie 名がトークン仕様要件: コントロールと区切りを除く ASCII 文字 "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | <"> | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT
に準拠するようにします。 Cookie 名やその他の HTTP ヘッダーで ASCII 以外の文字を使用すると、サーバーから例外を引き起こしたり、クライアントによって不適切にラウンドトリップしたりします。
影響を受ける API
- HttpRequest.Cookies
- HttpResponse.Cookies
Microsoft.Owin.IOwinRequest.Cookies
Microsoft.Owin.IOwinResponse.Cookies
.NET