Аудіо-контекст та шрифти: Забуті вектори детекції мультиакаунтів

· 12 хв читання
audio fingerprinting font fingerprinting AudioContext детекція мультиакаунт антидетект
Аудіо-контекст та шрифти: Забуті вектори детекції мультиакаунтів

Готові захистити свою цифрову особистість?

Оберіть тариф і запускайте непомітні профілі вже сьогодні.

Почати

Більшість операторів антидетект-браузерів зосереджені на “великих” векторах фінгерпринтингу — canvas, WebGL, User-Agent. І поки вони ретельно налаштовують GPU профілі та Client Hints, детектори тихо фіксують AudioContext осциляції та шрифтові метрики. Ці два вектори залишаються в сліпій зоні більшості захисних рішень — і саме тому вони такі ефективні для детекції.

AudioContext: наука за звуковим відбитком

AudioContext fingerprinting — один із найточніших методів ідентифікації браузера, і при цьому один із найменш відомих серед практиків. Принцип роботи: Web Audio API використовує звукові алгоритми обробки, результати яких залежать від апаратного та програмного забезпечення пристрою.

Базовий тест виглядає так:

const context = new AudioContext();
const oscillator = context.createOscillator();
const analyser = context.createAnalyser();
const gain = context.createGain();
const scriptProcessor = context.createScriptProcessor(4096, 1, 1);

gain.gain.value = 0; // тихо — без реального звуку
oscillator.type = 'triangle';
oscillator.connect(analyser);
analyser.connect(scriptProcessor);
scriptProcessor.connect(gain);
gain.connect(context.destination);

oscillator.start(0);

Результат аналізу FFT-буфера analyser — унікальний числовий підпис, який залежить від реалізації звукових алгоритмів в ОС, драйверів аудіо, процесорної архітектури та навіть компілятора, яким зібрано браузер.

Чому такий рівень точності? Web Audio обробка включає DSP (Digital Signal Processing) алгоритми — FFT, convolution, biquad фільтри. Їх реалізація в різних браузерах та на різному залізі дає мікровідмінності в результатах обчислень з плаваючою точкою. Windows з WASAPI стеком дає інший результат, ніж macOS з CoreAudio, ніж Linux з ALSA.

Шари AudioContext fingerprinting

AudioContext fingerprint складається з кількох рівнів, і кожен дає незалежну точку ідентифікації.

Рівень 1: Oscillator output. Різні браузерні рушії обчислюють форми хвиль по-різному. Triangle wave на Blink (Chrome) vs Gecko (Firefox) vs WebKit (Safari) — різні числові послідовності в FFT виводі. Але навіть два Chrome браузери можуть давати різні результати на різному залізі через специфіку floating-point у CPU.

Рівень 2: SampleRate та baseLatency. AudioContext.sampleRate визначається аудіо-пристроєм системи. Типові значення: 44100 Hz (більшість систем), 48000 Hz (HDMI output або певні USB DAC), 22050 Hz (деякі мобільні пристрої). baseLatency відображає буферний розмір системи — різний для різних аудіо-конфігурацій.

Рівень 3: AudioParam granularity. Деякі сайти перевіряють як саме AudioParam.value округляється при установці. Реальні браузери мають специфічні правила precision, які залежать від реалізації.

Рівень 4: Timing fingerprint. AudioContext.currentTime збільшується з фіксованою частотою, але точність цих таймерів різна. Деякі детектори вимірюють drift між AudioContext.currentTime та performance.now().

Font Fingerprinting: складніше, ніж здається

Шрифти — класичний вектор фінгерпринтингу, але сучасні методи набагато витонченіші від простого переліку встановлених шрифтів.

Метод 1: Наявність шрифтів через CSS. Класичний підхід — рендерувати текст у прихованому елементі різними шрифтами та вимірювати розміри. Якщо розмір відрізняється від базового (fallback) шрифту — шрифт встановлено. Цей метод дозволяє перевірити сотні шрифтів за секунди.

function hasFont(fontName) {
  const s = document.createElement('span');
  s.innerHTML = 'mmMMMWWW';
  s.style.position = 'absolute';
  s.style.width = 'auto';
  s.style.fontSize = '300px';
  s.style.fontFamily = 'monospace'; // baseline
  document.body.appendChild(s);
  const baseWidth = s.offsetWidth;
  s.style.fontFamily = `'${fontName}', monospace`;
  const fontWidth = s.offsetWidth;
  document.body.removeChild(s);
  return baseWidth !== fontWidth;
}

Метод 2: Canvas font rendering. Рендеринг тексту через Canvas з конкретним шрифтом та аналіз пікселів — дозволяє виявити не просто наявність шрифту, а точні метрики рендерингу: kerning, hinting, anti-aliasing. Ці метрики різні навіть для однакового шрифту на різних ОС.

Метод 3: document.fonts.check(). CSS Font Loading API дозволяє програмно перевіряти наявність шрифтів. document.fonts.check('16px Arial') повертає true якщо Arial доступний. Детектори використовують це для швидкого сканування.

Метод 4: document.fonts enumeration. В деяких браузерах можна ітерувати document.fonts для отримання списку завантажених шрифтів. Хоча це обмежено веб-шрифтами та системними шрифтами, завантаженими сторінкою, поєднання з іншими методами дає точну картину.

Чому шрифти видають ОС точніше за User-Agent

Набір системних шрифтів — найнадійніший індикатор операційної системи. Windows 11 поставляється зі специфічним набором шрифтів (Segoe UI Variable, Cascadia Code), macOS Ventura має свій набір (SF Pro, New York), Ubuntu — свій (Ubuntu font family, Liberation Sans). Ці набори перетинаються, але не збігаються.

Ось чому шрифтовий фінгерпринт такий небезпечний: якщо ваш профіль заявляє Windows 11, але список виявлених шрифтів відповідає macOS — це невідповідність, яку не покриває підміна User-Agent.

Реальний набір системних шрифтів для Windows 11 (підмножина для перевірки):

  • Arial, Times New Roman, Courier New — universal
  • Segoe UI, Segoe UI Variable — Windows-specific
  • Calibri, Cambria, Candara — Microsoft Office fonts
  • Cascadia Code, Cascadia Mono — Windows Terminal fonts
  • Gabriola, Consolas — Windows-only system fonts

Для macOS Ventura:

  • Helvetica Neue, Geneva — macOS-specific
  • SF Pro Display, SF Compact — Apple system fonts (не доступні на Windows)
  • New York — Apple serif font
  • Hoefler Text — macOS-exclusive

Антидетект-браузер, що правильно підміняє UA на Windows 11, але виявляє SF Pro Display серед доступних шрифтів — миттєво розкривається.

Векторний аналіз: поєднання AudioContext та Font

Найсучасніші детектори не аналізують вектори окремо — вони будують мультивимірні профілі. AudioContext + Font fingerprint + Canvas + WebGL утворюють комбінований підпис, де кожен вектор підтверджує або спростовує інші.

Приклад атаки: профіль заявляє macOS 14 на Apple Silicon. Детектор перевіряє:

  1. AudioContext sampleRate — 48000 Hz (типово для Apple Silicon Macs)
  2. Наявність шрифтів SF Pro — так (правильно)
  3. WebGL renderer — “Apple M2” (правильно)
  4. Canvas — детерміновано, без артефактів Windows

Якщо один із цих елементів не збігається — профіль помічається як підозрілий. Якщо AudioContext дає sampleRate 44100 (типово для не-Apple пристроїв), але все інше каже macOS — невідповідність.

Практика захисту: що реально працює

AudioContext захист: правильний підхід — детерміноване спотворення результатів аудіо-обробки на основі seed профілю, а не рандомний шум. Seed визначає конкретні offset значення, які додаються до FFT результатів — результат стабільний між сесіями (реалістично), але унікальний для кожного профілю.

Santiago використовує audio:seed конфігурацію в Camoufox: seed=0 вимикає шум (реальний аудіо-вихід), позитивний seed дає детермінований унікальний вихід для кожного профілю. Для більшості операцій рекомендується унікальний позитивний seed на профіль.

Важливо: повна блокування AudioContext (new AudioContext() кидає помилку) — погана ідея. Багато легітимних сайтів використовують AudioContext для відтворення звуку та UI feedback. Блокування спричиняє функціональні зломи та саме по собі є детекційним сигналом.

Font захист: антидетект має надавати список шрифтів, узгоджений із декларованою ОС. Santiago дозволяє задати конкретний список шрифтів для профілю — цей список має відповідати реальному набору шрифтів для обраної ОС.

Для Windows 11 профілю — список шрифтів Windows 11. Для macOS Ventura — список macOS Ventura. Не треба включати всі шрифти — достатньо ключових маркерних шрифтів (SF Pro для macOS, Segoe UI Variable для Windows) плюс загальний набір.

Критична помилка: надто малий список шрифтів. Якщо профіль Windows 11 видає лише 10 шрифтів, тоді як реальна Windows 11 має 100+, детектор фіксує аномалію. Але і надмірно великий список (більше, ніж типово для ОС) — теж підозрілий.

SpeechSynthesis: третій забутий вектор

Пов’язаний із AudioContext вектор — SpeechSynthesis API. speechSynthesis.getVoices() повертає список доступних голосів для text-to-speech, і цей список специфічний для ОС.

Windows 11 має голоси: Microsoft David, Microsoft Zira, Microsoft Mark (US English) плюс мовні голоси. macOS: Alex, Samantha, Victoria, Fred, Karen, Moira, Rishi та десятки інших. Linux: залежить від встановлених пакетів, часто порожній список.

Якщо профіль заявляє macOS, але getVoices() повертає Microsoft David — невідповідність очевидна.

Santiago керує SpeechSynthesis через init script, що обмежує getVoices() до ОС-специфічного списку. Windows профілі отримують David/Zira/Mark, macOS профілі — Alex та відповідний набір.

Timing attacks через AudioContext

Окремий клас атак — timing-based fingerprinting через AudioContext. Створення та ініціалізація AudioContext займає різний час залежно від системи. Деякі детектори вимірюють performance.now() до та після new AudioContext():

  • Дуже швидко (< 1ms): підозріло — може бути mocked
  • Дуже повільно (> 100ms): підозріло — може бути virtualized
  • Нормально (5-30ms): типово для реального браузера

Аналогічно, час виконання аудіо-обробки через ScriptProcessorNode або AudioWorklet — предикативний для конкретної системи.

Висновок: комплексний підхід обов’язковий

AudioContext та Font fingerprinting — не другорядні вектори. Вони входять до топ-5 найнадійніших методів ідентифікації браузера за даними дослідників AmIUnique та FPmon. При цьому більшість антидетект-рішень або ігнорують їх, або реалізують захист неправильно (рандомний шум замість детерміністичного спотворення, неправильний список шрифтів).

Правильна реалізація вимагає:

  • Детермінованого, seed-based AudioContext виходу (унікального, але стабільного на профіль)
  • Шрифтового списку, узгодженого з декларованою ОС
  • SpeechSynthesis голосів, що відповідають ОС
  • Узгодженості всіх цих векторів між собою та з іншими параметрами профілю

Пропустити один із цих векторів — означає залишити дірку, якою скористаються детектори.

Готові захистити свою цифрову особистість?

Оберіть тариф і запускайте непомітні профілі вже сьогодні.

Отримуйте 15% довічну комісію з кожного реферала.

Стати партнером →