Maj 2025 roku. Analizując podejrzaną wiadomość phishingową przychodzącą na polską platformę pocztową, natknęliśmy się na mechanizm który wykraczał poza standardowe techniki wyłudzania danych. Nie było fałszywej strony logowania. Nie było linku do klona serwisu. Była wiadomość która — jeśli otworzysz ją w przeglądarce — po cichu instaluje Service Workera.
Jeśli nie wiesz czym jest Service Worker: to jest skrypt działający w tle przeglądarki, zarejestrowany dla konkretnej domeny. Zaprojektowany dla legalnych celów — buforowanie stron, powiadomienia push, praca offline. Kluczowa właściwość: działa nawet gdy strona jest zamknięta. I raz zainstalowany — trwa do momentu gdy zostanie jawnie wyrejestrowany.
Atakujący użył tej właściwości precyzyjnie.
Anatomia ładunku
Złośliwy Service Worker zawierał trzy elementy które razem tworzyły kompletny mechanizm kradzieży.
Natychmiastowe przejęcie kontroli:
javascript
self.skipWaiting();
self.clients.claim();
Dwie linie które sprawiają że Service Worker nie czeka na restart sesji ani zamknięcie wszystkich kart — przejmuje kontrolę natychmiast po instalacji. Żadnego opóźnienia, żadnego okna na wykrycie.
Zbieranie adresu email: Service Worker nasłuchiwał na wiadomości z typem username od strony i wysyłał adres email ofiary metodą POST na zewnętrzny serwer — razem ze statusem rejestracji i znacznikiem czasu.
Przechwytywanie danych logowania: Worker interceptował każde żądanie POST wykonywane w obrębie domeny platformy pocztowej. Klonował żądanie, odczytywał jego ciało, wyciągał parametry username lub _user oraz password lub _pass. Jeśli znalazł login i hasło — wysyłał je na zewnętrzny serwer zbierający dane. Następnie przepuszczał oryginalne żądanie dalej.
Ta ostatnia część jest najważniejsza: strona działała normalnie. Ofiara zalogowała się, sesja się otworzyła, nic się nie stało — z jej perspektywy. W tle dane logowania do platformy pocztowej trafiały do atakującego.
Dlaczego to jest inne niż klasyczny phishing
Standardowy phishing wymaga jednej rzeczy: żebyś kliknął w link i wpisał hasło na fałszywej stronie. Ofiara która jest ostrożna, sprawdza URL, nie klika podejrzanych linków — jest chroniona.
Ten atak nie wymagał kliknięcia w żaden link. Nie wymagał fałszywej strony logowania. Nie wymagał żeby ofiara zrobiła cokolwiek poza otworzeniem wiadomości.
Wiadomość była pusta. Żadnej treści, żadnego linku, żadnego załącznika — nic co wzbudziłoby podejrzenia. W tle JavaScript instalował Service Workera dla domeny platformy pocztowej, a następnie wylogowywał ofiarę z aktywnej sesji.
Roundcube przekierował na stronę logowania. Dokładnie tak jak powinien. Dokładnie tak jak ofiara widziała to setki razy wcześniej.
Ofiara wpisała login i hasło żeby się zalogować z powrotem. To jest naturalna reakcja — sesja wygasła, trzeba się zalogować. Nic podejrzanego. Strona logowania wyglądała normalnie bo była normalna. URL był właściwy. Certyfikat ważny.
Service Worker przechwycił to żądanie POST i wysłał dane do atakującego. Logowanie przebiegło normalnie — ofiara znalazła się w skrzynce, nic się nie stało.
Atak wykorzystał nie podatność techniczną w protokole uwierzytelnienia — ale przewidywalne zachowanie użytkownika który widzi ekran logowania i loguje się. Fałszywa strona nie była potrzebna bo prawdziwa strona wykonała całą pracę.
Połączenie z tym co opisywaliśmy przy Roundcube
Dziś opisywaliśmy osiem podatności w Roundcube i kampanię UNC1151 która używała XSS w kliencie pocztowym do przejmowania korespondencji. Mechanizm z maja 2025 jest dokładnym rozwinięciem tego samego wzorca.
XSS w kliencie pocztowym → wykonanie złośliwego JavaScript → instalacja Service Workera → kradzież hasła przy każdym kolejnym logowaniu na tę platformę.
Stored XSS w Roundcube z dzisiejszej aktualizacji — przez pole tematu, przez SVG animate, przez podgląd załącznika — to są potencjalne wektory dostarczenia dokładnie tego rodzaju ładunku. Nie do fałszywej strony logowania. Do trwałego, niewidocznego przechwytywania hasła przy każdej autentycznej sesji.
Jak sprawdzić czy masz zainstalowanego złośliwego Service Workera
W Chrome i Edge: chrome://serviceworker-internals/ — pełna lista wszystkich zarejestrowanych Service Workerów z możliwością wyrejestrowania.
W Firefox: about:debugging#/runtime/this-firefox → Service Workers.
Wszelkie wpisy z domenami których nie rozpoznajesz jako serwisów z których świadomie korzystasz — powinny zostać wyrejestrowane.
Dla organizacji zarządzających flotą urządzeń: Content Security Policy z dyrektywą worker-src 'none' lub worker-src 'self'blokuje instalację Service Workerów przez zewnętrzne skrypty. To jest jednolinijkowa ochrona która eliminuje ten wektor całkowicie dla stron które ją wdrożą.
Bookmarklet do szybkiego sprawdzenia i usunięcia
Dla tych którzy wolą jedno kliknięcie zamiast wchodzenia w ustawienia przeglądarki — przygotowaliśmy bookmarklet. Działa w Chrome, Edge i Firefox.
Jak dodać:
- Stwórz nową zakładkę w przeglądarce
- Jako nazwę wpisz np.
🔍 SW Checker - Jako URL wklej poniższy kod w całości
- Zapisz
javascript:(function(){if(!('serviceWorker' in navigator)){alert('Ten browser nie obsługuje Service Workerów.');return;}navigator.serviceWorker.getRegistrations().then(function(registrations){if(registrations.length===0){alert('Brak zarejestrowanych Service Workerów. Jesteś bezpieczny.');return;}var msg='Znaleziono '+registrations.length+' Service Worker(ów):\n\n';registrations.forEach(function(reg,i){msg+=(i+1)+'. '+reg.scope+'\n';});msg+='\nKliknij OK żeby wyrejestrować WSZYSTKIE.';if(confirm(msg)){Promise.all(registrations.map(function(reg){return reg.unregister();})).then(function(results){var removed=results.filter(Boolean).length;alert('Wyrejestrowano '+removed+' z '+registrations.length+' Service Worker(ów).\nOdśwież stronę.');});}});})();
Jak używać: Kliknij zakładkę będąc na stronie której Service Workery chcesz sprawdzić. Zobaczysz listę wszystkich zarejestrowanych Service Workerów dla tej domeny — z opcją jednoczesnego usunięcia wszystkich.
Ważna uwaga: bookmarklet działa w kontekście aktualnie otwartej domeny. Żeby sprawdzić Service Workery z konkretnej platformy pocztowej — wejdź na tę platformę i dopiero kliknij zakładkę. Żeby zobaczyć wszystkie Service Workery zainstalowane w przeglądarce niezależnie od domeny — wejdź na chrome://serviceworker-internals/ (Chrome/Edge) lub about:debugging#/runtime/this-firefox (Firefox).














































































































































Nie nowy atak, tylko naprawiony błąd. Co łatka Gemini CLI mówi o tym, że tryb –yolo w potoku CI/CD to nie jest dobry pomysł