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