Отпечатки

Аудио-отпечатки: как AudioContext отслеживает вас

Как AudioContext и OfflineAudioContext создают уникальные аудио-отпечатки и как контролировать аудиовыход на уровне движка браузера.

Документация

Нужна поддерживаемая продуктовая документация?

У этой статьи есть соответствующая страница в центре документации. Используйте docs для каноничного сценария настройки, актуальных флагов и долгосрочной справки.

Введение

Каждый веб-браузер содержит встроенный движок обработки звука. Web Audio API, а именно AudioContext и OfflineAudioContext, позволяет сайтам создавать, обрабатывать и анализировать аудиосигналы полностью программно. Доступ к микрофону не требуется, звук не воспроизводится, и никакой запрос разрешения не появляется. API был разработан для легитимных целей: игры, музыкальные приложения, аудиоэффекты в реальном времени. Но тот же конвейер обработки, который обеспечивает работу аудиоприложений, также создаёт выход, который варьируется от устройства к устройству. Системы отслеживания используют эту вариацию для генерации стабильного идентификатора - аудио-отпечатка, который сохраняется между сессиями и переживает удаление cookie. Понимание того, как это работает, - первый шаг к защите вашей приватности.

Влияние на приватность

Аудио-отпечатки - один из наиболее эффективных сигналов отслеживания, доступных сайтам сегодня. Исследование Принстонского университета (проект WebTap) обнаружило, что более 500 из топ-1 000 000 сайтов применяли скрипты аудио-отпечатков. Техника особенно настораживает тем, что работает скрытно в фоновом режиме. Пользователи не получают ни уведомлений, ни диалогов разрешений, ни визуальных индикаторов того, что происходит обработка звука.

В отличие от cookie, аудио-отпечатки не могут быть очищены пользователем. В отличие от IP-адресов, они не меняются при смене сети. Исследование 2019 года, опубликованное на симпозиуме IEEE по безопасности и приватности, показало, что аудио-отпечатки остаются стабильными между сессиями браузера и могут достигать уровня уникальности более 95% при сочетании всего с двумя-тремя другими сигналами. Проект Panopticlick от Electronic Frontier Foundation подтвердил, что результаты обработки аудио вносят значимый вклад в общую уникальность браузера, даже на распространённых конфигурациях оборудования.

Диаграмма ниже показывает полный конвейер, который трекер использует для превращения тихого аудиорендеринга в стабильный межсайтовый идентификатор. Каждый шаг выполняется полностью в JavaScript, без запроса разрешения и без слышимого звука.

How a tracker turns AudioContext into a stable device ID 1. Tracker script loads Bundled with ad / analytics SDK 2. Build audio graph Oscillator → Compressor 3. Render silently OfflineAudioContext.startRendering 4. Sum sample buffer Σ Float32Array → SHA-256 5. POST to collector Beacon · navigator.sendBeacon 6. Match in device graph Cross-site identity link No prompt · no permission · no audible sound The full pipeline runs in under 30 ms inside any iframe. Clearing cookies, switching IP, or opening incognito does not change the sample sum.

Шаг сбора дёшев и беззвучен. Реальная ценность находится ниже по цепочке в графе устройств: каждый сайт, использующий тот же трекер, вносит ту же сумму семплов для того же устройства, и эти кластеры связываются между несвязанными доменами. Задача защитника не в том, чтобы заблокировать AudioContext, а в том, чтобы сделать рендеренные семплы стабильными, реалистичными и согласованными с остальной идентичностью браузера.

Техническая основа

Web Audio API предоставляет два основных интерфейса, релевантных для отпечатков: AudioContext и OfflineAudioContext.

AudioContext управляет обработкой аудио в реальном времени. Он создаёт аудиограф, где узлы представляют операции вроде осцилляции, управления усилением, компрессии и анализа. Каждый узел обрабатывает аудиосэмплы, и выход зависит от базовой аудиоподсистемы.

OfflineAudioContext рендерит аудио в буфер без создания слышимого выхода. Это интерфейс, наиболее часто используемый для отпечатков, потому что он работает быстро и тихо. Типичная процедура отпечатка создаёт OfflineAudioContext, подключает OscillatorNode к DynamicsCompressorNode, рендерит короткий буфер и считывает полученные float-сэмплы.

Почему этот вывод различается на разных устройствах? Несколько факторов:

  • Различия аудиооборудования. Разные звуковые карты и аудиочипсеты реализуют цифровую обработку сигналов с небольшими вариациями в точности плавающей запятой и поведении округления.
  • Аудиостеки операционных систем. Windows (WASAPI, DirectSound), macOS (CoreAudio) и Linux (PulseAudio, ALSA) каждый применяют собственные алгоритмы ресемплинга, управление буферами и стратегии микширования.
  • Реализация движка браузера. Chromium, Firefox и WebKit реализуют спецификацию Web Audio с разной внутренней точностью, разными оптимизациями быстрого пути и разными флагами компиляции.
  • Согласование частоты дискретизации. Частота дискретизации по умолчанию различается в зависимости от ОС и оборудования. Система на 44100 Гц создаёт иной выход компрессора, чем система на 48000 Гц, даже при идентичных узлах и параметрах.

Комбинация этих факторов означает, что отрендеренный аудиобуфер содержит тонкие числовые различия. Суммирование всех float-сэмплов в буфере или хеширование определённого диапазона создаёт значение, которое замечательно стабильно для данного устройства, но различается между устройствами.

Таблица ниже показывает, что фактически видят трекеры, когда одна и та же процедура OfflineAudioContext выполняется на четырёх распространённых классах устройств. Каждая строка представляет реальную конфигурацию, чья сумма семплов становится записью в базе отпечатков.

Same audio code, four device classes, four fingerprints Device class sampleRate · stack Σ samples (compressor render) Windows + Realtek HDA Win10 + Chrome desktop 44100 Hz · WASAPI shared channelCount: 2 · channelCountMode: explicit 35.7383295... SHA prefix: 4f8e21a9 macOS + CoreAudio (M2) macOS 14 + Chrome desktop 48000 Hz · CoreAudio HAL channelCount: 2 · arm64 fast path 35.7459816... SHA prefix: 7c9bd33f Linux + PulseAudio Ubuntu + Chrome desktop 44100 Hz · PulseAudio sink channelCount: 2 · resampler: speex 35.7484201... SHA prefix: a2d014be Android Chrome (Pixel) Android 14 + Chrome mobile 48000 Hz · AAudio channelCount: 2 · arm64 mobile path 35.7491672... SHA prefix: e84427d1 Профиль, который возвращает sampleRate из строки B при выдаче семплов из строки A, обнаруживается одной перекрёстной проверкой.

Распространённые подходы защиты и их ограничения

Существует несколько подходов к решению проблемы аудио-отпечатков, но каждый имеет существенные недостатки.

VPN меняют ваш IP-адрес, но не оказывают никакого влияния на вывод аудиообработки. Web Audio API работает полностью внутри браузера, без сетевого компонента. Ваш аудио-отпечаток идентичен, подключаетесь ли вы через VPN, прокси или напрямую.

Браузерные расширения, заявляющие о защите аудио-отпечатков, обычно перехватывают JavaScript-вызовы и добавляют случайный шум к возвращаемому буферу. У этого подхода три проблемы. Во-первых, сам паттерн шума может быть обнаружен: если сайт вызывает одну и ту же аудиопроцедуру дважды и получает разные результаты, он знает, что внедрение шума активно. Во-вторых, многие расширения перехватывают только конкретные методы API, оставляя другие (например, AnalyserNode.getFloatFrequencyData) без изменений, создавая обнаруживаемые несоответствия. В-третьих, расширения работают в JavaScript-пространстве и не могут модифицировать фактический конвейер рендеринга.

Рандомизация аудиопараметров (частота дискретизации, количество каналов и т.д.) часто ломает веб-приложения, зависящие от точного воспроизведения аудио. Инструменты музыкального производства, видеоконференции и игровое аудио полагаются на согласованное поведение аудио. Случайные значения также не проходят проверки согласованности: сайт может проверить, соответствует ли заявленная частота дискретизации фактическому выходу рендеринга.

Tor Browser применяет более принципиальный подход, стандартизируя аудиовыход для всех пользователей. Однако это создаёт единый общий отпечаток, который сам становится идентификатором, сигнализируя, что вы пользователь Tor.

Фундаментальная проблема в том, что эффективная защита аудио-отпечатков требует контроля над фактическим движком рендеринга, а не только над JavaScript API.

Диаграмма ниже сопоставляет четыре распространённые модели защиты аудио с типом перекрёстной проверки, которую выполняет современный движок отпечатков. Каждая модель над уровнем движка оставляет измеримое расхождение между отчитываемыми параметрами и рендеренными семплами.

Defense layers and the cross-check that breaks each one 1. Block AudioContext entirely new AudioContext() throws. Real browsers almost always succeed. Detection: presence of working Web Audio API is itself a baseline check. 2. JS shim noise on getFloatFrequencyData Wraps a few methods, leaves OfflineAudioContext rendering native. Detection: render twice, hashes diverge → noise wrapper detected. 3. Randomize sampleRate or channelCount Reported rate drifts but compressor output still uses real engine numerics. Detection: claimed 48000 Hz · macOS, sample sum matches Windows 44100 Hz row. 4. Engine-level rendering control (BotBrowser) Sample rate, compressor numerics, and AnalyserNode all bound to the same profile. No JavaScript wrapper to detect. No mismatch between reported rate and rendered samples. Same profile + same noise seed reproduces identical sample sums across hosts.

Подход BotBrowser на уровне движка

BotBrowser решает проблему аудио-отпечатков у источника: в самом движке рендеринга Chromium. Вместо перехвата JavaScript-вызовов или внедрения шума из расширения, BotBrowser модифицирует внутреннюю обработку аудио.

При загрузке профиля отпечатка BotBrowser настраивает аудиоподсистему для соответствия целевому устройству. Это включает:

Согласование частоты дискретизации. Свойство AudioContext.sampleRate и фактическая частота дискретизации рендеринга соответствуют целевой платформе профиля. Профиль Windows 10 сообщает и рендерит на частоте дискретизации, типичной для этой конфигурации.

Контроль конвейера обработки. Внутренние узлы обработки аудио (OscillatorNode, DynamicsCompressorNode, BiquadFilterNode и другие) создают выход, согласованный с профилированным устройством. Это не вопрос изменения одного числа. Вся цепочка обработки, включая промежуточную точность float и поведение округления, согласуется с целевой платформой.

Рендеринг OfflineAudioContext. Буфер, отрендеренный OfflineAudioContext, содержит значения сэмплов, соответствующие тому, что произвело бы профилированное устройство. Поскольку BotBrowser контролирует рендеринг на уровне движка, выход согласован вне зависимости от вашего реального оборудования.

Согласованность AnalyserNode. Методы getFloatFrequencyData, getByteFrequencyData, getFloatTimeDomainData и getByteTimeDomainData все возвращают значения, полученные из одного контролируемого конвейера обработки. Нет разрывов, где один API возвращает контролируемый выход, а другой - нативный.

Интеграция noise seed. С флагом --bot-noise-seed BotBrowser применяет детерминистическую вариацию к аудиовыходу. Один и тот же seed всегда создаёт один и тот же аудио-отпечаток, что полезно для поддержания стабильных идентичностей между сессиями. Разные seed создают разные, но внутренне согласованные отпечатки.

Ключевое преимущество этого подхода - полнота. Каждая поверхность API, связанная с аудио, возвращает значения из одного контролируемого движка. Нет несоответствий между тем, что сообщает AudioContext, и тем, что рендерит OfflineAudioContext.

Настройка и использование

Базовая загрузка профиля

Простейшая конфигурация загружает профиль отпечатка, включающий аудиопараметры:

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

Этот единственный флаг настраивает всё поведение, связанное с аудио, в соответствии с профилированным устройством.

Детерминистическое аудио с noise seed

Для воспроизводимых аудио-отпечатков между сессиями:

chrome --bot-profile="/path/to/profile.enc" \
       --bot-noise-seed=42 \
       --user-data-dir="$(mktemp -d)"

Одна и та же комбинация профиля и seed всегда создаёт один и тот же аудио-отпечаток. Измените seed, чтобы получить другой, но по-прежнему согласованный отпечаток.

Интеграция с Playwright

const { chromium } = require('playwright');

const browser = await chromium.launch({
  executablePath: '/path/to/botbrowser/chrome',
  args: [
    '--bot-profile=/path/to/profile.enc',
    '--bot-noise-seed=42'
  ]
});

const page = await browser.newPage();
await page.goto('https://example.com');

Интеграция с Puppeteer

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch({
  executablePath: '/path/to/botbrowser/chrome',
  defaultViewport: null,
  args: [
    '--bot-profile=/path/to/profile.enc',
    '--bot-noise-seed=42'
  ]
});

const page = await browser.newPage();
await page.goto('https://example.com');

Отключение аудиошума

Если вам нужен базовый аудио-отпечаток профиля без дополнительной вариации шума:

chrome --bot-profile="/path/to/profile.enc" \
       --bot-config-noise-audio-context=false \
       --user-data-dir="$(mktemp -d)"

Верификация

Чтобы подтвердить работу защиты аудио-отпечатка, можно сравнить вывод между сессиями.

Проверка согласованности. Запустите одну и ту же процедуру аудио-отпечатка (создайте OfflineAudioContext, отрендерите буфер, просуммируйте сэмплы) в двух отдельных сессиях браузера с одним и тем же профилем и noise seed. Результаты должны быть идентичными.

Проверка на разном оборудовании. Запустите тот же тест на двух разных физических машинах с одним и тем же профилем и seed. Аудио-отпечаток должен совпасть, подтверждая, что ваше реальное оборудование не влияет на вывод.

Проверка полноты API. Убедитесь, что AudioContext.sampleRate, вывод буфера OfflineAudioContext и частотные данные AnalyserNode все согласуются с загруженным профилем. Несоответствия между этими API указывали бы на неполную защиту.

Вы можете посетить сайты тестирования отпечатков, такие как BrowserLeaks или CreepJS, чтобы сравнить ваш аудио-отпечаток с ожидаемыми значениями для загруженного профиля.

Матрица верификации ниже показывает, как выглядит успех на трёх хостах с одним и тем же профилем. Идентичный sampleRate, идентичная сумма семплов компрессора, идентичный хэш AnalyserNode, независимо от оборудования хоста или операционной системы.

Cross-platform verification: same profile, identical audio signature Windows host running BotBrowser profile = mac_arm64.enc seed = 100 sampleRate · channelCount 48000 Hz · 2 CoreAudio (profile) Σ samples: 35.7459816 analyser hash: 7c9bd33f macOS host running BotBrowser profile = mac_arm64.enc seed = 100 sampleRate · channelCount 48000 Hz · 2 CoreAudio (profile) Σ samples: 35.7459816 analyser hash: 7c9bd33f Linux host (Xvfb) running BotBrowser profile = mac_arm64.enc seed = 100 sampleRate · channelCount 48000 Hz · 2 CoreAudio (profile) Σ samples: 35.7459816 analyser hash: 7c9bd33f Один профиль + одно семя = идентичный sampleRate, идентичная сумма компрессора, идентичный хэш AnalyserNode. Отчитываемые и рендеренные значения остаются согласованными.

Лучшие практики

  • Всегда используйте профиль. Запуск BotBrowser без --bot-profile означает, что аудиовыход идёт от вашего нативного оборудования. Именно профиль обеспечивает защиту.
  • Используйте --bot-noise-seed для стабильных идентичностей. Если вам нужен один и тот же отпечаток между сессиями, установите фиксированный seed. Без seed шум варьируется между запусками.
  • Подбирайте профиль под ваш сценарий. Профиль Windows создаёт типичный для Windows аудиовыход. Если ваш прокси IP геолоцирован в регионе, где распространена macOS, рассмотрите профиль macOS.
  • Не отключайте аудиошум без причины. Флаг --bot-config-noise-audio-context=false убирает важный слой вариации. Оставляйте его включённым, если у вас нет конкретной потребности в базовом отпечатке профиля.
  • Комбинируйте с другими защитами. Аудио-отпечатки - один сигнал среди многих. Используйте полный профиль, который также контролирует Canvas, WebGL, шрифты и свойства navigator.

FAQ

В: Требует ли аудио-отпечатки доступ к микрофону? О: Нет. Аудио-отпечатки используют возможности синтеза и обработки Web Audio API. Микрофон не нужен, разрешения не требуются, слышимый звук не создаётся. Всё работает полностью программно.

В: Можно ли обнаружить, запускает ли сайт скрипт аудио-отпечатков? О: В принципе, можно отслеживать создание AudioContext и OfflineAudioContext в DevTools. На практике скрипты отслеживания часто обфусцируют свои вызовы. BotBrowser защищает вас независимо от того, обнаружите ли вы скрипт.

В: Влияет ли noise seed на качество воспроизведения аудио? О: Нет. Noise seed контролирует тонкую числовую вариацию в выходе API, релевантном для отпечатков. Обычное воспроизведение аудио (музыка, видео, голосовые звонки) не затрагивается.

В: Насколько стабилен аудио-отпечаток с фиксированным noise seed? О: Полностью стабилен. Один и тот же профиль и seed всегда создают одни и те же значения аудио-отпечатка между сессиями, перезапусками и на разных машинах.

В: Что происходит при использовании разных noise seed с одним профилем? О: Каждый seed создаёт разный аудио-отпечаток, который по-прежнему внутренне согласован. Это полезно для запуска нескольких сессий, которым нужны отличающиеся, но валидные отпечатки.

В: Защищает ли BotBrowser от отпечатков на основе AudioWorklet? О: Да. AudioWorklet работает внутри того же конвейера обработки аудио, который контролирует BotBrowser. Выход ворклета получен из тех же контролируемых внутренних механизмов движка.

В: Согласован ли аудио-отпечаток между headless и headed режимами? О: Да. Контроль аудио BotBrowser работает на уровне движка, независимо от того, видимо ли окно браузера.

Резюме

Аудио-отпечатки используют естественную вариацию в том, как разные устройства обрабатывают аудиосигналы через Web Audio API. Поскольку это не требует разрешений и не создаёт видимых эффектов, это один из наиболее сложных методов отслеживания для обнаружения или предотвращения. BotBrowser контролирует аудиовыход на уровне движка Chromium, обеспечивая, что AudioContext, OfflineAudioContext и AnalyserNode все выдают результаты, согласованные с загруженным профилем отпечатка. В сочетании с флагом --bot-noise-seed для детерминистического выхода, BotBrowser обеспечивает полную и верифицируемую защиту аудио-отпечатков.

Смежные темы: Что такое браузерные отпечатки, Защита WebGL-отпечатков, Canvas-отпечатки и Детерминистическое поведение браузера.

#Audio#fingerprinting#Audiocontext#Privacy

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.