Kategorie: Hardware / Audioverarbeitung
1. Beschreibung
Audio-Fingerprinting verwendet die Web Audio API, um zu messen, wie der Audio-Hardware- und Software-Stack eines Geräts Schall verarbeitet. Der AudioContext, OscillatorNode und DynamicsCompressorNode erzeugen Ausgaben, die variieren je nach:
- Audio-Treiber-Implementierung (ALSA, PulseAudio, PipeWire, CoreAudio, WASAPI)
- Hardware-DAC/ADC-Charakteristiken
- Abtastraten-Konvertierungsalgorithmen
- Dynamikkompressionsverhalten (Threshold, Knee, Ratio-Kurven)
- Audio-Puffer-Handling und Latenz
- FFT-Implementierungsunterschieden
2. Vektoren
2.1 DynamicsCompressor-Fingerprinting
const ctx = new AudioContext()
const osc = ctx.createOscillator()
const compressor = ctx.createDynamicsCompressor()
compressor.threshold.value = -50
compressor.knee.value = 40
compressor.ratio.value = 12
osc.frequency.value = 1000
osc.type = 'sawtooth'
osc.connect(compressor)
const dest = ctx.createAnalyser()
compressor.connect(dest)
const buffer = new Float32Array(dest.fftSize)
dest.getFloatFrequencyData(buffer)
const hash = md5(buffer)
Entropie: ~8-12 Bits
Stabilität: Hoch über Sitzungen hinweg, moderat über Browser-Updates
2.2 AudioContext-Basislatenz
const ctx = new AudioContext()
const latency = ctx.baseLatency
Entropie: ~4-6 Bits
Stabilität: Sehr hoch – hardwareabhängig
2.3 Zusätzliche Audio-Signale
| Signal |
Beschreibung |
Entropie |
sampleRate |
Audio-Context-Abtastrate (44100, 48000, etc.) |
~1-2 Bits |
maxChannelCount |
Maximale unterstützte Audio-Kanäle |
~1-2 Bits |
| Kanalanzahl-Modus |
'explicit' vs. 'clamped-max' vs. 'max' |
~1-2 Bits |
| FFT-Größen-Variationen |
Unterschiedliche FFT-Implementierungen |
~2-3 Bits |
3. Stärken des Angreifers
| Stärke |
Erklärung |
| Hardware-gebunden |
Audio-Fingerprint wird durch Audio-Hardware und Treiber bestimmt |
| Keine Berechtigung erforderlich |
AudioContext kann ohne Benutzerzustimmung erstellt werden |
| Schnell |
Fingerprint-Generierung dauert ~50-100ms |
| Hintergrund |
Spielt keinen hörbaren Ton ab |
| Passiver Benutzer |
Benutzer kann nicht erkennen, dass es passiert |
4. Schwächen des Angreifers
| Schwäche |
Erklärung |
| Blockierbar |
AudioContext kann deaktiviert werden (Firefox resistFingerprinting blockiert es vollständig) |
| Browserabhängig |
Gleiche Hardware + verschiedene Browser können unterschiedliche Ausgaben erzeugen |
| Treiberupdates ändern es |
Audio-Treiberupdates können gespeicherte Fingerprints ungültig machen |
| Rauschboden ändert sich |
Hintergrundgeräusche beeinflussen DynamicsCompressor-Ausgabe |
| Niedrigere Entropie als GPU |
~8-12 Bits vs. ~20+ Bits für WebGL |
5. Erkennung von Manipulation
| Technik |
Funktionsweise |
| Erkennung geglätteter Ausgabe |
Alle Werte, die -100dB zurückgeben, sind nicht natürlich |
| Kreuz-Lesevergleich |
Audio-Puffer zweimal lesen, auf injizierte Rauschmuster vergleichen |
| Basislatenz-Prüfung |
Ungewöhnliche Latenzwerte deuten auf Überschreibung hin |
| Abtastraten-Konsistenz |
Widerspricht anderen Signalen (seltene Abtastrate + häufiger Browser) |
6. Abschwächungen für Obscura
6.1 Was Obscura tun kann
| Abschwächung |
Effektivität |
Erkennbarkeit |
Implementierung |
| AudioContext vollständig blockieren |
Hoch |
Mittel |
JS: AudioContext → undefined |
| Kompressor-Ausgabe glätten |
Mittel |
Hoch |
getFloatFrequencyData überschreiben |
| Audio-Basislatenz blockieren |
Niedrig |
Mittel |
baseLatency-Getter überschreiben |
| Abtastrate runden |
Niedrig |
Niedrig |
sampleRate-Getter überschreiben |
6.2 Was Obscura nicht tun kann
| Kann nicht |
Warum |
| Echte Audioverarbeitung ändern |
Audioverarbeitung ist lokale Hardware |
| DynamicsCompressor-Ausgabe spoofen |
Ausgabe hängt vom physischen Audio-DSP ab |
| Über Benutzer hinweg normalisieren |
Unterschiedliche Hardware → unterschiedliche Verarbeitung |
| Timing-Seitenkanäle entfernen |
Audio-Timing ist auch mit blockierter API messbar |
6.3 Empfohlener Ansatz
1. AudioContext vollständig blockieren (hoher Wert, niedrige Kosten)
2. Restrisiko akzeptieren (Audio allein ist ~8-12 Bits, allein unzureichend)
7. Forschungsreferenzen
- Acar, G. et al. (2014). "The Web Never Forgets: Persistent Tracking Mechanisms in the Wild." CCS 2014.
- Englehardt, S. & Narayanan, A. (2016). "Online Tracking: A 1-million-site Measurement and Analysis." CCS 2016.
- FingerprintJS (2026). Quellcode:
src/sources/audio.ts.