CS.CSRF.VSUK.CONSTASSIGN
プロパティ 'ViewStateUserKey' に const 文字列が割り当てられます。
クロスサイトリクエストフォージェリ (CSRF) の防止は、普遍的な解決策がない複雑な問題です。CSRF の脆弱性が発生する可能性を減らす 1 つの方法は、要求ごとにトークンを返すようにブラウザに要求する、偽造防止トークンを使用することです。ASP.NET WebForm アプリケーションでは、"System.Web.UI.Page" クラスの 'ViewStateUserKey' を設定することで、これを実行することができます。CS.CSRF.VSUK ファミリは、ページの初期化中に、プロパティ 'ViewStateUserKey' が正しく設定されているかどうかを(つまり、'Page_Init' または 'OnInit' または 'OnPreInit' のいずれかのメソッドで) 検証します。
有効にするには、このプロパティの値は定数であってはなりません。CS.CSRF.VSUK.CONSTASSIGN チェッカーは、初期化中に、定数が割り当てられている 'ViewStateUserKey' への割り当てにフラグを立てます。
脆弱性とリスク
クロスサイトリクエストフォージェリ (XSRF または CSRF とも呼ばれる) は、Web でホストされているアプリに対する攻撃であり、悪意のある Web アプリが、クライアントブラウザとそのブラウザを信頼する Web アプリとの間の相互作用に影響を与える可能性があります。Web サーバーが、意図的に送信されたことを確認するメカニズムなしに、クライアントからの要求を受信するように設計されている場合、攻撃者はクライアントをだまして Web サーバーに意図しない要求を行わせ、信頼できる要求として処理させてしまう可能性があります。これは、URL、画像のロード、XMLHttpRequest などを通じて実行することができ、データの公開や意図しないコードの実行を引き起こす可能性があります。この攻撃はユーザーの以前に認証されたセッションを利用するため、こうした悪用の形式は、ワンクリック攻撃またはセッションライディングとも呼ばれます。
脆弱コード例
using System;
using System.Web.UI;
namespace Example
{
public partial class About : Page
{
protected void Page_Init(object sender, EventArgs e)
{
//Page Initialization
ViewStateUserKey = "test"; //@ CS.CSRF.VSUK.CONSTASSIGN
}
}
}
この例では、タイプが 'System.Web.UI.Page' (つまり .aspx ページの背後にあるコード) であるクラス 'About' は、'ViewStateUserKey' に定数値を割り当てます。これにより、Web サイトのユーザーは CSRF 攻撃に脆弱な状態になります。Klocwork は、11 行目でこの脆弱性を CS.CSRF.VSUK.CONSTASSIGN の欠陥として報告します。
修正コード例
using System;
using System.Web.UI;
namespace Example
{
public partial class About : Page
{
protected void Page_Init(object sender, EventArgs e)
{
//Page Initialization
ViewStateUserKey = Session.SessionID; //@no CS.CSRF.VSUK.CONSTASSIGN
}
}
}
この修正されたコード例では、ページの初期化中に、'ViewStateUserKey' に非 const 値が割り当てられます。これは、ASP.NET WebForms アプリケーションで CSRF 攻撃を回避するために、Microsoft が推奨する方法です。
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。