Skip to content

Instantly share code, notes, and snippets.

@kekyo
Last active December 15, 2023 09:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kekyo/df1d25299901de019da3597990f94715 to your computer and use it in GitHub Desktop.
Save kekyo/df1d25299901de019da3597990f94715 to your computer and use it in GitHub Desktop.
CSRF攻撃のまとめ

CSRF(Cross-Site Request Forgery)攻撃について: https://zenn.dev/yktakaha4/articles/study_csrf_attack

要するに、(セッション)トークンをCookieに格納して、これで認証する運用の場合、

  • フォームのPOST先のエンドポイントやWebAPIに対してのHTTPリクエストに、勝手にセッショントークンが送られてしまう(Cookieに入っていて、なおかつ同一のURLだから)。正規のアクセスではこの挙動を想定しているので、受信したトークンで認証が成立して問題ないが...
  • 攻撃者はとにかくブラウザ経由で、フォームのPOST先のエンドポイントやWebAPIに対して要求を投げさせれば、アクセスが受け付けられてしまう(Cookieに格納されているので、勝手にセッショントークンが送られてしまうから)。

だから、Cookieによるトークンの送信に頼らずに、別の方法でリクエストにトークンを含ませる必要がある。

  • HTMLのform hidden valueにトークンを入れておくと、form postでその値が一緒に送信される。これはハイジャック犯がこのトークン値を知ることが出来ないので、トークンなしまたは不正トークンで弾ける。
  • WebAPIアクセスでも、トークンをJSONに入れておく(またはHTTP header)すれば、同様にWebAPI側でチェックして弾ける。

認証に使用するトークンをCookieで管理しなければ、セッション維持用のトークンと併用しても構わない。

  • 基本的には Synchronizer Token Patternを使う。これは上記の通りの手法。
  • ほかに、Double Submit Cookie Patternがあり、これはCookieにトークンを格納するので勝手に送信されてしまうが、一方でform hidden valueやJSONにも値が格納されるようにしておいて、サーバー側でこの値が一致することを確認する手法。
    • サーバー側でトークンの管理が不要(一致していればOK。もっとも固定SALTか何かで一方向ハッシュを行って一致を見たほうがいいかも)
    • ただし、ブラウザに脆弱性があってCookieの値が漏洩した場合は、攻撃者がこの値を入手して攻撃を成立可能にしてしまうかもしれない。

ほかの資料

今時の CSRF 対策ってなにをすればいいの?

Cookie SameSite 属性メモ

抜け穴としては、WebUIとWebAPIの両方がhttpsを使って、かつCookieにSecure属性を付けて、
かつSameSiteをNoneにすることだけど、Noneにするのは...
というところから、これは現実的にできないと考えたほうが良いと思った気がする

CookieのSameSite属性と4つの勘違い(2022-10版)

SameSite Cookie について 「same-site」と「same-origin」を理解する

SameSite を Strict に設定すると、Cookie はファーストパーティ コンテキストでのみ送信されます」
ファーストパーティコンテキストとは、HTMLを受信した「サイト」と同じサイトに対して要求を投げる場合の事で、
「サイト」は、同一FQDNのほかにTLD+1またはeTLDのドメイン名を許容するってことらしい
なので、`https://localhost:<port>`が`SameSite=Strict`で許容されるのは、同一サイトだから。

Cookie の SameSite 属性について

SafariではすべてのサードパーティCookieをブロックするという話がここにつながるのか!ってなった

スケールアウトするASP.NET Coreサーバー群でCSRF対策する

https://github.com/dotnet/aspnetcore/blob/main/src/Antiforgery/src/Internal/AntiforgeryOptionsSetup.cs#L27C65-L27C65

ついに見つけた! やっぱり`ApplicationName`を使っている(`ApplicationDiscriminator`)。
そしてそれは`CookieOptions.Name`に設定されるので、この値をProgram.csでハードコーディングしておけばいい 

PolyFitのドキュメント上は、`options.Cookie.Name = "TestWebAPICookie";`
みたいにハードコーディングした例を示しているので、こんな感じでやればいい
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment