Ресурсы: техническое описание TLS, LaTeX - в картинки (img), криптографическая библиотека Arduino, шифр "Кузнечик" на ассемблере AMD64/AVX и ARM64
Про измерения и DNS в Интернете: В 2020 году в журнале “Интернет Изнутри” вышла моя статья “DNS как источник глобальной информации о Сети“, где, в частности, описывается практический способ, позволяющий измерить характеристики DNS-резолверов, обслуживающих конечных пользователей веба.
Публикации за семь лет сейчас доступны на отдельном сайте журнала, почитайте.
Комментировать »
Небольшое продолжение прошлогодней записки о том, считал ли Аристотель, что “тяжёлые тела падают быстрее лёгких”. В этом контексте нередко можно услышать про эксперимент на Луне, когда астронавт демонстрирует, что тяжёлый молоток и легкое перо, будучи брошенными с равной высоты, достигают лунной поверхности одновременно.
Интересно, что в “Физике” Аристотеля падение в вакууме описано так: “Конкретная скорость движения тела в среде определяется формой и силой, придавшей импульс. Выходит, что в пустоте все тела были бы одинаково быстры. Но это невозможно”. То есть, Аристотель прямо допускает, что в пустоте скорость (точнее – “быстрота”, см. ниже) может быть одинаковой, но этим он обосновывает невозможность существования пустоты. Так, в том же тексте объясняется, что нет “соизмеримых с нулём” чисел, с помощью которых можно было бы обозначить скорость движения тела в пустоте: так как при отсутствии сопротивления среды максимальная скорость получилась бы бесконечно большой. А из-за того, что эта (сколь-угодно большая, “неизмеримая”) скорость универсальна, всякая пустота должна была бы всё равно мгновенно заполниться окружающим веществом.
Вообще, Аристотель не просто рассматривает падение тел строго через некоторую среду, но и предлагает классифицировать быстроту движения по пропорциям веса и сопротивления среды. А для “пустоты” такая классификация не работает, поскольку “в пустоте все тела были бы одинаково быстры, но без причины”, либо их максимальная скорость оказывается сколь угодно большой. Соответственно, пустоту (вакуум) Аристотель отвергает. И нужно учитывать, что Аристотель оперирует древнегреческими терминами и понятиями. Так, “полнота” (“заполненное”) и “пустота” (“пустое”) – πλῆρες и κενόν – это “первичные составляющие”, но Аристотель утверждает, что “полнота” должна быстро заполнять всякую пустоту, иначе возникают трудности с классификацией движения. А “скорость” в соответствующем фрагменте у Аристотеля обозначается словом τάχος, которое можно перевести и как “быстрота”, то есть, это, конечно, “скорость”, но в смысле минимального затрачиваемого времени (конкретно, “одинаково быстры” – ἰσοταχῆ; где знакомая приставка “изо-“/ἰσο как раз и обозначает одинаковость). (Другие сходные значения для той же основы: скорый, проворный и т.д.). Да и строит соответствующее понятие Аристотель на базе соизмеримости проходимых интервалов пути, интервалов времени. То есть, речь явно идёт о максимальной скорости (“быстроте движения”), достигаемой телом.
Так что, во-первых, Аристотель прямо пишет, что в пустоте скорость всех тел была бы одинаковой (а это тот самый эксперимент с пером и молотком в вакууме, который, якобы, опровергает представления Аристотеля); во-вторых, Аристотель утверждает, что пустоты быть не может (ну или он отказывается её допускать в рамках своей модели), а поэтому практическая максимальная скорость будет всегда разной у тел разного веса, при прочих равных параметрах (а это как раз хорошо подтверждается экспериментом, если пух и свинцовый шарик бросать в воздухе или, предположим, разные камни – в воде или в масле, как, возможно, делал Аристотель).
Комментировать »
Одна из не очевидных особенностей DNS, как сервиса, в том, что этот сервис позволяет преодолевать самые разнообразные системы сетевых ограничений. Типичная ситуация: на некотором сервере закрыты не только все внешние входящие, но и исходящие сетевые соединения “во внешний Интернет”; это может быть сделано как силами сетевого экрана (файрвола) в операционной системе, так и настройкой правил на том или ином маршрутизаторе, за которым подключен сервер. Однако DNS-сервис здесь доступен через выделенный локальный (для сетевого сегмента) резолвер без ограничений. Почему? Во-первых, без DNS не работает множество привычных системных утилит. Во-вторых, администраторы нередко воспринимают DNS именно как сервис, поэтому доступ к резолверу считается доступом к локальным ресурсам и не фильтруется.
Понятно, что так как исходящие соединения закрыты, то запущенная на сервере “троянская программа” не сможет простым способом передать какие-то данные внешнему узлу. Но можно передать данные через DNS. Типовой и универсальный способ – запрос A-записи для имени в доменной зоне, которая делегирована на авторитативные серверы, контролируемые “принимающей стороной”. Предположим, что нужно передать последовательность из нескольких байтов (с произвольными значениями), а “инструментальная” доменная зона – test.ru. Закодируем последовательность тем или иным способом в подмножество допустимых ASCII-символов и запросим в DNS имя, где получившаяся строка будет дописана на третьем (и ниже) уровне: JBQWY3DPFVUGC3DMN4QSCIIK.TEST.RU. Данное имя, через резолвер (или несколько резолверов) попадёт в составе запроса на авторитативный сервер зоны test.ru, где его можно обработать и извлечь данные. (При необходимости, можно разделить запись полезной нагрузки точками – это не повлияет на доставку.)
DNS-запросы, содержащие подобную “абракадабру”, далеко не всегда вызывают подозрения, потому что могут генерироваться не только какими-нибудь элементами ботнета, но и вполне штатными программами, которые таким образом пытаются, например, обнаружить подмену и перехват DNS. Однако, для повышения уровня скрытности, запросы могут кодироваться каким-нибудь другим, вполне “безобидным”, способом: table.is.unavail.fedora.test.ru. Но каждый шаг в сторону снижения уровня “подозрительности” будет снижать и пропускную способность канала передачи.
(В обратную сторону подобная схема тоже может работать, но с меньшей надёжностью, поскольку DNS-ответы могут быть подменены, в том числе, ответы с А-записями.)
Комментировать »
Переход сети ARPANET на TCP/IP состоялся 01/01/1983 – то есть, в 2023 году Интернету исполнилось 40 лет. Почему отсчёт связан именно с этой датой? Потому что Интернет, как глобальная сеть, это именно ARPANET c TCP/IP и связанные технологии, к которым, прежде всего, отсносятся механизмы IP-маршрутизации между компьютерными сетями. Интернет составляют автономные системы. Логические инструменты, позволяющие определить автономную систему (в терминах Интернета и маршрутизации), это следущие понятия:
- межсетевая граница контроля над связностью узлов;
- пограничный маршрутизатор;
- алгоритм маршрутизации и схема межсетевой адресации узлов.
Межсетевая граница – позволяет разделить сетевые узлы внутри и сетевые узлы снаружи, с точки зрения структуры связности; ключевой аспект: локальная администрация сети контролирует и самостоятельно определяет связность локальных узлов (то есть, “какой компьютер куда и как подключен”), а на “коммутацию” внешних узлов повлиять не может и об их реальной связности ничего априори не знает.
Пограничный маршрутизатор – узел, который позволяет логически взаимодействовать с внешними сетями и, по сути, формирует основу для преобразования внутренних политик доставки пакетов во внешние; то есть, пограничный маршрутизатор как раз позволяет получить информацию (с ограничениями) о том, как связаться с внешними узлами, находящимися в других автономных системах.
Алгоритм маршрутизации и межсетевой адресации узлов – это универсальный и эффективный способ адресовать сети и узлы так, чтобы можно было строить практические маршруты доставки пакетов через межсетевые границы при помощи пограничных узлов-маршрутизаторов, абстрагируясь от свойств физических каналов и конкретных протоколов электросвязи. Это и есть IP (префиксы и адреса узлов) и необходимый, в современной сети, BGP (Border Gateway Protocol).
Второй важнейший составляющий элемент Интернета – DNS. Но здесь он оставлен за скобками.
Идея о том, что можно обмениваться обобщёнными “пакетами данных”, самоочевидная. Тем более, если уровень технического развития такой, что уже есть вычислительные машины. Первые строгие механизмы систематической доставки “пакетов данных” очень древние: почтовая связь по дорогам силами гонцов и оптические телеграфы (прообраз электросвязи). Телеграфная связь между “вычислителями” существовала ещё в те дни, когда полупроводниковых электронных вычислительных машин не было, а сложные расчёты проводили с использованием механических калькуляторов организованные коллективы “лаборантов”, работавших параллельно по общей схеме в одном помещении. Но, конечно, это ещё не являлось “Интернетом”.
Комментировать »
Сейчас популярна история с чат-ботом ChatGPT, который даёт пространные ответы на вопросы из самых разных областей. Мне доступ к данному сервису получить не удалось (там хотят слишком много реквизитов), но это не важно: понять, о чём речь, не так уж трудно по многочисленным цитатам. Всё это увлечение соответствует попыткам найти смысл непосредственно в тексте. Проблема в том, что текст, как набор символов с определённой структурой, тем не менее, самостоятельного смысла не несёт. Смысл образуется (или не образуется) после того, как результат прочтения текста вкладывается в некоторую большую структуру; и чтобы говорить об “интеллекте”, давать оценки, данная структура должна быть заметно мощнее конкретного текста. Это, впрочем, хорошо известное явление, про которое написано очень много и подробно. Несомненно, письменность очень важна не только для древних языков, но и для современных. Однако переход автоматического генератора текстов от фильтрации совсем примитивных конструкций к “наследованию” чуть более развитой “семантической” структуры, свойственной многим текстам по заданной теме, скорее свидетельствует об успешной оптимизации использования вычислительной аппаратуры с целью удивить пользователей Интернета, чем о чём-то ещё.
В советском мультфильме “Трое из Простоквашино” (1978 года) есть эпизод с Галчонком и потальоном. Почтальон Печкин стучится в дверь, но дома только специально обученная птичка – Галчонок, который на стук реагирует одной и той же фразой.
– Кто там? – спрашивает Галчонок. (Это единственная фраза, которую он знает на тот момент.)
– Это я, почтальон Печкин, принёс заметку про вашего мальчика, – отвечает Печкин. Ничего не происходит, поэтому почтальон стучит снова.
– Кто там? – спрашивает Галчонок.
– Это я, почтальон Печкин, принёс заметку про вашего мальчика, – отвечает Печкин.
Цикл “запрос-ответ-пояснение” повторяется многократно. В какой-то момент Галчонок замечает муху на оконной раме и клюёт её, производя тем самым стук.
– Кто там? – спрашивает, вместо Галчонка, заскучавший Печкин.
– Это я. Почтальон Печкин. Принёс заметку. Про вашего мальчика, – будто телетайпом отбивает ответ Галчонок.
И тут столкновение могучих интеллектов оканчивается поражением Печкина: эмоционально потрясённый, почтальон теряет сознание.
Комментарии (3) »
В прошлой заметке я написал, что уже давно не приходится использовать C для того, чтобы “что-то написать”, а только для того, чтобы вносить исправления в “старый” (или чужой) код. Записка опубликована вчера, а уже сегодня я сообразил, что вот же – пишу код для некоторых хитрых часов, работающих на Arduino. Естественно, этот код я пишу на C/C++ (от “плюсов” – там очень немного), так как именно такой вариант предлагает типовая среда разработки. Внёс пояснение в прошлую записку. Кстати, для AVR/Arduino я тоже иногда использую ассемблер – см. криптографическую библиотеку.
Комментировать »
Поделюсь текущим состоянием набора “инструментальных” языков программирования, которые использую сейчас. Речь тут именно об использовании на практике. И основной сейчас – Golang, но встречается и Python (см. пояснения ниже), заметное место занимает JavaScript (как ни странно), а вот Perl – напротив, уже не заметен (но всё ещё встречается). А что касается языков уровнем ниже, то ассемблер тоже всё ещё иногда требуется (пример: реализация шифров).
Некоторые детали: Go оказался настолько удобным по конструкциям и сопутствующим инструментам, что заменил (для меня) даже Perl как язык для сиюминутной обработки наборов данных; то есть, Go играет и роль “скриптового языка”, но не только, поскольку на Go написал немало “долгоиграющих” модулей и утилит, в том числе, касающихся приложений криптографии (один из примеров – тестовый сервер TLS 1.3).
Python, фактически, входной язык SAGE (это система компьютерной алгебры, которую я постоянно использую), поэтому сопутствующие вычисления тоже приносят за собой данный язык, но этим объём применения Python, в моём случае, практически полностью исчерпывается. А вот место JavaScript обусловлено клиентскими веб-приложениями, исполняемыми в браузере. Кроме перечисленного, регулярно встречаюсь с Bash (как воплощением shell-скриптов) и Lua. Что касается исчезновения Perl: в своё время я достаточно много кода написал на C, но вот уже лет семь необходимости писать на этом языке не возникало (edit 05/01/23: естественно, кроме Arduino/AVR и пр. – здесь я использую C/C++), за исключением мелких правок кода (это именно в плане что-то заметное написать; читать и немного править написанное на C – приходится постоянно); с Perl-ом, похоже, складывается такая же история.
(Edit 05/01/23: почему-то забыл упомянуть PHP.)
Комментарии (1) »
Немного поправил внутренний код и CSS темы оформления WordPress, которая используется на dxdt.ru сейчас. Визуальных изменений очень мало, но если показывается неправильно (что-нибудь уехало и т.д.) в браузере, то нужно нажать Ctrl+F5 или Ctrl+Shift+R (относится только к десктопным браузерам, понятно).
Кстати, нередко для обновления страницы предлагают использовать Ctrl+R (F5). Но, в случае изменений на строне разработки, это не лучший вариант, по крайней мере, для Firefox и Chrome: Ctrl+R действительно вызывает повторную загрузку страницы, но разрешает использование собственного кеша браузера, так что какие-то элементы могут читаться из кеша. А вот Ctrl+F5 или Ctrl+Shift+R – это загрузка страницы со сбросом состояния кеша.
(А вёрстку, конечно, нужно существенно переделать, с учётом изменений, которые произошли в веб-разработке за минувшие годы.)
Комментировать »
Всякий художник может нарисовать зайца. Дюрер нарисовал зайца. Верно ли, что всякий заяц нарисован Дюрером? Нет, не верно, потому что даже заяц Дюрера нарисован красками.
Традиционная записка к Новому году. WordPress показывает, что на dxdt.ru сейчас опубликовано 2646 записок. Это означает, что получился некоторый прирост по сравнению с прошлым годом. Несколько ссылок:
С наступающим Новым годом! Спасибо, что читаете.
Комментировать »
Добавил (некоторое время назад) в DNS-зону dxdt.ru HTTPS-запись. Название записи может показаться странным в контексте DNS, тем не менее, именно так новая запись, описанная в черновике RFC, и называется. Я кратко упоминал эту запись в статье об использовании DNS для публикации вспомогательной информации:
Например, идёт работа над черновиком (draft) спецификации для DNS-записей с рабочим названием SVCB/HTTPS. Предполагается, что эти записи будут использоваться для публикации данных, определяющих начальные настройки доступа к интернет-ресурсам под данным доменным именем. Отличие от уже имеющихся типов записей (например, от адресных записей) весьма существенное: записи SVCB/HTTPS позволят публиковать сразу набор сведений о нескольких «фронтендах», ответственных за соответствующий сервис (например, веб) под заданным именем; в этот набор включаются разнообразные дополнительные параметры, например, определяющие нестандартные номера портов TCP/UDP, на которых отвечают серверы, или криптографические ключи, позволяющие установить соединение со скрытым сервисом.
Так как dxdt.ru не использует сложных настроек и каких-то дополнительных сервисов для доставки веб-страниц, то и соответствующая HTTPS-запись получилась максимально простой: она всего лишь информирует, что к веб-узлу следует сразу подключаться по HTTPS. То есть, клиент, который поддерживает SVCB/HTTPS, при получении ссылки на сайт с протоколом HTTP, не будет пытаться установить небезопасное подключение, чтобы прочитать HTTP-перенаправление на HTTPS, а сразу использует безопасный протокол. По крайней мере, такова цель размещения HTTPS-записи – реально, мало кто их пока что поддерживает.
А основные SVCB-записи, конечно, гораздо богаче по предоставляемым возможностям. В основном, из-за того, что позволяют публиковать криптографические ключи и сведения о точках входа, которые могут быть использованы для установления соединения в режиме “максимального сокрытия” метаинформации. Это развитие технологии ESNI.
Комментировать »
В продолжение заметки про TLS-сертификаты и роль Certificate Transparency. Конечно, наличие меток логов Certificate Transparency может служить в качестве дополнительного признака при валидации сертификата браузером. Однако нужно учитывать тот факт, что сама по себе корректная SCT-метка в сертификате вовсе не означает, что данный сертификат был добавлен в лог. Дело в том, что для получения корректной метки достаточно знать сам исходный сертификат (чтобы вычислить значение хеш-функции) и знать секретный ключ лога (чтобы вычислить значение подписи). Собственно, сами SCT-метки появились для того, чтобы отделить вычислительно сложный процесс добавления сертификата в лог от процесса создания метки, предназначенной для включения в сертификат. Согласно планам применения, наличие метки означает, что оператор лога видел сертификат (и должен включить его в лог, иначе оператор нарушает некоторые правила). Если же посмотреть на этот процесс строго, то наличие метки в сертификате означает, что сертификат видела сторона, знающая секретный ключ лога. Поэтому, если клиентская программа, – например, браузер, – не проверяет наличие сертификата непосредственно в логе, а полагается лишь на корректную SCT-метку, полученную в сертификате, то и проверяет такая программа только дополнительную подпись на сертификате, не более того. То есть, для выпуска валидного сертификата с валидной меткой, стороне, которая выпускает такой сертификат, потребуется доступ к двум ключам – удостоверяющего центра и оператора лога (и не обязательно, что эти две роли играют совершенно разные организации). Не более того.
Естественно, проверять наличие сертификатов в логах можно отдельно и другими программами. Главное – получить сам сертификат. В теории, если обнаружен сертификат с меткой, который, тем не менее, отсутствует в соответствующем логе, данный лог должен быть исключен из списка доверенных браузера. И это очень напоминает историю с удостоверяющими центрами TLS.
Комментировать »
Новый