Strict Isolation Policy
November 30, 2020
Category
Defense
Strict Isolation Policyは、すべてのクロスサイトインタラクション(ハイパーリンクを介したアプリケーションへの遷移を含む)から保護することを目的としています。これは非常に厳しいポリシーであり、アプリケーションが正常に機能しなくなる可能性があります。
tip
すべてのクロスサイトインタラクションを拒否する代わりに、ユーザーにアクションを確認するよう促すことができます。例えば、このページを信頼できる発信元から訪れたことを確認することで 、バックグラウンドでの攻撃のリスクを軽減し、同時にアプリケーションの意図しない破壊を防ぐのに役立ちます。
しかし、他のリソースはバックグラウンドで読み込まれるため、これは遷移のリクエストに対してのみ機能します。
Fetch Metadataを用いた実装 #
以下のコードは、アプリケーションによる Strict Isolation Policy の実装例を示しています:
# クロスオリジンリクエストを拒否し、CSRFやXSSI、他のバグから保護します
def allow_request(req):
# Fetch Metadataを送信しないブラウザからのリクエストを許可する
if not req['headers']['sec-fetch-site']:
return True
# cross-siteリクエストをブロック
if req['headers']['sec-fetch-site'] == 'cross-site':
return False
# その他のリクエストを許可する
return True
SameSite cookiesを用いた実装 #
もしサーバーがSameSite=strict
フラグを持つCookieを送ると、このコードで示されるように、そのCokkieを含まないで返される全てのリクエストは拒否されることがあります。
# クロスオリジンリクエストを拒否し、CSRFやXSSI、他のバグから保護します
def allow_request(req):
if req['cookies']['strict-cookie'] == 'true':
return True
# strict Cookieを持たないリクエストはブロック
return False
Refererを用いた実装 #
また、Referer
ヘッダーを使用して、信頼できない送信元からのリクエストを拒否することも可能です:
# 信頼できないリファラーから来たリクエストを拒否する
def allow_request(req):
# referer ヘッダが信頼できるかどうかを確認する。つまりtrusted_referers ディクショナリに存在するかどうかを確認する。
if req['headers']['referer'] in trusted_referers:
return True
# strict Cookieを持たないリクエストをブロック
return False
important
すべてのリクエストに Referer ヘッダが含まれることは保証されていません (たとえば、拡張機能でヘッダを取り除くことができます)。また、
Referer
の値をnull
に設定することも可能であることに注意してください。Twitterは、XS-Leaksに対して同様の防御策を導入1しています。