Saltar al contenido principal
de/blog/obscura/research/js-api-fingerprinting/

obscura/research/js-api-fingerprinting

3 Min. Lesezeit

Übersicht

Browser-JavaScript-APIs geben eine breite Palette von System- und Browserinformationen preis. Diese Signale können via JS-Injection auf Proxy-Ebene abgefangen und modifiziert werden.

API-Vektoren

Navigator API

Eigenschaft Preisgegebene Info Spoofbar per JS
navigator.userAgent Browser/OS-String Ja
navigator.platform OS-Plattform Ja
navigator.language Primäre Sprache Ja
navigator.languages Spracheinstellungen Ja
navigator.hardwareConcurrency CPU-Kernanzahl Ja
navigator.deviceMemory RAM in GB Ja
navigator.maxTouchPoints Touch-Unterstützung Ja
navigator.webdriver Automatisierungserkennung Ja
navigator.plugins Installierte Plugins Eingeschränkt
navigator.mimeTypes MIME-Unterstützung Eingeschränkt
navigator.cookieEnabled Cookie-Status Ja
navigator.doNotTrack Datenschutzeinstellung Ja
navigator.pdfViewerEnabled PDF-Unterstützung Ja

Screen API

Eigenschaft Preisgegebene Info Spoofbar per JS
screen.width Bildschirmauflösung Ja
screen.height Bildschirmauflösung Ja
screen.availWidth Verfügbare Breite Ja
screen.availTop Fensterposition Ja
screen.colorDepth Farbtiefe Ja
screen.pixelDepth Pixeltiefe Ja
screen.orientation Ausrichtung Ja

Andere APIs

API Preisgegebene Info Spoofbar per JS
Intl.DateTimeFormat().resolvedOptions().timeZone Zeitzone Ja
performance.now() Timer-Präzision Ja (reduziert)
Date.now() Clock Skew Ja
navigator.connection Netzwerktyp/RTT Ja
navigator.getBattery() Akkustand Ja
navigator.mediaDevices Kamera/Mikrofon-Anzahl Ja

Spoofing-Strategie

Per injiziertem JS

// Navigator-Eigenschaften via Object.defineProperty überschreiben
Object.defineProperty(navigator, 'userAgent', {
  get: () => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...'
})

Object.defineProperty(navigator, 'platform', {
  get: () => 'Win32'
})

Object.defineProperty(navigator, 'hardwareConcurrency', {
  get: () => 8
})

Herausforderungen

  1. Timing: Das injizierte Skript muss vor den eigenen Skripten der Seite ausgeführt werden. Erfordert Injektion ganz am Anfang von <head>.


  2. Frameworks: Manche Frameworks (Next.js, Angular) verwenden SSR oder Inline-Skripte, die vor dem injizierten JS ausgeführt werden.



  3. Service Workers: SWs können Antworten abfangen und modifizieren, bevor die Injektion stattfindet.


  4. Erkennung: Eine Website kann Überschreibungen erkennen, indem sie Object.getOwnPropertyDescriptor() prüft oder mehrere Signale auf Inkonsistenzen vergleicht.

Schlussfolgerungen

  • ~25 JS-API-Signale sind per Proxy-JS-Injection spoofbar
  • Erfordert sorgfältige Injektion während der HTML-Parse-Phase
  • Timing ist kritisch (Injektion vor jedem Seiten-Skript)
  • Nicht alle APIs können überschrieben werden (manche sind C++-basiert im Browser)
  • Signalübergreifende Konsistenz muss gewahrt werden (z. B. Win32-Plattform + Windows-User-Agent)