Год 2022, новый

Традиционная записка к Новому году.

В 2021 году заметки на dxdt.ru продолжали выходить. Кроме того, я выпустил небольшое (но зато ежегодное) обновление технического описания TLS и написал несколько статей про важные интернет-технологии. Вообще, публикации именно на dxdt.ru за несколько лет сдвинулись в сторону математики и методов защиты информации, а из других привычных для этого блога направлений, периодически получающих одну или две новых заметки, остаются только радиолокация, системы связи и технологии передачи информации (см. ссылки ниже). Посмотрим, как будет дальше. Пока что я предполагаю, что станет больше математических заметок, но это всего лишь попытка угадать направление. Сайт dxdt.ru регулярно публикует заметки с 2005 года (архив сейчас доступен с 2006, но проект старше). Не сказать, что вот прямо очень долго, но, с другой стороны – всё же 16 лет. Статистика WordPress показывает, что на сайте сейчас 2608 заметок.

С наступающим Новым годом! Спасибо, что читаете.

Небольшая подборка публикаций dxdt.ru за 2021 год:



Комментарии (2) »

Ежегодное обновление технического описания TLS, которое я поддерживаю: https://tls.dxdt.ru/tls.html.

Изменения:
актуализировал раздел, рассказывающий про ESNI/ECH;
переделал описание RSA;
добавлен небольшой новый блок про метаинформацию о TLS-соединениях.



Комментировать »

На сайте ТЦИ опубликована моя статья, рассказывающая о технологии ECH (Encrypted Client Hello) и её, возможном, месте в современном наборе защищённых транспортов данных глобальной Сети. ECH – это развитие технологии ESNI, однако от ESNI всё ушло уже достаточно далеко.



Комментировать »

Если вы думаете, что по девяти цифровым пикселям (3×3) нельзя восстановить детальное изображение лица человека, поскольку в процессе многих преобразований потерялась основная часть информации о деталях этого самого лица, то, наверное, вы правы, но старомодны: современный бум “нейросетей” показывает, что пиксели можно как угодно “растянуть”, а требуемые детали – просто дорисовать, при этом назвав такое дорисовывание “реконструкцией” или даже “повышением разрешения”. Никто не знает, как конкретная “нейросеть” устроена внутри, но, как известно, “компьютеры не могут ошибаться”, поэтому полученное изображение “высокого разрешения” вполне себе могут использовать на правах достоверного – посмотрите, в каком направлении развивается потребительская фототехника внутри смартфонов с “искусственным интеллектом”. Это большая проблема.

Конечно, “нейросеть” представляет собой огромный набор неких сцепленных между собой формул с произвольно подобранными коэффициентами. Подбор коэффициентов – это процесс обучения. Об этом пока ещё помнят. Впрочем, если наши девять пикселей имеют байтовую глубину, то получаем 72 бита. Достаточно для того, чтобы эти биты, поданные на вход набора формул “нейросети”, привели к появлению некой уникальной картинки высокого разрешения на выходе, потому что 272 вариантов – это большое разнообразие. Можно, конечно, понадеяться на шум, который может продемонстрировать, что цифровое изображение одного и того же реального объекта порождает совершенно различные “реконструкции”. Такие опыты уже неоднократно проводились. Но в реальности, когда “обучить нейронку” уже стало универсальным и быстрым решением (как бы) для любой задачи, вряд ли кто-то задумывается о таких сложностях – ведь есть “непогрешимый компьютер”, которому, согласно документации, хватит и одной картинки, а “обучение нейронки или нейросетки” для того и существует, чтобы не тратить время на попытки что-то понять – понимать как раз будет “обученная нейросетка”, это очевидно.

Ключевой момент – исчезновение понимания того, что “нейросеть” не восстанавливает изображение, а генерирует новое. Генерирует таким образом, чтобы результат, если бы его использовали в процессе обучения, оказался бы максимально похожим на целевую выборку изображений. Естественно, это относится не только к изображениям, но они оказываются хорошей иллюстрацией процесса. В некоторых случаях, фильтрация изображений “нейросетями” будет полезной. Однако масштабы популярности и внешние впечатляющие эффекты приводят к тому, что о границах применимости и реальной достоверности результатов уже предпочитают не задумываться, а “нейросети” планируют использовать для моделирования поведения людей или, если хотите, “человеков”. То ли ещё будет.



Комментарии (2) »

Это очень краткое описание TLS, так сказать, минимум, необходимый для базового понимания того, как эту технологию использовать. Статья, впрочем, содержит и вполне конкретные замечания, поясняющие наиболее распространённые ошибки настройки TLS на серверах.

TLS (Transport Layer Security) предназначен для создания защищённых каналов обмена информацией. Спецификации определяют несколько версий TLS: 1.0, 1.1, 1.2, 1.3. Версия 1.3 является самой современной, допускается использование версии 1.2, а более старые версии – не рекомендованы.

1.

Один из распространённых сценариев использования TLS – обращение к веб-серверу браузером, то есть “доступ по HTTPS”. TLS применяется для защиты большого количества различных сервисов и протоколов. Примеры, помимо HTTPS: подключения VPN, защищённый доступ к DNS, каналы для управления прикладным ПО, системы обмена сообщениями (мессенджеры) и т.д. TLS в HTTPS и, например, в VPN – это один и тот же протокол. Так, при использовании в HTTPS, роль TLS состоит в создании защищённого канала, через который передаются HTTP-запросы (это такие же запросы, какие передавались бы в открытом виде). Аналогично для VPN – TLS служит защищённым транспортом для сетевых соединений.

Есть немало практических ситуаций, когда реализация TLS логически полностью отделяется от реализации того или иного сервиса, что позволяет защитить трафик “прозрачно”, то есть, без внесения изменений в реализацию самого сервиса. Пример – использование пакета stunnel для защиты DNS-трафика: stunnel настраивается в качестве TLS-сервера, который принимает трафик на выделенном номере порта (853) по TLS, “раскрывает” этот трафик и проксирует, в открытом виде, в сторону обычного DNS-сервера, который может работать на той же машине, но на другом номере порта. Таким способом можно добавить поддержку TLS для DNS-сервера, который сам по себе TLS не поддерживает. Этот подход в более общем случае называют “TLS-терминирование” (см. ниже).

2.

TLS использует парадигму “клиент-сервер” и работает поверх TCP. Клиентом в TLS является сторона, инициирующая защищённое соединение. В штатном случае, клиент в TLS совпадает с клиентом в соответствующем TСP-соединении.

TLS позволяет аутентифицировать узлы при помощи TLS-сертификатов. Возможно придумать другие, экзотические способы аутентификации для TLS, однако только TLS-сертификаты предоставляют универсальный, описанный в спецификации, способ, поэтому используются практически повсеместно. TLS-сертификат – это публичный электронный документ (можно считать, что файл специального формата, который описан в стандарте X.509), позволяющий при помощи электронной подписи привязать открытый криптографический ключ к сетевому имени (или, реже, к сетевому адресу). Сертификаты, идентичные по формату применяемым в TLS, используются во многих других случаях, к TLS отношения не имеющих: например, для публикации ключей в электронном документообороте. TLS-сертификаты являются “X.509-сертификатами”, то есть, их можно так называть. TLS-сертификат не содержит никакой секретной информации (по определению), поэтому не требует защиты при хранении или публикации.

Сертификаты в TLS бывают серверные (их называют “оконечными”), промежуточные и корневые. Фундаментальное отличие серверного сертификата от промежуточного и корневого в том, что серверный сертификат не может быть использован для выпуска других доверенных сертификатов, то есть, он является конечным сертификатом в “цепочке доверия” (откуда и название “оконечный”). Сертификаты, которые подразумевают возможность подписывать другие сертификаты, называются сертификатами удостоверяющих центров (УЦ). Как ни странно, но в технической части TLS роль УЦ на этом заканчивается: УЦ – это просто флаг в сертификате (флаг называется CA).

3.

Аутентификация по TLS-сертфикатам основана на следующем простом алгоритме: сторона, “подлинность” которой проверяется, по запросу подтверждает, что ей известен секретный ключ, соответствующий открытому ключу из доверенного сертификата. Это означает, что если сертификат для аутентификации предъявляет сервер, то сервер должен знать секретный ключ от этого сертификата. Обычно, доступ к секретному ключу тем или иным образом настраивается в конфигурации сервера. В наиболее распространённом сейчас случае, – например, для HTTPS, – секретный ключ просто размещается в файле на сервере, путь к файлу ключа указывается в конфигурации.

Электронная подпись, применяемая в отношении TLS-сертификатов, основана на той или иной асимметричной криптосистеме. В подавляющем большинстве случаев это ECDSA (современный вариант) или RSA (стремительно устаревающий вариант). Используется пара связанных между собой ключей: открытый и секретный. Секретный ключ позволяет вычислить соответствующее сообщению значение электронной подписи (это одно или несколько чисел), которое можно проверить с использованием открытого (публичного) ключа. В случае серверного сертификата и TLS – секретный ключ от сертификата используется для подписывания специального сообщения, определяемого клиентом. Проверка подписи, вычисленной сервером для заранее не известного ему сообщения, позволяет клиенту убедиться, что сервер знает “правильный” секретный ключ. Кроме того, в устаревших схемах TLS секретный ключ RSA (важно: именно RSA) используется сервером для расшифрования переданного клиентом сессионного секрета. Сейчас использование такой схемы не рекомендуется, а в самой современной версии, в TLS 1.3 – прямо запрещено.

4.

Доверие сертификатам – эквивалентно доверию представленным в них открытым ключам. Методы управления таким доверием находятся за рамками TLS, но, тем не менее, составляют существенную часть практики TLS.

Обычно, доверие сертификатам строится по цепочке, от корневого, через промежуточные, до серверного (оконечного) сертификата. Цепочка выстраивается через подписи: ключ из корневого сертификата позволяет проверить подпись на промежуточном, а ключ из промежуточного – на серверном. Ранжируются и “сцепляются” сертификаты по именам: в каждом сертификате есть поля Issuer (“Издатель” – тот, кто удостоверил сертификат) и Subject (“Субъект” – тот, кому сертификат выдан); поле Issuer сертификата более низкого уровня должно соответствовать полю Subject сертификата более высокого уровня. Корневой сертификат всегда самоподписанный, то есть, у него значение поля Issuer равно значению поля Subject. Таким образом, корневой сертификат – всего лишь способ публикации доверенного корневого ключа. На практике, в Интернете, серверный сертификат в поле Subject содержит некоторое сетевое имя (реже – IP-адрес) сервера. При этом, если речь идёт о вебе, – а именно, о браузере и HTTPS, – то серверный сертификат обязательно должен содержать имя (возможно, IP-адрес) сервера и в специальном дополнительном поле SAN (Subject Alternative Name), иначе современные браузеры будут считать такой сертификат невалидным (то есть, соединение с сервером будет отмечено как “недоверенное”). На начальном этапе установления TLS-соединения сервер передаёт один или несколько сертификатов клиенту. Так, в современной практике HTTPS, корректно настроенный сервер практически всегда передаёт, как минимум, один серверный и один промежуточный TLS-сертификат.

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

В TLS возможна аутентификация как сервера клиентом, так и клиента сервером, однако последний случай используется реже. Аутентификация клиента проводится по тем же принципам, что и аутентификация сервера: проверяется наличие секретного ключа, соответствие имён (для клиента – это может быть некоторое имя пользователя, логин), выстраивается цепочка к некоторому доверенному сертификату, известному серверу.

5.

TLS защищает передаваемые данные от прослушивания, это делается при помощи шифра. Формально, всё ещё возможно реализовать TLS-соединение, не зашифровывающее данные, но это скорее теоретическое упражнение.

Для защиты данных используется симметричный шифр, обычно, это AES или ChaCha20. Симметричный шифр здесь – это шифр, который использует секретный ключ, одинаковый для обеих сторон соединения. В TLS эти ключи называются ключами защиты трафика. TLS-соединение использует пару ключей на каждой стороне: один ключ для записи (передачи) данных, второй – для чтения (приёма); это, всего лишь, означает, что клиент зашифровывает данные, отправляемые в сторону сервера, с одним ключом, а расшифровывает полученные от сервера данные – с другим; на стороне сервера ключи меняются местами – тот, что у клиента для записи, у сервера – для чтения. Эта пара ключей не имеет ничего общего с парой секретный/открытый ключ из области асимметричных криптосистем: здесь просто два секретных симметричных ключа.

Помимо того, что передаваемая информация зашифрована, TLS также обеспечивает её целостность, то есть, позволяет обнаружить изменение защищённого пакета в процессе доставки, провести аутентификацию данных. Для этого служат коды аутентификации сообщений (MAC, а в русскоязычной терминологии – имитовставка). Такой код, вычисленный по особому алгоритму, прикрепляется к сообщению. Чтобы сгенерировать корректный код для заданного сообщения нужно знать секретный ключ. Принимающая сторона, которой секретный ключ известен, может проверить, что код соответствует сообщению, следовательно, сообщение вряд ли было изменено. Современный метод применения шифров в TLS объединяет процесс зашифрования и процесс защиты целостности данных в единый алгоритм, называемый “аутентифицированным шифрованием”. Распространённый пример такого алгоритма – AES-GCM.

6.

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

7.

Всё это означает, что если вы возьмёте, например, tcpdump и взглянете на трафик, передаваемый через TLS-соединение, то увидеть полезную нагрузку так просто не получится – вместо неё вы обнаружите поток байтов, очень похожих на случайные. Поэтому, если у вас веб-сервер отвечает по HTTPS, то есть, через TLS, то нельзя простым способом проксировать или как-то обрабатывать HTTP до веб-сервера, так как даже увидеть HTTP-запросы в трафике можно либо только “внутри” веб-сервера (после того, как TLS “раскрыт”), либо их можно увидеть снаружи, но используя некоторые, достаточно сложные, специальные методы.

Специальные методы для (пассивного) чтения полезного содержимого TLS-трафика используют ключи защиты трафика. Для того, чтобы внешнее приложение могло просматривать TLS-трафик, в сторону этого приложения достаточно экспортировать сеансовый секрет, который служит основой для генерации ключей защиты трафика, либо сами эти ключи. Возможность такого экспорта определяется настройками TLS-сервера или TLS-клиента. Сеансовый секрет и наборы ключей у сервера и клиента общие (в одной сессии), поэтому извлечь нужное значение можно с любого из узлов. На стороне сервера, обычно, экспорт секретов/ключей настраивается в конфигурации серверного приложения, иногда включить такой экспорт можно через соответствующую переменную окружения (например – SSLKEYLOGFILE). Аналогично – на стороне клиента. Суть данного метода следующая: криптографическая библиотека, обеспечивающая работу TLS, будет выводить в файл с заданным именем некоторый идентификатор TLS-сессии и соответствующий сеансовый секрет; получив секрет, приложение для анализа трафика сможет вычислить сеансовые ключи и расшифровать трафик. Передавать секрет через файл, конечно, необязательно. Очевидно, такой метод создаёт некоторую задержку и лучше подходит для анализа записанного ранее трафика. Аналогичный метод может работать и в режиме онлайн, но это потребует гораздо более плотной интеграции программных пакетов. Экспорт сеансового секрета является сейчас самым универсальным и технологичным способом анализа TLS-трафика, но, обычно, работает для ранее записанных сессий – например, в таком режиме можно использовать Wireshark. Существует устаревший способ, основанный на передаче секретного ключа RSA. Этот способ, по описанным выше причинам, не подходит для сессий, в которых вычисление сеансового секрета происходит по протоколу Диффи-Хеллмана, а это большинство сессий с современными настройками. Специально выбирать ключевой обмен RSA при настройке TLS, чтобы получить простую возможность анализа трафика, крайне не рекомендуется.

8.

TLS-терминирование – это практика, которая подразумевает “раскрытие” TLS на некотором входном “рубеже” сервиса и последующую работу с трафиком в открытом виде. Один из сценариев описан в начале этой статьи (stunnel и DNS-сервер). Другим примером является применение веб-сервера nginx (как один из вариантов) в качестве обратного прокси, который внешние соединения осуществляет по протоколу HTTPS, а внутренние, то есть, в сторону бекэнда, уже в открытом виде, по HTTP. TLS-сертификаты, секретный ключ от серверного сертификата, параметры TLS – всё настраивается в nginx. При этом сам основной сервис (бекэнд) может работать на другом физическом узле. Такая архитектура, например, позволяет просматривать, анализировать и изменять HTTP-трафик на пути от обратного прокси к сервису. Более того, в данном случае возможна балансировка HTTP-запросов уже после проксирования, нужно только правильно учитывать, что, к моменту поступления HTTP-трафика на так поставленный балансировщик, этот трафик уже успел нагрузить проксирующий сервер, в том числе, в части TLS, а это может оказаться существенно.

Качественное внешнее обслуживание запросов, “завернутых” в TLS, так или иначе требует “разворачивания” трафика и передачи секретных ключей. Например, передача секретного ключа от серверного сертификата позволяет промежуточному узлу прозрачно анализировать защищённый трафик, так как узел успешно аутентифицируется клиентом. Существуют схемы, когда в сторону проксирующего (или фильтрующего) узла отдаётся не сам секретный ключ от сертификата, а только интерфейс для получения подписи от этого ключа. Первая массовая реализация такого подхода – это Keyless SSL у Cloudflare.

9.

Итак, современный TLS-сервер должен поддерживать версию протокола 1.3 и, в качестве дополнительной версии – 1.2, все предыдущие версии не рекомендуются, и могут присутствовать только в случае строгой необходимости доступа для каких-то устаревших клиентов. Для TLS-сертификата сервера лучше выбрать криптосистему ECDSA, но при этом нужно обратить внимание, что вся цепочка сертификатов поддерживает ECDSA, в противном случае – смысла в ECDSA сильно меньше. Криптосистема RSA, хоть и является устаревшей, но всё ещё может применяться, особенно, когда других вариантов нет, как с современной (2021) версией бесплатного УЦ Let’s Encrypt. TLS-сервер обязательно должен использовать протокол Диффи-Хеллмана для получения сеансового секрета (это актуально только для старых версий TLS). В настройках серверов данный протокол обозначается как DH, ECDH или ECDHE. Шифр для защиты трафика должен работать в режиме аутентифицированного шифрования, подходит, например, AES-GCM.

Если вас заинтересовали подробности, то в качестве отдельной публикации доступно детальное техническое описание TLS.

Некоторые другие записки по теме на dxdt.ru:

Популярно о перехвате HTTPS

DNS-over-TLS на авторитативных серверах DNS

“Ключи на клиенте” и протокол Диффи-Хеллмана



Комментарии (1) »

Восемь лет назад я опубликовал заметку “Эволюция телефонного аппарата как персонального жучка“. Интересно сейчас взглянуть на то, как поменялся контекст и роль смартфона. Я взял несколько цитат и добавил к ним пояснения, как уточняющие исторические аспекты, так и напоминающие о современной действительности, всё более “окружающей нас” (советую прочитать и исходную заметку целиком).

“Итак, классический телефонный аппарат позволял без особых сложностей прослушивать помещение, где он установлен. Но только в том случае, если аппарат подключен к телефонной розетке. Отключили – данная конкретная утечка невозможна.”

Занятно, что при установке телефонных аппаратов в защищаемых помещениях специалисты инженерно-технической защиты монтировали специальную “кнопку”, которая, при нажатии, полностью развязывала аппарат с входящей телефонной линией (это делалось механически: перекоммутацией входной телефонной пары на гальваническую заглушку). Сейчас аналогичные меры организуются иначе: например, если смартфон нельзя изъять, то владельцу предлагается поместить его в некоторый специальный ящик, находящийся в том же помещении, но выполняющий экранирующие функции. (В скобах замечу, что данный процесс не то чтобы сильно лучше варианта, при котором личный смартфон предлагается сдать в какое-нибудь хранилище на другом этаже, но почему-то считается, что раз коробка со смартфонами находится на виду, то незаметно сделать с этими смартфонами ничего нельзя. Это, впрочем, другая история.)

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

Вообще, появление личного носимого “радиомаяка” – очень важный аспект. Сейчас этот “радиомаяк” используют всё шире: для идентификации “абонента-носителя” в потоке других “пассажиров”, для обнаружения и записи контактов (например, в маркетинговых программах); вполне вероятно, что в скором времени человек без “активного смартфона” будет автоматически, повсеместно выделяться системами наружного наблюдения и отмечаться как “подозрительный”.

“Самая главная новинка мобильной связи, в контексте нашей истории, – это возможность определения географического положения носителя жучка. Определить местоположение можно быстро, удалённо, и чисто техническими средствами. Принципиально новая функция, недоступная ранее. Сигнал аппарата содержит уникальные метки. Для определения положения нужны несколько приёмников, специальное оборудование и навыки радиопеленгации.”

Навигационная функция сохраняет высокую важность. Так как развились возможности накопления “треков” перемещения и агрегации индивидуальных треков по географическим координатам, то оказалось, что многие провайдеры сервисов мобильных приложений могут собирать весьма занимательную информацию (например, о военных базах).

“Память аппарата вообще является фундаментом для целого ряда дополнительных функций жучка: тексты SMS, сведения о частотности звонков на те или иные номера, данные о взаимодействии аппарата с сетью оператора – это всё новые возможности.”

Понятно, что и в “старой телефонии” можно было вести лог звонков, в том числе, записывая конкретные вызываемые номера. Более того, массовый автоматизированный “биллинг”, который развился ещё до появления смартфонов, позволял делать сложные выборки по контактам заданного абонента “стационарной связи”. Но речь-то в исходной записке о том, что такие метаданные стал накапливать сам телефонный аппарат, а не специальное оборудование на узле связи. Это всё актуально и сейчас, с той лишь разницей, что теперь смартфон накапливает информацию с гораздо более широким спектром: сюда нынче входят разнообразные “показатели здоровья” (читай – биометрические данные), сведения о “контактах” с другими смартфонами, находившимися рядом, информация о доступе к тому или иному контенту (не только на интернет-сайтах, но и через разные SmartTV и им подобные “говорящие кофеварки”).

“Удачное сочетание функций определения положения в пространстве, измерения ускорений (тот или иной “гироскоп”, как известно, тоже наличествует в смартфоне) и ориентации аппарата, а также получения фотоснимков и анализа сигналов WiFi, уже позволяет картографировать места обитания носителя жучка в удивительных подробностях, позволяющих построить детальную 3D-модель его квартиры, вместе со всем внутренним убранством.”

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



Комментировать »

На сайте есть раздел “Избранные записки”, содержание которого соответствует названию. Сейчас новые записки на dxdt.ru появляются довольно редко, поэтому находить избранные – сложнее. Тем не менее, несколько новых записок в список я добавил.



Комментировать »

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

Посмотрим на классический вариант DH: s = Gab == Gba (mod P), а именно – мы выбрали некоторое большое простое число P, выбрали натуральное G < P (это значение называют генератором), а в рамках операций протокола возводим G в секретную степень a или b по модулю P. Другими словами – вычисляем остаток от деления на P. Из привычного свойства степеней выводится нужное равенство, означающее, что стороны придут к одинаковому значению секрета s. Уже при разборе классического варианта можно обнаружить первое важнейшее общее свойство, о котором нередко забывают.

Действительно, стороны обмениваются значениями Ga и Gb по открытому каналу, соответственно, атакующему нужно вычислить a или b, по известному значению Ga или Gb. Почему же атакующий не может просто последовательно возводить G в натуральные степени, чтобы на каком-то шаге получить Ga (или Gb, но для примера возьмём только a), определив, таким образом, секретное значение? Ответ на этот вопрос такой: будем выбирать значение a достаточно большим, чтобы полный прямой перебор оказался вычислительно недоступным. Например, последовательно перебрать уже 2128 значений, для нашей задачи, весьма и весьма затруднительно. (Техническая оговорка: классический протокол DH на практике использует значения гораздо большей разрядности – 4096 бит и больше; это связано с особенностями криптоанализа именно классического DH, и не должно нас смущать: 4096 бит, после применения некоторых оптимизаций, как раз превращаются, примерно, в 196 “честных” битов.) Итак, атакующий не может перебрать все показатели степени последовательно, потому что это очень долго. Но как же тогда быть сторонам, использующим DH, они же тоже возводят G в степень большой разрядности? Это и есть первое арифметическое свойство, необходимое для успешного обобщения DH.

Так как каждая сторона протокола знает своё секретное значение, она может воспользоваться тем, что, например, 16 == (22)2. То есть, вместо трёх умножений – ограничиться всего двумя: (2*2)*(2*2). Очевидно, что один раз вычислив 4 == 2*2, можно использовать 4 дальше. Зная нужное значение показателя, процесс вычисления нетрудно разбить на повторное “удвоение” (здесь – в смысле степени, но это весьма важный и более общий термин) и умножение на основание: 35 == 32*32*3 == 243. Существенная экономия вычислительных ресурсов, которая выводится из того, что умножение в целых числах не зависит от расстановки скобок: a×a×a×a×a == (a×a)×(a×a×a) == a×(a×a×a×a). Вместо того, чтобы 128 раз умножать 3 на 3, вычисляя 3129, можно поступить проще: 3129 == 3128*3 == (364)2*3 и т.д., рекурсивно. Всё это может показаться очевидным для целых чисел, особенно, если учесть тот факт, что описанный метод естественным образом отображается на двоичное представление, привычное для компьютерных вычислений. Однако при обобщении протокола DH данное свойство трансформируется: необходимо, чтобы арифметические операции в новой структуре позволяли выполнять “быстрое удвоение”. “Быстрое” – в смысле количества вычислительных операций.

Наличие “операций” подразумевает, что структура, на которую мы пытаемся перенести протокол DH, предполагает некоторую арифметику. Обычно, говорят о коммутативной группе: множестве с бинарной операцией, которая введена таким образом, что является ассоциативной, коммутативной, ей соответствует нейтральный элемент и взятие обратного элемента. Если новая структура – коммутативная (абелева) конечная группа, то протокол DH может на ней заработать без изменений. Именно поэтому DH работает на эллиптических кривых: точки кривой образуют абелеву группу, арифметика которой, очевидно, позволяет быстро вычислять удвоения (см. пример ECDH с числами). В некоммутативном случае – всё сложнее, прежде всего потому, что структурное разнообразие некоммутативных групп гораздо больше абелевых. Мы некоммутативный случай здесь не рассматриваем.

Итак, следующая особенность DH – это протокол достаточно высокого уровня, чтобы его можно было переносить на другие структуры, с подходящей арифметикой. Обычно – на группы. Естественным препятствием здесь является наличие сложности решения обратной задачи. Если у нас есть функция DH с параметром, отображающая элемент новой структуры в другой элемент, задаваемый параметром, то эту функцию должно быть сложно обратить. В случае классического варианта протокола, скажем, что параметр – это показатель степени, а функция может быть представлена как S = Gx. Тогда обратная задача – это задача дискретного логарифмирования: нужно отыскать x, по известным G и S. Для эллиптической кривой обратная задача, обеспечивающая возможность переноса обобщённого DH, это задача вычисления показателя кратности (скаляра) x по двум известным точкам: S = xG. Например, в случае суперсингулярных (не будем вдаваться в технические подробности) эллиптических кривых протокол ECDH может оказаться уязвимым, поскольку существуют практические методы быстрого решения задачи дискретного логарифмирования для некоторых из этих кривых (методы эти позволяют свести задачу к вычетам, то есть, к области классического DH, но это детали). Как ни странно, это совсем не означает, что суперсингулярные эллиптические кривые не годятся для реализации DH.

Примером использования DH в совсем другом математическом окружении является постквантовый протокол CSIDH. С одной стороны, этот протокол работает на весьма экзотических объектах из области теоретической математики, а именно, на кольцах эндоморфизмов (и изогениях) эллиптических кривых (опять же, не обязательно понимать, что это такое), с другой стороны, применяемый алгоритм на уровне логики полностью аналогичен классическому DH, хоть и использует весьма нетривиальные превращения в качестве основной операции.



Комментировать »

Аварии facebook.com

На этот раз проблемы приключились с авторитативными серверами, на которые делегирована зона facebook.com – к ним нет доступа из российских и, например, европейских сетей. (Надо заметить, что следом сломались и остальные сервисы Facebook. Скорее всего, опять что-то напутали на уровне сетевого транспорта, с маршрутами.)



Комментарии (2) »

Как, принципиально, может выглядеть протокол подключения к скрытому сервису, использующий обычную глобальную DNS в качестве источника начальных данных? Понятно, что простая отправка запроса с именем “скрытого” сервиса в DNS – сразу же всё демаскирует: анализирующая трафик сторона увидит имя, так как запросы передаются в открытом виде. Если для сокрытия DNS-запроса использовать DNS-over-TLS или DNS-over-HTTPS, то всё равно имя увидит резолвер. Поэтому первичный запрос должен выполняться с некоторым маскирующим именем. Это имя соответствует точке распределения криптографических ключей, которые используются большим количеством сервисов. Предполагается, что при помощи полученного открытого ключа программа-клиент сможет зашифровать настоящее имя конкретного сервиса, скрыв его от всех сторон, кроме тех, у которых есть соответствующий секретный ключ. Естественно, маскирующее имя должно быть известно клиенту заранее (возможно, он получает его по какому-то дополнительному каналу, либо начальный набор таких имён встроен в дистрибутив клиента, а действующий состав постоянно обновляется – см. ниже).

Сейчас такие же идеи предлагаются для защиты TLS-соединений с веб-сервисами, да и не только TLS, и, вообще говоря, не только для веба. Например, в SVCB/HTTPS.

“Инфраструктурная” логика тут довольно простая и сводится к построению некоторого “тумана войны” (fog of war) на уровне базового транспорта глобальной Сети. После внедрения таких технологий, для пассивного анализатора трафика, даже обладающего обширными наборами инспектирующих узлов, вся метаинформация о сессиях на уровне приложений сведётся к двум элементарным транспортным слоям: в первом слое будут IP-адреса обменивающихся пакетами узлов; а во втором слое – минимальные “транскрипты”, соответствующие начальному обмену ключами. Более того, воссоздать второй слой будет весьма трудно, так как его отдельные элементы окажутся размазаны по разным протоколам разных уровней (UDP, IP, TCP, DNS, TLS и др.). Хитрость в том, что и клиент, и сервер могут использовать при поиске подходящих узлов метод “угадывания с предварительной информацией”, а именно – осуществлять попытки соединения, перебирая адреса и ключи по известному алгоритму, извлекая их из известного списка. Это требует дополнительных вычислительных затрат, однако для пары узлов, действующих кооперативно, эти затраты будут несравнимо меньше того объёмы вычислений, которые нужны прослушивающей стороне для раскрытия небольшой части метаинформации о соединении. (Да, некоторые из перечисленных принципов используются продвинутыми ботнетами, но тут уж ничего не поделать.)

Соответственно, приложения, применяя лишь DNS в качестве отправной точки, смогут быстро приспосабливаться к изменению сетевого транспорта, например, в ситуации, когда доступ к узлам по каким-то конкретным реквизитам (адресам/именам) оказывается невозможен. На самом деле, тут даже не важно, по какой причине: адрес может быть зафильтрован/заблокирован, а может быть недоступен из-за аварии. Если взглянуть на ситуацию в максимальной общности, то окажется, что сейчас развивается некоторый (условно) новый вариант “BGP уровня приложений”, но сразу с встроенными криптографическими механизмами.

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



Комментировать »

На сайте ТЦИ опубликована очередная моя статья. На этот раз о том, как DNS может использоваться для размещения информации, необходимой для работы других протоколов. Например, в DNS могут размещаться криптографические ключи, нужные для установления соединения со скрытым сервисом. Конечно, имя, выбранное для размещения ключей, вовсе не обязательно должно совпадать с именем скрытого сервиса: извлечённые из DNS ключи позволят и расшифровать настоящее имя или адрес “точки входа”, и защитить трафик ещё до установления соединения. Почитайте:

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

https://tcinet.ru/press-centre/articles/7511/



Комментировать »