Przejdź do treści
INDEKS ANALIZ BREACHROAD / NOTA TECHNICZNA

Stylemail: sam CSS mógł wykradać treść zaszyfrowanych wiadomości

Container queries, webfonty i ligatury zamieniały odszyfrowany tekst w requesty sieciowe bez JavaScriptu. Wyjaśniamy atak i poprawną izolację klienta poczty.

MATERIAŁ PUBLICZNY
AUTOR
/ CEO Breachroad · OSCP · PNPT
PUBLIKACJA
8 sierpnia 2026
CZAS CZYTANIA
14 min czytania
TEMAT
Pentest i AppSec
Stylemail: sam CSS mógł wykradać treść zaszyfrowanych wiadomości

Stylemail pokazuje, że „JavaScript został zablokowany” nie jest synonimem bezpiecznego renderowania treści. Badacze CISPA zbudowali atak bez skryptów, w którym standardowe funkcje CSS mierzyły kolejne znaki odszyfrowanej wiadomości, a następnie kodowały wynik w requestach po zdalne zasoby. W demonstracjach pełna treść wiadomości chronionych PGP mogła zostać odtworzona po jednym otwarciu w podatnym kliencie.

Kryptografia nie została złamana. PGP poprawnie odszyfrowało wiadomość na urządzeniu odbiorcy. Błąd polegał na tym, że zaufany plaintext i kontrolowany przez atakującego arkusz stylów trafiły do tego samego kontekstu renderowania, a ten kontekst miał dostęp do sieci.

Od zaszyfrowanego bloku do mixed-context email

Model zagrożenia zakłada, że atakujący zna zaszyfrowaną wiadomość — na przykład przechwycił ją na serwerze pocztowym albo pozyskał z wcześniejszego wycieku — ale nie ma klucza prywatnego odbiorcy. Bez zmiany bloku kryptograficznego opakowuje go w nową wiadomość HTML i dodaje własny CSS. Następnie ponownie wysyła całość do prawowitego odbiorcy.

Gdy klient poczty otwiera wiadomość, odszyfrowuje blok, a potem renderuje go razem z zewnętrznym markupem. Powstaje mixed context: tajny tekst jest chroniony kryptograficznie w transporcie, lecz po odszyfrowaniu podlega regułom dostarczonym przez niezaufanego nadawcę.

W paperze „Styled to Steal” badacze wskazali trzy kluczowe elementy: container queries, leniwe ładowanie webfontów i kontekstowe ligatury. Specjalnie przygotowana ligatura zmienia szerokość tekstu tylko wtedy, gdy pasuje do sprawdzanego prefiksu. Container query zamienia tę różnicę geometrii w wybór zasobu, a pobranie obrazu lub fontu ujawnia wynik serwerowi napastnika. Animacje CSS pozwalają powtarzać pomiar znak po znaku w jednym renderowaniu.

Dlaczego sanitizator HTML nie wystarczył

Łańcuch nie potrzebował JavaScriptu, zdarzeń DOM ani klasycznego XSS. Używał zgodnych ze standardem właściwości CSS, dlatego domyślna konfiguracja DOMPurify nie musiała niczego usuwać. Restrykcyjna polityka script-src w CSP również nie blokuje automatycznie fontów, obrazów ani pomiarów layoutu.

Badacze przeprowadzili end-to-end demonstracje dla Mozilla Thunderbird i KMail. Wskazali też brak wystarczającej izolacji w Apple Mail z dodatkiem GPGSuite, choć odpowiedź producenta dodatku kwestionowała praktyczną eksploatowalność tej konfiguracji. Mozilla przygotowała mitigacje, KDE potwierdziło problem, a Meta rozszerzyła model zagrożeń Code Verify tak, aby integralność obejmowała również CSS.

Odczyt dowolnego tekstu następował według badaczy z prędkością około 2 bajtów na sekundę, natomiast dane o znanym formacie mogły być rozpoznawane znacznie szybciej. To nie jest kanał o przepustowości pobierania pliku, ale dla klucza, hasła, tokenu lub krótkiej wiadomości jest wystarczający.

Kontrole, które rzeczywiście przerywają kanał

  1. Zaktualizuj Thunderbird, KMail, GPGSuite i używane komponenty renderujące do bieżących wydań producentów.
  2. Domyślnie blokuj zdalną treść w poczcie, szczególnie obrazy, fonty i arkusze stylów. Przycisk „pokaż obrazy” jest decyzją o otwarciu kanału sieciowego.
  3. Renderuj odszyfrowany plaintext w osobnym dokumencie bez stylów pochodzących z zewnętrznej części MIME.
  4. Dla treści wysokiej wrażliwości preferuj widok plain text i wyłącz HTML w kliencie, jeżeli proces biznesowy na to pozwala.
  5. W webmailu zastosuj odrębny origin lub sandboxed iframe bez sieci dla zdekryptowanego fragmentu; samo czyszczenie drzewa DOM to za mało.
  6. CSP powinna blokować font-src, img-src i style-src dla nieufnego kontekstu, a nie wyłącznie skrypty.
  7. Na proxy monitoruj serie unikalnych requestów do jednego nowego hosta rozpoczynające się po otwarciu maila, zwłaszcza po zasoby fontowe i małe obrazy.
  8. Testuj sanitizatory również pod kątem CSS exfiltration, nie tylko XSS. Aktualizacja biblioteki bez bezpiecznej konfiguracji nie zmienia modelu danych.

Fakty i analiza Breachroad

Paper potwierdza mechanizm, testowane klienty, jednokrotne renderowanie i brak JavaScriptu. Nie oznacza to, że każda poczta webowa lub każdy klient PGP jest podatny — konieczne są konkretne możliwości CSS, wspólny kontekst i ruch zdalny. Zalecenie traktowania odszyfrowanego fragmentu jako osobnej strefy bezpieczeństwa jest wnioskiem Breachroad z przyczyny źródłowej, czyli braku izolacji.

Szkolenia AppSec i secure coding uczą analizować kanały danych poza JavaScriptem. Pentest aplikacji webowych może objąć renderery HTML, sanitizację, CSP i rzeczywistą izolację w komponentach pocztowych.

UDOSTĘPNIJ / KOPIUJ