CS.CSRF.ATTR.NOATTR
プロパティ 'ViewStateUserKey' は設定されません
クロスサイトリクエストフォージェリ (CSRF) の防止は、普遍的な解決策がない複雑な問題です。CSRF の脆弱性が発生する可能性を減らす 1 つの方法は、要求ごとにトークンを返すようにブラウザに要求する、偽造防止トークンを使用することです。'Microsoft.AspNetCore.Mvc.Controller' から派生したクラスの場合、これらの偽造防止トークンは 'AutoValidateAntiForgeryToken' にすることができます。 メソッドの場合、これらの偽造防止トークンは 'ValidateAntiForgeryToken' または 'IgnoreAntiForgeryToken' のいずれかにすることができます。CS.CSRF.ATTR.NOATTR チェッカーは、これらのどのトークンも使用されていない場合、欠陥を報告します。
脆弱性とリスク
クロスサイトリクエストフォージェリ (XSRF または CSRF とも呼ばれる) は、Web でホストされているアプリに対する攻撃であり、悪意のある Web アプリが、クライアントブラウザとそのブラウザを信頼する Web アプリとの間の相互作用に影響を与える可能性があります。Web サーバーが、意図的に送信されたことを確認するメカニズムなしに、クライアントからの要求を受信するように設計されている場合、攻撃者はクライアントをだまして Web サーバーに意図しない要求を行わせ、信頼できる要求として処理させてしまう可能性があります。これは、URL、画像のロード、XMLHttpRequest などを通じて実行することができ、データの公開や意図しないコードの実行を引き起こす可能性があります。この攻撃はユーザーの以前に認証されたセッションを利用するため、こうした悪用の形式は、ワンクリック攻撃またはセッションライディングとも呼ばれます。
軽減と防止
CSRF 攻撃から防御するための最も一般的なアプローチは、シンクロナイザートークンパターン (STP) を使用することです。STP は、ユーザーが書式データを伴うページを要求するときに使用されます。
- サーバーは、現在のユーザーの ID に関連付けられたトークンをクライアントに送信します。
- クライアントは、検証のためにトークンをサーバーに送り返します。
- サーバーが認証されたユーザーの ID と一致しないトークンを受信した場合、その要求は拒否されます。
ASP.NET Core では、次の偽造防止トークン属性を使用することで、これを実行することができます。
- ValidateAntiForgeryToken
- AutoValidateAntiforgeryToken
- IgnoreAntiforgeryToken
脆弱コード例
using Microsoft.AspNetCore.Mvc;
namespace Example.Controllers
{
public class ExampleController : Controller
{
public IActionResult Test1()
{
string txt1 = Request.Form["Text1"];
ViewData["Message"] = txt1;
return View();
}
}
}
この例では、パブリッククラス 'ExampleController' は 'Microsoft.AspNetCore.Mvc.Controller' クラスから派生します。クラス 'ExampleController' とそのメソッドは、どの偽造防止トークン属性も使用しません。Klocwork は、この脆弱性を CS.CSRF.ATTR.NOATTR の欠陥として報告します。
修正コード例
using Microsoft.AspNetCore.Mvc;
namespace Example.Controllers
{
[AutoValidateAntiForgeryToken]
public class ExampleController : Controller
{
public IActionResult Test1()
{
string txt1 = Request.Form["Text1"];
ViewData["Message"] = txt1;
return View();
}
}
}
この修正された例では、クラス 'ExampleController' は 'Microsoft.AspNetCore.Mvc.Controller' クラスから派生しており、クラス 'ExampleController' は [AutoValidateAntiForgeryToken] 属性を使用して、ASP.NET の組み込み CSRF 保護を有効にします。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。