Im Jahr 2018 glich das Verfolgen eines Website-Besuchers einem JavaScript-Problem: Ein Skript sendet beim Seitenaufruf oder bei einem Klick ein Signal, und wenn Skripting blockiert, deaktiviert oder gefiltert wird, verstummt der gesamte Kanal. Crooked Style Sheets, ein Proof of Concept des Entwicklers jbtronics, zeigte, dass eine Seite ganz ohne JavaScript verfolgt werden kann, allein mit der CSS-Engine des Browsers.

Die naheliegenden Ansätze stützten sich alle auf Skripte oder Pixel: ein Tracking-Snippet, das nach Hause telefoniert, ein Image-Tag, ein Analytics-SDK eines Drittanbieters. Jeder davon ist eine sichtbare Anfrageklasse, auf deren Abfangen Skriptblocker und Werbefilter ausgelegt sind, und keiner davon wird auf einer Seite ausgelöst, auf der Skripting nie läuft.

Der Trick lag darin, wann Browser CSS-url()-Ressourcen abrufen: nur wenn ein Selektor zutrifft. Ein :active-Stil eines Links mit content: url(track.php?action=link2_clicked) veranlasst den Browser daher, genau dann diese URL anzufordern, wenn der Link angeklickt wird. Dasselbe Prinzip deckte das Überfahren mit der Maus, angehakte Kontrollkästchen, Text, der einem Muster via :valid entspricht, Browser-Erkennung via @supports und die Erkennung installierter Schriftarten über einen @font-face-Fallback ab, der geladen wird, wenn Calibri fehlt. Jede Anfrage traf eine PHP-Seite, die den Zeitstempel und die in ihrer URL kodierte Aktion protokollierte.

Da die Anfragen gewöhnliche, CSS-gesteuerte Asset-Ladevorgänge sind, enthalten sie keinen Skriptaufruf, den ein Blocker identifizieren könnte, und Stylesheets werden auch bei deaktiviertem JavaScript weiterhin angewendet. Der Hacker-News-Beitrag vom Januar 2018 erzielte 532 Punkte und 175 Kommentare, und das Repository war bis 2026 auf etwa 3,3k Sterne und 132 Forks angewachsen. Zu den Abwehrmaßnahmen, die es hervorrief, gehörte die Erweiterung CSS Exfil Protection, und der Autor argumentierte, die robuste Lösung bestehe darin, dass Browser externen, per CSS referenzierten Inhalt beim Seitenaufruf statt bei Bedarf abrufen, eine Änderung, die nach seiner Einschätzung Performance kosten würde.

Die verzögerten CSS-Ressourcenabrufe des Browsers als Ereignis-Baken nutzen: Selektoren, die nur bei Klick, Hover oder einer fehlenden Schriftart zutreffen, lösen eine Anfrage aus, die der Server protokollieren kann

Browser entscheiden, wann CSS-url()-Inhalte abgerufen werden, sodass ein zutreffender Selektor eine Netzwerkanfrage erzeugt, ohne einen JavaScript-Aufruf, auf den ein Werbeblocker zielen könnte.

Die Anfragen sehen wie gewöhnliche Bild- oder Schriftart-Ladevorgänge aus und sind in Protokollen und den meisten Blockierungswerkzeugen nicht von legitimen Assets zu unterscheiden.

Zustandsabhängige Selektoren kodieren die Bedeutung in der URL selbst: Der Ressourcenpfad benennt das Ereignis, und der Server protokolliert nur die Ankunftszeitstempel.

CSS wird auch auf Seiten angewendet, auf denen Skripting deaktiviert ist, und schließt damit die Lücke, die kein JavaScript wie Privatsphäre aussehen ließ.

Deklarative Formate leisten weiterhin bedingte Arbeit: Jeder zustandsabhängige Ressourcenabruf ist ein beobachtbares Signal, sodass Abwehrmaßnahmen aus CSS stammende Anfragen als einschränkungswürdiges Verhalten behandeln müssen

Das Repository erreichte am 16. Januar 2018 Hacker News und erzielte 532 Punkte und 175 Kommentare; beim Crawl im Jahr 2026 zeigte es etwa 3,3k Sterne und 132 Forks. Die Demonstration brachte mindestens eine Abwehrmaßnahme hervor, die im eigenen README verlinkte Erweiterung CSS Exfil Protection, und die Ausarbeitung des Autors argumentierte, die dauerhafte Lösung bestehe darin, dass Browser externen, per CSS referenzierten Inhalt beim Laden der Seite statt beim Zutreffen eines Selektors laden, eine Änderung, die nach seiner Anmerkung Performance kosten würde. Die ursprüngliche Demo-Seite ging später offline, sodass die Codebeispiele des Repositorys als funktionierendes Zeugnis der Technik verbleiben.

DEN BELEGEN FOLGEN

Die Quellen

  1. CrookedStyleSheets - Webpage tracking only using CSS (and no JS) GitHub · github.com
  2. Crooked Style Sheeding - Webpage tracking using only CSS Hacker News · news.ycombinator.com ·