Asp.Net ViewStateのセキュリティ

いつの間にかViewStateのセキュリティを調べてた。
えーと確か。。。
1.受信フィルタパターンを読んでて、HttpApplicationにAuthenticateRequestとAuthorizeRequestというイベントが出てきた。

2.AuthenticateRequestとAuthorizeRequestがいつ発生するのかよくわからない。

3.ASP.NETの認証回りをしらないからわかんないんだろうと判断。

4.認証を調べだす。

5.どこかで迷路に迷い込む。

6.ViewStateのセキュリティについてまとた。←いまココ

4と5の間に何があったのやら。

ViewStateには改ざん対策としてSHA1ハッシュ値チェックサムとして付加されている。
下記の鍵付きハッシュを使っていない場合、シリアライズされたデータがBase64になってるだけだし、ハッシュ値は誰でも計算できるので安全ではない。

安全対策 その1 鍵付きハッシュにする(MAC エンコーディング) たぶんデフォルトはここ。
サーバ上に保存された秘密鍵をデータにつけてハッシュを計算する
改ざんの検知はできるけど、再送攻撃(同じデータを送ってしまう)、データの解読はできる。

各ページのPageディレクティブのEnableViewStateMacをtrueに、もしくはweb.configの
configuration/system.web/pages/@enableViewStateMac
をtrueにすると有効になる。

安全対策 その2 ViewStateの暗号化
viewstateを暗号化する。
デフォルトで使用される秘密鍵はサーバごとに異なるため、webファーム構成にするなら各ノードの秘密鍵をそろえておくこと。
そうしなければ他のサーバにポストバックしたときにセキュリティエラーとなってしまう。

web.configの
configuration/system.web/machineKey/@validation
で暗号化アルゴリズムを指定

configuration/system.web/machineKey/@validationKey
で暗号化のキーを指定

http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp03/entwebapp03_04.html

また、各ページのPageディレクティブのViewStateEncryptionMode、もしくはweb.configの
configuration/system.web/pages/@viewStateEncryptionMode
で暗号化のモードを選択する。
*Pageディレクティブの設定はweb.configの設定をOverrideする。
Always:ビューステートを常に暗号化します。
Auto:コントロールが要求した場合に、ビューステートを暗号化します。
Never:コントロールが要求した場合でも、ビューステートを暗号化しません。

安全対策 その3 ユーザ固有情報の付加
http://msdn2.microsoft.com/ja-jp/library/ms178199(VS.80).aspx
http://www.microsoft.com/japan/msdn/net/aspnet/securitybarriers.aspx#securitybarriers_topic2
暗号化しても再送攻撃、ワンクリック攻撃には弱い。
ハッシュ計算、暗号化をしても、データの書き換え、読み込みはできないが、そのデータが誰のものであるかは認識できない。
このため、
あるユーザ向けに出力されたviewStateを別のユーザがサーバに再送した場合、正常なViewStateと認識されてしまう。
ViewStateUserKeyにユーザ固有情報(ログイン名、セッションID)を含めることでこれを回避できる。
Page_InitメソッドでViewStateUserKeyにユーザ固有情報を設定すれば、viewstateの復元時に、asp.net
ViewStateとViewStateUserKeyのつき合わせをやって、ずれていれば例外にしてくれる。

void Page_Init (object sender, EventArgs e) {
ViewStateUserKey = Session.SessionID;
}

としておくだけでいい。(たぶん)

規定値
●EnableViewStateMac
@Pageディレクティブ:false
http://msdn2.microsoft.com/ja-jp/library/950xf363(VS.80).aspx

web.config:true
http://msdn2.microsoft.com/ja-jp/library/system.web.ui.page.enableviewstatemac.aspx

●configuration/system.web/machineKey/@validation
web.config:SHA1
http://msdn2.microsoft.com/ja-jp/library/w8h3skw9(VS.80).aspx

●configuration/system.web/machineKey/@validationKey
web.config:AutoGenerate,IsolateApps
http://msdn2.microsoft.com/ja-jp/library/w8h3skw9(VS.80).aspx

●ViewStateEncryptionMode
@Pageディレクティブ:Auto
http://msdn2.microsoft.com/ja-jp/library/system.web.ui.page.viewstateencryptionmode.aspx

web.config:Auto
http://msdn2.microsoft.com/ja-jp/library/950xf363(VS.80).aspx