Canvas-шум звучит умно, но наивная рандомизация делает вас заметнее. Узнайте, как farbling в Brave обходит эту ловушку и что реально работает.
Canvas-шум — практика внедрения небольших случайных отличий в пиксельные данные, которые браузер возвращает при чтении холста отслеживающим скриптом, — звучит как изящное решение. Меняй хеш каждый раз — и трекер никогда не привяжет к вашему устройству стабильный идентификатор. На практике всё сложнее: плохо спроектированный шум обнаруживается за два вызова API, а сам факт обнаружения уже позволяет классифицировать вас как пользователя инструментов конфиденциальности. Эта статья объясняет, как работает шум, почему рандомизация может дать осечку, чем структурированный шум отличается от наивной случайности, и как farbling в Brave обходит большинство ловушек — хотя и оставляет кое-какой след.
Ключевые выводы
- Canvas-шум призван разрушить стабильный фингерпринт путём рандомизации пикселей, которые считывает трекер.
- Наивная рандомизация обнаруживается за два вызова API: если одно и то же полотно каждый раз возвращает разные пиксели, кто-то модифицирует вывод.
- Структурированный шум — зависящий от сессии и источника (как farbling в Brave) — устраняет этот изъян, но всё равно выдаёт наличие защиты.
- Унификация — когда ваш Canvas-вывод совпадает с большой группой пользователей — обеспечивает более надёжную анонимность, чем рандомизация.
- Величина шума важна: слишком большой — статистически очевиден; слишком маленький — усредняется при многократной выборке.
Как работает Canvas-шум
Скрипт Canvas-фингерпринтинга рисует фиксированную сцену и считывает пиксели через toDataURL() или getImageData(). Эти пиксели кодируют ваш GPU, движок шрифтов и драйвер видеокарты — аппаратные характеристики, которые не меняются между загрузками страниц. Инструменты Canvas-шума перехватывают чтение и изменяют возвращаемые данные до того, как они попадут к скрипту.
Есть два основных подхода к изменению данных:
Блокировка или обнуление. Вернуть пустой холст, полностью белый результат или выбросить ошибку. Это полностью останавливает фингерпринтинг, но сразу же бросается в глаза: пустой результат сам по себе является фингерпринтом — все посетители с такой настройкой выглядят одинаково. Простая проверка data.every(b => b === 0) это обнаружит.
Внедрение шума. Сохранить реальные пиксели, но слегка изменить их — например, добавить ±1 или ±2 к случайным RGB-каналам — чтобы хеш менялся, а визуальный результат оставался правдоподобным. Большинство расширений конфиденциальности (CanvasBlocker, JShelter) и farbling в Brave используют вариант именно этого подхода.
Ключевой вопрос дизайна: как генерируется начальное значение для шума? От стратегии зерна зависит, можно ли обнаружить и обратить шум.
Почему наивную рандомизацию легко обнаружить
Предположим, инструмент шума генерирует новое случайное зерно при каждом вызове API. Вызовите getImageData() дважды для одного и того же неизменённого холста — и получите два разных массива байт. В настоящем браузере такого никогда не происходит: холст — это растровое изображение, и при двух последовательных чтениях без каких-либо операций рисования между ними результаты идентичны. Скрипт фингерпринтинга, дважды вызвавший API и сравнивший результаты, немедленно заключает: шум присутствует.
Это не теоретическая атака. Библиотеки Canvas-фингерпринтинга проверяют именно это, потому что такая проверка надёжно отличает изменённые данные от неизменённых. Даже если скрипт не может восстановить реальный хеш, он теперь знает, что вы используете защиту холста — а это знание само по себе является сигналом. В некоторых системах классификации «подтверждённый пользователь инструментов конфиденциальности» ценнее стабильного хеша, поскольку соответствует специфической, более узкой аудитории.
Помимо теста двойного чтения, наивная рандомизация имеет второй изъян: распределение шума само по себе является фингерпринтом инструмента. Если ваш шум равномерно ±1 на канал с определённым алгоритмом зернения, статистические свойства возвращаемых пикселей — среднее смещение, дисперсия, корреляция каналов — позволяют идентифицировать конкретное расширение и версию. Два пользователя, запускающих одну и ту же сборку CanvasBlocker с одинаковыми настройками, производят статистически схожие компоненты шума, отличая их от реальных GPU-вариаций даже при разном базовом железе.
Структурированный шум: более умная альтернатива
Структурированный шум заменяет случайность при каждом вызове детерминированным зерном, которое удовлетворяет трём свойствам:
- Согласованность в рамках сессии. Два чтения одного и того же холста в течение одной браузерной сессии возвращают одинаковые зашумлённые байты. Тест двойного чтения проходит.
- Уникальность по источнику. Шум, применяемый на
bank.com, отличается от шума наshop.com, поэтому сторонний трекер, встроенный на оба сайта, не может связать Canvas-хеши между ними. - Непредсказуемость между сессиями. Новая браузерная сессия использует новое зерно, разрывая межсессионное отслеживание.
С таким дизайном обнаружение двойного чтения перестаёт работать. Шум стабилен и внутренне согласован, поэтому его гораздо сложнее отличить от реальных GPU-вариаций. Межсайтовые и межсессионные связи разрываются.
Ценой является то, что структурированный шум всё равно сигнализирует о том, что что-то модифицирует вывод Canvas. Противник, сравнивающий массивы пикселей многих пользователей с эталоном, может обнаружить статистические закономерности, соответствующие небольшим детерминированным смещениям — но для этого нужен известный эталон для точной аппаратной конфигурации каждой жертвы, которого у удалённого сервера нет.
Farbling в Brave: как это работает
Farbling в Brave — это продакшн-реализация структурированного шума, встроенная непосредственно в браузер, а не поставляемая как пользовательское расширение. Это расположение критически важно: поскольку farbling работает ниже уровня JavaScript, никакой скрипт не может отличить farbled-чтения от реального поведения браузера путём проверки цепочек прототипов или замера времени API.
Дизайн зернения реализует все три свойства структурированного шума:
- Секрет установки. При установке генерируется случайное зерно, надёжно хранящееся в профиле браузера. Оно не меняется, пока профиль не будет сброшен.
- Деривация по источнику. Секрет установки комбинируется с хешем eTLD+1 текущего сайта, создавая уникальный профиль шума для каждого сайта. Трекер на
adnetwork.comвидит иной Canvas-хеш, чем тот же трекер наnews.com, даже если базовое железо не изменилось. - Случайное число сессии. В начале сессии подмешивается новое случайное значение, которое ротирует профиль при каждом перезапуске браузера, предотвращая межсессионную корреляцию.
Возмущение пикселей невелико — обычно ±1 на случайно выбранных цветовых каналах — что делает визуальный вывод неотличимым от немодифицированного рендеринга. Brave применяет farbling к WebGL, аудио и нескольким другим поверхностям фингерпринтинга наряду с холстом, поэтому Canvas-шум не выделяется на фоне нормально выглядящего набора сигналов.
Можно ли обратить farbling?
Для восстановления оригинального Canvas-хеша нужно знать ожидаемые пиксельные значения для точного железа жертвы — модели GPU, версии драйвера, движка шрифтов ОС и версии браузера. Удалённый сервер не может сгенерировать этот эталон без физического доступа к тому же железу. Усреднение по сессиям тоже не помогает: случайное число сессии гарантирует, что повторные визиты дают разные смещения, поэтому среднее двух farbled-чтений не ближе к истинному хешу, чем любое отдельное чтение.
Тем не менее farbling не является необнаруживаемым на уровне популяции. Исследования больших корпусов фингерпринтов показали, что Canvas-выводы пользователей Brave кластеризуются иначе, чем стандартный Chromium, — паттерн возмущений является мягким, но реальным индикатором того, что используется именно Brave. Вы по-прежнему идентифицируетесь как пользователь Brave — группа в десятки миллионов, а не миллиарды — но индивидуальное отслеживание фактически нарушено. Cover Your Tracks от EFF — публичный инструмент, позволяющий увидеть, что именно трекеры наблюдают в вашем браузере, включая то, выглядит ли ваш Canvas-вывод стабильным или рандомизированным.
Унификация vs. рандомизация: более глубокий компромисс
Farbling в Brave — одна из лучших доступных реализаций шума, однако она подчёркивает структурное противоречие в защите от фингерпринтинга: рандомизация ограничивает то, что трекер может сделать с вашим фингерпринтом, тогда как унификация полностью устраняет фингерпринт как сигнал.
Tor Browser защищает Canvas иначе. Он возвращает стандартизированное, почти пустое значение для каждого пользователя, так что все пользователи Tor выглядят одинаково для трекера. Нет шума, нет вариаций хеша, нет статистической сигнатуры — только отсутствие значимых данных холста. Трекер ничего не узнаёт о вашем конвейере рендеринга, и вы растворяетесь в анонимном множестве Tor. Компромисс — более ограниченный опыт работы в браузере и явный сигнал о том, что вы используете Tor.
Для пользователей, желающих разрушить повседневное межсайтовое рекламное отслеживание, сохраняя нормальный браузинг, farbling хорошо справляется с этой задачей. Для пользователей, которым необходима полная незаметность в высокорисковых сценариях, унификация является более сильной позицией. Комбинирование обоих подходов — применение farbling в сессии Tor — на самом деле может навредить, поскольку нарушает унификацию, на которой строится защита Tor.
Полная картина того, как Canvas сочетается с WebGL, аудио и другими сигналами в сводную оценку фингерпринта, представлена в нашем руководстве по обнаружению Canvas-фингерпринта и объяснении браузерного фингерпринтинга.
Часто задаваемые вопросы
Может ли отслеживающий скрипт обратить шум и восстановить мой реальный Canvas-хеш?
На практике — нет. Для восстановления настоящего хеша нужен эталонный рендеринг с точного железа жертвы: модели GPU, версии драйвера, движка шрифтов ОС и версии браузера. Удалённый сервер не может это воспроизвести. Усреднение по сессиям также не работает с farbling в Brave, поскольку случайное число сессии меняет смещение при каждом перезапуске.
Защищает ли Canvas-шум от всех видов фингерпринтинга?
Нет. Canvas — лишь один из многих сигналов. Даже если Canvas-шум разрушает хеш холста, ваша строка WebGL-рендерера, список шрифтов, разрешение экрана и аудиофингерпринт остаются неизменными. Трекер, имеющий доступ к этим другим сигналам, зачастую всё равно может существенно сузить ваше анонимное множество.
Так же ли хорош CanvasBlocker, как farbling в Brave?
Оба могут использовать структурированный шум, но реализация Brave сложнее для обнаружения и обхода: она работает ниже уровня JavaScript API, поэтому скрипт не может отличить её от реального поведения браузера, проверяя цепочку прототипов. Пользовательское расширение патчит прототипы JavaScript на уровне, который могут зондировать сложные скрипты. CanvasBlocker с включённым структурированным шумом существенно лучше наивной рандомизации или обнуления, но не эквивалентен защите на уровне браузера.
Как проверить, выглядит ли мой Canvas-вывод зашумлённым или стабильным?
Запустите инструмент проверки фингерпринта BrowserInsight. Он вычисляет ваш актуальный Canvas-хеш, показывает, выглядит ли значение стабильным, и оценивает уникальность вашего общего фингерпринта относительно распространённых конфигураций.


