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