セキュリティ: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