В свежих версиях веб-сервера Nginx есть полезная (и довольно экзотическая) опция для настройки TLS: ssl_reject_handshake (on | off), о которой, оказывается, мало кто знает. Опция позволяет управлять прерыванием процесса установления TLS-соединения (“хендшейка”) на стороне сервера. С помощью “ssl_reject_handshake on;” можно отклонить TLS-соединение, если в клиентском ClientHello указано имя хоста (поле SNI), которого нет на стороне сервера.

Почему это удобно. Штатная работа веб-сервера по HTTPS подразумевает, что при установлении TLS-соединения клиент передаёт имя хоста, соответствующее DNS-имени веб-узла; например, для https://test.ru/ это будет test.ru. Однако никто не запрещает клиенту обратиться с другим именем хоста в SNI. Более того, на тот же самый IP-адрес, который соответствует веб-узлу под именем test.ru, может быть направлено другое DNS-имя (другой домен). Веб-браузеры, обращающиеся по такому имени, будут указывать его в SNI, а сервер, при прочих равных, не сможет найти не только соответствующий “виртуальный хост” в конфигурации, но и подобрать корректный TLS-сертификат. Однако какой-то TLS-сертификат для установления TLS-соединения серверу нужен и, без дополнительных мер, это приводит к тому, что сервер отвечает с “первым попавшимся” (буквально) серверным TLS-сертификатом из сконфигурированных.

Если на сервере всего один виртуальный хост/веб-узел (или настроены отдельные IP-адреса для отдельных веб-узлов), то ничего нового клиент не узнаёт. Однако если виртуальных хостов много, то ответ с произвольным сертификатом приводит к нежелательным утечкам имён: клиент получит сертификат, в котором будет указано имя другого сервиса, доступного на этом же узле (или несколько имён). Администраторы и даже DevOps об этом постоянно забывают.

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

Указание “ssl_reject_handshake on;” для default_server (для имени хоста по умолчанию) позволяет побороть только что описанную проблему: Nginx будет прерывать именно TLS-соединение, если клиент обращается с неверным именем хоста в SNI – это, что называется, технически строгий способ. Браузер, в таком случае, выведет сообщение о недоступности узла, а не предупреждение о несовпадении имён, которое пользователи привыкли преодолевать при помощи кнопки “Всё равно продолжить”.



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

В свежих версиях браузера Chrome на сторону серверов Google предлагается передавать информацию о запрашиваемых URL в реальном времени – это такое “улучшение для безопасности”, развитие давно работающей технологии Safe Browsing, но с некоторыми занимательными особенностями.

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

Google Safe Browsing and Proxy
(Image: Google.)

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

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



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

В конце 2022 года я добавил в DNS для dxdt.ru HTTPS-запись, которая тогда была описана в черновике RFC. В ноябре 2023 года черновик стал RFC 9460, где определяется способ публикации в DNS дополнительной информации о параметрах подключения к сервисам, связанным с данным именем. Например, это могут быть параметры для TLS/HTTPS, в том числе, ключи (см. ECH). Особенность использования DNS тут в том, что параметры можно получить до подключения, это, в свою очередь, позволяет устанавливать скрытые подключения.



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

Когда оценивают влияние отключения тех или иных магистральных кабелей на связность Интернета, нередко забывают о паре важных факторов: во-первых, сам момент переключения путей доставки трафика может создать дополнительные проблемы – уже и разнообразное “мигание” связности мешает нормальной работе коммутаторов/маршрутизаторов, а неожиданно большие затраты на передачу изменений маршрутов могут привести к тому, что и резервные пути окажутся недоступны; во-вторых, с резервированием в “этих интернетах” регулярно случается так, что после поступления действительно большого потока на резервные схемы – схемы эти падают, так как резервными они являлись не в “тёмном” режиме stand-by, а лишь резервировали некоторую полосу, доступную сверх типичной загрузки.

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

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



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

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

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

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

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

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



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

Немного технологических параллелей. Предположим, что на сервер баз данных, через сеть, отправляются запросы добавления записей. При этом каждый запрос требует завершения транзакции – то есть, обратно клиенту должен прийти пакет, подтверждающий выполнение, после этого клиент может отправить следующий запрос. В условных терминах привычного SQL – это будут команды INSERT. Известно, что в такой схеме производительность, по числу добавлений в секунду, определяется сетевой задержкой. То есть, если пакет находится в пути 10 ms, то сервер должен дожидаться следующего INSERT 20 ms (потому что в обе стороны), а это гарантирует верхний предел в 50 записей в секунду, даже если сервер выполняет одну запись за 1 микросекунду (на несколько десятичных порядков быстрее).

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

Естественно, эта особенность действует не только для баз данных: ограничивающее влияние сетевых задержек на транзакционные схемы с подтверждением есть в TCP (где с этим явлением борются: см. TCP Fast Open), в TLS (здесь тоже борются: см. TLS Early Data/0-RTT и др.), и в других протоколах. Схема обобщается и на многие решения, которые не имеют отношения к интернет-протоколам.

Рассмотрим такой сценарий: РЛС, предназначенная для определения координат и скорости “быстрых объектов” на “существенном расстоянии”. Тривиальная импульсная РЛС, полагающаяся на отражения отдельных зондирующих импульсов в строгом порядке, оказывается в такой же ситуации, как и сервер баз данных выше (при том, конечно, что РЛС появились раньше таких серверов). Излучили короткий импульс – приняли отражённый сигнал, обработали, отправили очередной импульс – если время до цели 1 ms (300 км, примерно), то получается разрешающая способность наблюдения в 500 Гц, максимум. А если цель дальше, то будет меньше. Хуже всего, что отражённый сигнал вообще может не прийти обратно к точке излучения на нужном уровне. Но если импульсы отправлять чаще, не ждать отражения, или даже использовать непрерывный зондирующий сигнал, то ситуация, в теории, резко улучшается, как и в случае с сервером баз данных: можно обрабатывать отражённый сигнал с разрешением хоть в гигагерц. На практике, впрочем, возникнут проблемы, потому что РЛС – это не сервер баз данных. Принимать сигнал одновременно с излучением – весьма трудно, если не использовать разнесённые в пространстве антенны (бистатическая радиолокация). А увеличение частоты следования зондирующих импульсов требует использования более сложных алгоритмов кодирования и обработки, которые позволяют различать отражённые сигналы, соответствующие различным зондирующим импульсам. Это, впрочем, обычная задача для современных РЛС.



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

В браузере Chrome версии 122, вышедшей на днях, включена по умолчанию поддержка постквантовой гибридной криптосистемы TLS X25519Kyber768 (раньше данная возможность включалась вручную, через флаг). Данная криптосистема уже некоторое время поддерживается моим экспериментальным сервером TLS – посмотрим, увеличится ли количество подключений с X25519Kyber768: у этой криптосистемы на сервере повышен приоритет, но подключений пока что очень мало (естественно, там далеко не только браузеры в качестве клиентов).

(Кстати, так как популярный “Яндекс.Браузер” является клоном Chromium/Chrome, а TLS-стек там соответствует версии Chromium, то и в браузер от “Яндекса”, как я понимаю, поддержка постквантовой криптосистемы в TLS тоже приехала автоматически.)

(Update, 07/03/2024: оказывается, в последний момент выход передвинули на версию 124.)



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

Кстати, насчёт того, было ли известно о различных векторах DoS-атак, которые с собой приносит DNSSEC (это касательно свежих CVE с коллизиями ключей и подписей). Я, ради интереса, посмотрел, что я писал в книге “Доменные войны II”, вышедшей ещё в 2011 году, и там на странице 269 сказано следующее:

“Уже понятно, что DNSSEC создаст новые возможности для атак типа “отказ в обслуживании” (DoS), ведь криптографические процедуры защищённой DNS гораздо более ресурсоемки, в вычислительном смысле. Злоумышленники при помощи отправки системам, поддерживающим DNSSEC, “дефектных” наборов данных смогут с большей, относительно “классической” DNS, легкостью занять все вычислительные ресурсы компьютера проверкой “бессмысленных” адресных данных.”

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

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



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

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

Evaluating KeySigTrap, we set up a zonefile with 582 colliding DNSSEC keys and 340 signatures.

Это CVE-2023-50387.

(via)



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

Свежий занятный пример про утечку данных о пользовательской VPN-сессии через DNS, а также и про то, как именно один и тот же пользователь (клиент) может к DNS и к веб-серверу одного и того же сервиса приходить из совсем разных точек Сети: пишут, что клиентская программа VPN-провайдера ExpressVPN длительное время допускала DNS-запросы к локальному, провайдерскому DNS-резолверу, а не к резолверу внутри VPN. О подобных утечках, связанных с DNS, я писал достаточно много, например, в недавней записке про ECS.



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

У DNSSEC свои особенности. Так, эта технология вносит в древовидную структуру глобальной DNS хрупкость. Дело в том, что “обычная” DNS мало восприимчива к дефектам и ошибкам в реализации, а вот DNS с DNSSEC, из-за свойств используемой криптографии, напротив – очень сильно восприимчива. И древовидная структура тут только усиливает всякую проблему: авария в одной вершине дерева может привести к обрушению кучи ветвей.

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

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

Будущее DNSSEC остаётся туманным.



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