Если вы смотрели фильм Квентина Тарантино «Бесславные ублюдки», то, вероятно, помните, сцену в баре, когда замаскированный британский шпион выдаёт себя бессознательным жестом.

Хотя он одет в нацистскую униформу и хорошо говорит на немецком, его выдаёт мелкая деталь: его пальцы. При заказе ещё трёх пинт он вместо большого, указательного и среднего пальцев (как показывают немцы) показывает безымянный, средний и указательный. Другой офицер за столом сразу же понимает по этой незначительной детали, что человек определённо из англоговорящей страны.


Неотъемлемая угроза мелких деталей.

То же самое справедливо и для любой работы в онлайне. Если упустить из виду мелкие, но важные аспекты, то легко можно потерять бдительность и выдать свою личность. В этой статье мы совершим путешествие в мир распознавания устройств, и покажем, почему попытки имитировать другое устройство сегодня становятся практически невозможными.

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

Почему системы пытаются распознавать устройства?


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

Наш старый друг User-Agent сохранился с той эпохи, однако сегодня техники распознавания и защиты от имитаций стали гораздо более сложными.

Большинство сайтов используют механизмы распознавания, чтобы помочь обслуживанию своих клиентов. Например, Netflix поддерживает сотни различных форматов видео в разных разрешениях для каждого устройства, от мобильных телефонов до Smart TV. Как этого можно было бы добиться без распознавания устройств?

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

Но зачем люди и боты пытаются мимикрировать под устройства?


Задаваемые нами вопросы подвели нас к этому, и ответ содержится в вопросе. Люди или боты хотят получить больше элементов, специфичных для определённых устройств, или хотят вырваться из так называемых «гетто устройств» (например, они стремятся к тому, чтобы функции на мобильном устройстве не были ограничены). Кроме того, некоторые злоумышленники пытаются воспользоваться тем, что для некоторых устройств меры защиты не так строги.

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

Гонка вооружений: распознавание и защита


Перенесёмся в современность: сейчас идёт метафорическая «гонка вооружений» между теми, кто пытается распознавать устройства и теми, кто пытается предотвратить такое распознавание. Хотя это привело к росту инвестиций в продвинутые технологии, например, машинное обучение и ИИ, есть и другие методики, которые привлекли к себе на удивление мало внимания, например, методика классификации Google под названием Picasso. Ниже мы рассмотрим её подробно, но для начала давайте перечислим те крошечные детали, которые могут выдать вас за доли секунды.

Почему спуфинг устройств не всегда срабатывает?


Можно использовать различные способы спуфинга устройств, от изменения строк User-Agent до применения более сложных техник, но это означает, что и существуют другие способы их распознавания.

Вы сидите с телефона? Да неужели?


Многие считают, что для спуфинга устройств достаточно изменить строку User-Agent; мы им отвечаем: «легко сказать, предоставьте доказательства!»

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

Вы можете представить смартфон, не имеющий сенсорного экрана?

Проверьте своё решение вот на этом коде.

var touch_capable = ( 'ontouchstart' in window ) || 
           ( navigator.maxTouchPoints > 0 ) || 
           ( navigator.msMaxTouchPoints > 0 );

if(touch_capable) {
  alert("Supported");
} else {
	alert("Not Supported");
}

Как мы и сказали, специфичные для устройства функции и информация крайне важны. Если ты заявляешь, что используешь Apple iPhone 6, то должен знать специфичные для устройства подробности, как минимум, размер экрана iPhone 6.

Вы когда-нибудь видели iPhone 6 с разрешением экрана 1920?1080? Мы нет, и наши системы распознавания тоже!


Ещё один пример: никто не посчитает странным, что у тебя MacBook, если ты успешно пройдёшь тест navigator.platform:


Однако ты не можешь заявлять, что одновременно пользуешься Max OS X и Windows!

Есть и множество других аномалий, которые легко недоглядеть при спуфинге устройства. Если вы когда-нибудь пользовались мобильным браузером (а вы конечно пользовались), то знаете, что менять размер окна браузера нельзя. Оно всегда открыто, развёрнуто и занимает весь экран. То есть значения X и Y окна всегда должны быть 0, и если это не так…

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

Эмодзи: ваши чувства вас предают?


Вы знали, что эмодзи, несмотря на то, что вводятся одинаково, на различных устройствах визуализируются по-разному?

Например, вот эмодзи улыбки, вводимый символами : и ), которые ваша система преобразует в милую картинку.

Посмотрите, как этот милый символ отображается в разных системах и устройствах.


Источник: Emoji Unicode characters for use on the web

Допустим, ваш клиент утверждает, что он запущен на ОС Android. Система распознавания может получить значение хэша эмодзи и сравнить его с хэшем, полученным от настоящей системы Android. Если результат неодинаков, то это даёт понять, что вы спуфите устройство. Настоящая магия! Достаточно использовать U+1F600 и при создании визуализации добавить значение, выделяющее вас на фоне остальных.

Вот хэшированная версия эмодзи улыбки U+1F600 с разных устройств.


Это хэшированные при помощи sha256 одинаковые эмодзи, полученные из разных версий Google Chrome в ОС Windows 10.


Совпадают ли шрифты?


В каждой системе есть заранее установленные шрифты, и некоторые из них используются по умолчанию. Например, хотя в iOS 13 Academy есть заранее установленный шрифт Engraved LET Plain:1.0, в ней нет Al Bayan Bold. Однако последний присутствует в macOS Catalina!

Аналогично, Tahoma был стандартным шрифтом в Windows XP, а начиная с Vista им стал Segoe UI. В последнем списке шрифтов для Windows 10 компании Microsoft есть примечание:

"Обратите внимание: не все десктопные шрифты будут присутствовать в недесктопных версиях Windows 10, например, Xbox, HoloLens, SurfaceHub, и т.д."

Поэтому системы распознавания, проверяющие шрифты, сразу могут понять, что вы не используете обычную Windows 10, если они не нашли шрифты, перечисленные на странице Microsoft.

PUF! (Psychically Unclonable Functions)


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

Однако у этой монеты есть и другая сторона.

В 2006 году Эли Бурштейн из отдела Google, занимающегося защитой от ненадлежащего использования, опубликовал свою работу под названием Picasso, в которой подробно описал, как Google борется с попытками спуфинга устройств в Google Play.

Google Picasso предназначен для определения классификации устройства, на котором используется браузер, при помощи операций рендеринга, сильно зависящих от ОС и графического оборудования. Используя порождающее значение (seed), Picasso случайным образом создаёт на canvas геометрические символы. Для работы Picasso используются такие значения, как seed, округление, ширина и высота. Благодаря этому Picasso может получить графический результат, созданный при помощи функций клиента, которые невозможно склонировать, например, операционной системой и графическим оборудованием. Спуфер не может этому препятствовать, только если не имеет полностью аналогичной системы.


Псевдокод Picasso из статьи Эли Бурштейна

Эта система не работала бы без базы данных, содержащей заранее вычисленные значения, полученные при помощи настоящих устройств. Позже эта база данных используется для сравнения с эталонными значениями.


Здесь стоит отметить важные аспекты работы Picasso. Например, он создаёт графический результат при помощи canvas HTML. Люди склонны считать, что canvas используется для повышения энтропии фингерпринта, чтобы обеспечить уникальность устройства. Как пару лет назад доказали инженеры Multilogin, хэш canvas не обеспечивает уникальные фингерпринты, а идентичен в системах, имеющих одинаковые ингредиенты, например, «железо». В 2006 году ребята из Google начали использовать эту особенность фигнерпринтинга по canvas для классификации устройств, чтобы распознавать попытки спуфинга устройств.


Разница в рендеринге между Safari на настоящем iPhone и на эмуляторе.

Хотя эта работа довольно старая (2006 год), её используют в Cloudflare. Picasso можно считать неотвратимым механизмом борьбы с попытками спуфинга устройств, имеющим значительную долю рынка.

Если на стороне сервера есть база данных, состоящая из заранее вычисленных хэшей, полученных на настоящих устройствах, при попытках спуфинга устройств и операционных систем от Picasso сложно уклониться.



На правах рекламы


Создание виртуальных серверов с защитой от DDoS-атак и новейшим железом. Максимальная конфигурация — 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe.

Подписывайтесь на наш чат в Telegram.