← Все статьи

Как читать результат CreepJS, раздел за разделом

4 мин чтения fingerprintingdetectionguide

Вы открываете CreepJS, страница заполняется хешами, процентами и красным списком «lies», и непонятно, что из этого важно. Большинство инструкций относятся к нему как к табелю с оценками. На деле это скорее отладчик подмены отпечатков, и если читать его так, он рассказывает намного больше.

Официальная версия живёт по адресу abrahamjuliot.github.io/creepjs. В README проекта, прочитанном 22 октября 2026 на github.com/abrahamjuliot/creepjs, прямо сказано, что другие домены с этим названием неавторизованные зеркала. Цель проекта сформулирована как поиск слабых мест и утечек в современных расширениях и браузерах против фингерпринтинга, а первые две задачи в списке: обнаруживать и игнорировать подмену в JavaScript и снимать отпечаток с самих паттернов лжи. Помните об этом: страница сделана, чтобы ловить инструменты вроде нашего.

В старых разборах упоминается оценка «trust score». В текущем исходном коде, который мы прочитали, её нет, так что если руководство советует добиваться определённого процента доверия, оно описывает другую версию страницы.

FP ID и Fuzzy: что попадает в отпечаток, а что отбрасывается

В шапке два хеша.

FP ID строится из собранных разделов, но с важной деталью, которая видна в исходниках: если раздел помечен как солгавший, его значения в хеш не попадают. Солгал раздел navigator, и данные navigator не учитываются. Солгал canvas, и картинки canvas не учитываются. Это и есть задача «обнаружить и проигнорировать подмену», записанная в коде.

Практическое следствие идёт против интуиции. Подмена значения через JavaScript обычно не даёт нового FP ID. Она убирает это значение из идентификатора и добавляет запись в список lies, а всё, что вы не подменили, продолжает вас идентифицировать. Два профиля, которые одинаково подменяют canvas на одном и том же железе, могут получить один и тот же FP ID.

Fuzzy это второй хеш из фиксированного списка метрик (canvas, WebGL, DOMRect, CSS, ошибки консоли и другие), устроенный так, что изменение в одной области меняет только его часть. По нему видно, какие области сдвинулись между двумя запусками.

Список lies

Это раздел, ради которого стоит открывать страницу. CreepJS проходит по длинному списку свойств API и для каждого проверяет, ведёт ли оно себя как нативный код браузера. Проверки в исходниках называются failed toString, failed descriptor, failed own property, failed "prototype" in function, failed class extends error, failed at incompatible proxy error и так далее.

Каждая из них ловит способ, которым подмена себя выдаёт. У нативного геттера нет свойства prototype, при вызове на чужом объекте он бросает вполне определённый TypeError, а его дескриптор имеет строго определённую форму. Функция, заменённая в JavaScript или обёрнутая в Proxy, почти всегда ошибается хотя бы в одной из этих деталей. Каждая такая ошибка записывается напротив API, где её нашли, например Navigator.hardwareConcurrency.

Ложь в этом списке не означает, что значение неверное. Она означает, что значение выдал код, который не является собственным кодом браузера.

Headless, like headless, stealth

Три процента, каждый показывает долю сработавших проверок в своей группе:

Группа stealth напрямую проверяет патчи в стиле плагинов, на которых держатся многие сетапы автоматизации.

Worker scope

CreepJS заново читает user agent, платформу, объём памяти, число ядер, язык, часовой пояс и видеокарту внутри Web Worker и сравнивает с основной страницей. Скрипты подмены обычно патчат страницу и забывают про воркер, и воркер сообщает настоящую машину. Расхождения записываются как lies против WorkerGlobalScope по ОС, движку, версии и версии платформы.

Почему чистая страница CreepJS это не успех

Результат без lies и с 0% stealth говорит лишь о том, что ваша подмена не видна именно этим проверкам. Он ничего не сообщает о том, из дата-центра ли ваш IP, совпадает ли с ним часовой пояс, соответствует ли TLS-отпечаток заявленному браузеру и как ведёт себя аккаунт. Коммерческие системы оценки риска придают этому большой вес и свои модели не публикуют. CreepJS к тому же исследовательский проект со своими эвристиками. Реальный сайт может проигнорировать ложь, которую он отметил, или поймать то, чего он не видит.

Когда CreepJS не тот инструмент

Если вы ничего не подменяете, например пользуетесь обычным браузером на своей машине, разделу lies искать нечего, и страница превращается в демонстрацию энтропии. На вопрос «течёт ли прокси» быстрее ответят whoer.net или browserleaks. На вопрос «пустит ли меня этот сайт» ответит только сам сайт.

Используйте как сравнение, а не как оценку

Запустите CreepJS дважды в одном профиле, затем ещё раз после перезапуска и сравните FP ID, fuzzy-хеш и список lies. У стабильной личности эти значения не меняются. Потом запустите его во втором профиле и убедитесь, что идентификаторы различаются. Остальные пары для сравнения перечислены в чек-листе согласованности.

Попробуйте на бесплатном тарифе.

Неограниченное число локальных профилей, без карты. Проверьте результат детекторами сами.