kazuk は null に触れてしまった

C# / .NET 系技術ネタ縛りでお送りしております

タグアーカイブ: HTTP.sys

MS10-070 をインストールすると携帯向けのURL セッションが通らない


表題のとおりなんですが、皆さまご注意ください。

この現象は URL セッションで使われるセッションキーが URL 中に埋め込まれる時に MS10-070での暗号化方式の変更により IIS の下回りで動いているカーネルモードHTTPハンドラ(HTTP.sys)でのURLの規制値に引っかかってしまう事で発生します。

通常、携帯向けで URL session を使うと URL は以下の構造を持ちます。

http:// ホスト.ドメイン / セッションキー / サイト内URL

このセッションキーはご覧の通りで / に挟まれる区間ですので、その長さは KB 820129 IIS 用の Http.sys レジストリ設定 で解説されている UrlSegmentMaxLength によって最大長が制限されます。そして、この長さを超える場合には bad request となります。

HTTP.sys によってリクエストが不正として扱われる為、基本的に IIS W3C Log にも出力されず(Bad RequestなんだからMulformed Requestの可能性もあり、ログに出す項目のどこまで信頼できるか解らない&そもそもIISにリクエストが渡されないからIISログに乗り様がない)、アプリケーションをいっくら疑ってもその手前で弾き飛ばされるので厄介で、IISログや、イベントログをベースにエラー監視しているとすりぬけます(弊社のお客様サイトにおいて、数日間携帯での買い物ができない状態というのに気付かなかった罠、もうしわけございません。)

んで、UrlSegmentMaxLength がいくつなら引っかからないのさって事になると思いますが、弊社実績値で MS10-070適用以前に226バイトのキーが MS10-070の適用で 296バイトに伸びたという事で、少なくとも70バイト程度は増加すると言えます。むやみに大きな値を指定するとカーネルモードにデカイバッファを持っていかれたり、通常の制限値に依存してる他の何かがバッファオーバーフロー攻撃にさらされる危険も考えられるので無意味に大きな値を設定する事はお勧めできませんが、通常運用では既定値260の倍で520もあれば十分ではないでしょうか。

なお、この設定値の変更後はシステムの再起動が必要となります。IISの再起動ではカーネルモード HTTP.sys の再ロードおよび設定の再読み込みはされないっぽいです。

という訳で、携帯系で利用される Web サイトを開発、運用されている皆さま、ご注意ください。

追記:

この blog の内容は弊社で起こった問題事象を MS サポートに問い合わせ解決に至るまでの結果を元に弊社内での事象を含めて記述させて頂いております。
MSサポートの迅速な対応に感謝すると共に、経緯結果についての公開を承諾頂いた事に感謝します。

広告