Перейти к содержимому
Глоссарий 8 мин чтения 1 просмотров

JARM Fingerprint

JARM Fingerprint — мощный инструмент для уникальной идентификации TLS-серверов и прокси. Узнайте о его работе и применении для безопасности.

Безопасность

JARM fingerprint — это уникальный криптографический отпечаток TLS-сервера, генерируемый на основе последовательности Client Hello запросов, который позволяет идентифицировать тип, версию и конфигурацию сервера, а также выявлять прокси-серверы и другие сетевые устройства.

Что такое JARM Fingerprint?

JARM (Just Another Response Management) fingerprint — это метод активной идентификации TLS-серверов, разработанный Salesforce. Он позволяет создавать уникальный «отпечаток» TLS-стека сервера, анализируя его ответы на серию специально сформированных TLS Client Hello запросов. В отличие от JA3, который фокусируется на исходящих Client Hello для идентификации клиента, JARM анализирует входящие Server Hello для идентификации сервера.

Цель JARM — получить достаточно информации о конфигурации TLS-сервера, чтобы однозначно определить его программное обеспечение, версию, операционную систему, а также выявить наличие промежуточных устройств, таких как прокси, балансировщики нагрузки или CDN.

Принцип работы JARM

Процесс генерации JARM fingerprint включает следующие шаги:

  1. Отправка 10 уникальных Client Hello запросов: Инструмент JARM отправляет целевому серверу десять различных Client Hello пакетов. Каждый из этих пакетов тщательно сконструирован с различными комбинациями:
    • Версий TLS (от TLS 1.0 до TLS 1.3).
    • Наборов шифров (cipher suites).
    • TLS-расширений (extensions) и их порядка.
    • Параметров, таких как supported_groups, signature_algorithms и key_share.
  2. Анализ Server Hello ответов: Для каждого из десяти Client Hello запросов JARM регистрирует и анализирует соответствующий Server Hello ответ от целевого сервера. Основные параметры, извлекаемые из Server Hello, включают:
    • Выбранная версия TLS.
    • Выбранный набор шифров.
    • Список и порядок TLS-расширений, поддерживаемых сервером.
    • Длина поля Server Random.
    • Версия SSL-записи (SSL record version).
  3. Формирование хеша: Полученные данные из десяти Server Hello ответов конкатенируются и затем хешируются. Результатом является 62-символьная строка, которая и представляет собой JARM fingerprint. Каждая часть fingerprint кодирует информацию о реакции сервера на одну из десяти проб.

Пример JARM fingerprint: 07d07d0000000007d37d12a20b22a20b22a20b22a20b22a20b2.

Структура JARM Fingerprint

JARM fingerprint представляет собой 62-символьную шестнадцатеричную строку. Она состоит из 10 сегментов по 6 символов, плюс 2 символа в конце. Каждый 6-символьный сегмент кодирует информацию о Server Hello ответе на одну из 10 отправленных проб.

Кодирование сегмента:

Каждый 6-символьный сегмент кодируется следующим образом:

  • Первые 2 символа (1 байт): Выбранная версия TLS и версия SSL-записи.
    • Например, 07 может означать TLS 1.2 с SSL record version 1.2.
  • Следующие 2 символа (1 байт): Выбранный набор шифров.
    • Это не полный номер шифра, а скорее его "категория" или индекс в предопределенном списке.
  • Последние 2 символа (1 байт): Хеш поддерживаемых расширений и их порядка.
    • Этот байт формируется путем хеширования списка расширений, присутствующих в Server Hello, что позволяет учесть не только наличие, но и порядок.

Таким образом, каждый 6-символьный сегмент XXYYZZ агрегирует ключевые характеристики ответа сервера на конкретный Client Hello запрос. Оставшиеся 2 символа в конце fingerprint (0b в примере выше) являются дополнительным хешем, который объединяет информацию из всех 10 ответов, предоставляя общую сводку.

Эта структура обеспечивает высокую детализацию и уникальность для большинства TLS-серверов.

JARM для идентификации TLS-серверов

JARM fingerprint является эффективным инструментом для категоризации и идентификации различных TLS-серверов.

  • Идентификация программного обеспечения: Различные реализации TLS-стеков (OpenSSL, GnuTLS, BoringSSL, Microsoft SChannel) и серверного ПО (Nginx, Apache HTTP Server, Microsoft IIS, Caddy, HAProxy, Envoy) имеют свои нюансы в обработке TLS-рукопожатий. Эти нюансы проявляются в выборе шифров, версий и расширений, что приводит к уникальным JARM отпечаткам.
    • Пример: Nginx с OpenSSL будет иметь иной JARM, чем Nginx с BoringSSL.
  • Идентификация версий: Отличия в минорных версиях серверного ПО или библиотек могут приводить к изменению JARM. Это позволяет точно определять версии, например, Nginx 1.20.x против Nginx 1.22.x, или различные версии Apache.
  • Идентификация операционных систем: TLS-стек может по-разному вести себя в зависимости от операционной системы. Например, серверы IIS на Windows Server будут иметь характерный JARM, отличный от Nginx на Linux.
  • Идентификация библиотек: Конкретные версии OpenSSL, LibreSSL или других криптографических библиотек, используемых сервером, также влияют на JARM.

Примеры известных JARM отпечатков (упрощенные):

ПО/Сервис Типичный JARM Fingerprint (пример) Описание
Nginx (OpenSSL) 070707070707070707070707070707070707070707070707070707 Стандартная конфигурация Nginx с OpenSSL
Apache (OpenSSL) 070707070707070707070707070707070707070707070707070707 Может быть схож с Nginx, но с нюансами в расширениях
Microsoft IIS 040404040404040404040404040404040404040404040404040404 Характерен для Windows SChannel, сильно отличается
Cloudflare CDN 070707070707070707070707070707070707070707070707070707 Cloudflare имеет свой, часто унифицированный JARM
Google (GTS) 000000000000000000000000000000000000000000000000000000 Собственная реализация TLS-стека Google

(Примечание: Приведенные JARM-отпечатки являются упрощенными примерами для иллюстрации и могут не соответствовать актуальным значениям в реальной среде.)

JARM для идентификации прокси-серверов и сетевых устройств

JARM особенно ценен для выявления промежуточных устройств, таких как прокси-серверы, балансировщики нагрузки и CDN.

  • Как прокси влияют на TLS-рукопожатие:
    • TLS Termination Proxy: Если прокси терминирует TLS-соединение (т.е., расшифровывает трафик, а затем устанавливает новое TLS-соединение с целевым сервером), JARM fingerprint будет принадлежать прокси, а не конечному серверу. Это наиболее распространенный сценарий для CDN, WAF и многих корпоративных прокси.
    • Прозрачный прокси: Некоторые прокси могут модифицировать TLS-рукопожатие, даже не терминируя его полностью, изменяя порядок или набор предлагаемых шифров/расширений, что также приводит к уникальному JARM.
  • Выявление MITM-прокси: Злоумышленники, использующие атаки "человек посередине" (MITM) с собственными TLS-сертификатами, часто используют стандартные или модифицированные TLS-стеки, которые будут иметь уникальный JARM, отличный от ожидаемого для легитимного сервера.
  • Идентификация CDN и WAF: Крупные CDN-провайдеры (Cloudflare, Akamai, Google CDN) и WAF-решения (Imperva, F5 BIG-IP WAF) имеют свои стандартизированные TLS-стеки, которые дают характерные JARM-отпечатки. Это позволяет легко определить, находится ли целевой сервер за такой защитой.
  • Идентификация балансировщиков нагрузки: Балансировщики нагрузки, терминирующие TLS, также будут иметь свой JARM fingerprint, что может помочь в картографировании инфраструктуры.

Примеры:

  • Cloudflare: Часто имеет унифицированный JARM для своих Edge-серверов.
  • Akamai: Аналогично, Akamai Edge-серверы будут иметь свой набор JARM-отпечатков.
  • Squid Proxy: Если Squid настроен как TLS-терминирующий прокси, он будет иметь свой JARM, зависящий от его собственной конфигурации TLS.
  • F5 BIG-IP: Балансировщики нагрузки F5 BIG-IP, особенно с функциями WAF, будут иметь характерные JARM-отпечатки.

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

Сравнение JARM и JA3/JA3S

JARM, JA3 и JA3S — это методы отпечатков TLS, но они анализируют разные аспекты TLS-рукопожатия и служат разным целям.

| Критерий | JA3 (Client Fingerprint) | JA3S (Server Fingerprint) | JARM (Server Fingerprint) JARM is an active server-side fingerprinting tool that determines the specific characteristics of a TLS server's handshake responses to a series of specially crafted Client Hello messages. This allows for precise identification of the server's software, version, configuration, and underlying operating system, as well as the detection of intermediate network devices like proxies or CDNs.

Принцип работы JARM

Метод JARM основан на взаимодействии с целевым TLS-сервером через серию уникальных Client Hello запросов. Процесс генерации отпечатка включает несколько этапов:

  1. Формирование Client Hello запросов: Инструмент JARM генерирует десять различных Client Hello пакетов. Каждый пакет отличается по нескольким ключевым параметрам:
    • Версии TLS: Запросы отправляются с различными версиями TLS, начиная от устаревших (TLS 1.0) до актуальных (TLS 1.3). Это позволяет выявить, какие версии протокола поддерживает сервер.
    • Наборы шифров (Cipher Suites): В каждом Client Hello предлагается уникальный, непересекающийся набор криптографических шифров. Это заставляет сервер выбирать из разных опций, раскрывая его предпочтения и поддерживаемые алгоритмы.
    • TLS-расширения (Extensions): Включаются различные комбинации TLS-расширений (server_name, supported_versions, signature_algorithms, supported_groups, key_share и другие), а также варьируется их порядок. Поведение сервера в ответ на эти расширения является ключевым для его идентификации.
  2. Анализ Server Hello ответов: Для каждого из десяти Client Hello JARM регистрирует и разбирает соответствующий Server Hello ответ. Из каждого Server Hello извлекаются следующие данные:
    • Выбранная версия TLS: Версия протокола, которую сервер выбрал для соединения.
    • Выбранный набор шифров: Конкретный шифр, который сервер предпочел из предложенных.
    • Поддерживаемые расширения: Список расширений, которые сервер включил в свой ответ, и их порядок.
    • Длина поля Server Random: Длина этого поля также учитывается, поскольку может иметь незначительные вариации в разных реализациях.
    • Версия SSL-записи (SSL Record Version): Версия протокола, используемая для инкапсуляции TLS-записей.
  3. Генерация отпечатка: Полученные 60 байт информации (6 байт от каждого из 10 Server Hello ответов) объединяются. Затем к этим данным применяется алгоритм хеширования (обычно SHA-256), и первые 31 байт (62 шестнадцатеричных символа) результата формируют JARM fingerprint.

Этот активный подход позволяет JARM получать более детальную и специфичную информацию о TLS-стеке сервера по сравнению с пассивными методами.

Структура JARM Fingerprint

JARM fingerprint представляет собой 62-символьную шестнадцатеричную строку. Она является хешем, но ее структура позволяет косвенно понять, какая информация в ней закодирована. Отпечаток состоит из 10 сегментов, каждый из которых соответствует ответу сервера на один из 10 специально сконструированных Client Hello запросов.

Каждый из 10 сегментов вносит свой вклад в итоговый хеш. Для каждого Server Hello ответа собирается 6 байт данных, которые затем обрабатываются. Эти 6 байт кодируют:

  1. Выбранная версия TLS и версия SSL-записи: Один байт, объединяющий эти два параметра. Различные реализации TLS могут по-разному обрабатывать эти поля.
  2. Выбранный набор шифров: Один байт, представляющий выбранный сервером набор шифров. Это не полный идентификатор шифра, а его индекс или категория, что позволяет сохранить компактность.
  3. Хеш расширений и их порядка: Четыре байта, которые формируются путем хеширования списка расширений, присутствующих в Server Hello, и их порядка. Порядок расширений имеет значение, так как некоторые реализации TLS могут возвращать их в разной последовательности.

Объединение этих 60 байт (10 ответов * 6 байт) и их последующее хеширование создает уникальный 62-символьный JARM-отпечаток. Изменение даже одного бита в любом из 60 байт приведет к совершенно другому JARM fingerprint.

Пример JARM fingerprint: 07070707070707070707070707070707070707070707070707070707070707.
В данном примере 07 — это условное обозначение для выбранной версии TLS и SSL-записи, 07 — для выбранного набора шифров, и далее 0707 — для хеша расширений. Повторение 07 здесь является иллюстративным и в реальных отпечатках будет значительно более разнообразным.

JARM для идентификации TLS-серверов

JARM fingerprint предоставляет высокую степень детализации для идентификации серверного ПО и его конфигурации.

  • Идентификация программного обеспечения: Различные реализации TLS-стеков (например, OpenSSL, BoringSSL, Microsoft SChannel, Go's crypto/tls) по-разному отвечают на Client Hello запросы. Это позволяет отличить серверы, работающие на Nginx, Apache HTTP Server, Microsoft IIS, Caddy, HAProxy, Envoy, и т.д.
    • Например, Nginx, скомпилированный с OpenSSL, будет иметь один JARM, тогда как Nginx с BoringSSL может иметь другой.
  • Идентификация версий: Даже минорные обновления серверного ПО или используемых криптографических библиотек могут изменить JARM. Это позволяет различать версии, например, Nginx 1.20 от Nginx 1.22, или конкретные патчи OpenSSL.
  • Идентификация операционных систем: TLS-стек может зависеть от базовой операционной системы. Например, Microsoft IIS на Windows Server генерирует характерный JARM, отличный от большинства Linux-серверов.
  • Идентификация конфигурации: Настройки сервера, такие как предпочтительные наборы шифров, включенные или отключенные расширения, и даже порядок их обработки, влияют на JARM. Это дает возможность выявлять нестандартные или кастомные конфигурации.

Примеры JARM-отпечатков для известных систем (иллюстративные):

| ПО/Сервис | JARM Fingerprint (пример) | Описание

Обновлено: 04.03.2026
Назад к категории

Попробуйте наши прокси

20,000+ прокси в 100+ странах мира