Ресурсы: техническое описание TLS, LaTeX - в картинки (img), криптографическая библиотека Arduino, шифр "Кузнечик" на ассемблере AMD64/AVX и ARM64
Даниэль Бернштейн (Daniel J. Bernstein) опубликовал большую статью (англ.) с критикой некоторых возражений, относящихся к возможности создания универсальных квантовых компьютеров. Вообще, основной посыл статьи такой: нужно немедленно повсеместно внедрять постквантовую криптографию, потому что, исходя из анализа ситуации, не удаётся найти веских причин для уверенности в том, что АНБ уже не строит активно (или построило) квантовый компьютер, пригодный для практического криптоанализа.
В статье есть странный частный момент: в качестве примера, поясняющего, почему проблема огромного количества состояний, с которым должен работать квантовый компьютер, – это совсем не проблема, приводится работа обычного, классического компьютера с тысячей битов. То есть, обычный компьютер без труда может сгенерировать тысячу случайных битов, а потом провести с ними преобразование, которое изменит распределение вероятностей. Поэтому и тысяча кубитов, якобы, не создаёт теоретических проблем теоретическим квантовым компьютерам.
Бернштейн тут же прямо отмечает, что квантовые вычисления на кубитах это не то же самое, что и вычисления с обычными битами, но, тем не менее, подчёркивает, что практическая возможность обрабатывать отдельные состояния в тысячу битов любым классическим ноутбуком каким-то образом отменяет и проблему с огромной размерностью пространства состояний гипотетического квантового компьютера на тысячу кубитов. Цитата:
I’m not saying that computation on qubits is the same as computation on random bits. When you look at the details, you see that quantum computation allows a useful extra trick, setting up interference patterns between positive and negative variables. But an argument saying “quantum computing is impossible because there are so many variables” can’t be right: it also says that your laptop is impossible.
(“Я не утверждаю, что вычисление на кубитах это то же самое, что и вычисление на случайных битах. Если посмотреть детально, то можно увидеть, что квантовое вычисление позволяет провести дополнительный полезный трюк, задав схемы интерференции между положительными и отрицательными переменными. Однако аргумент, говорящий, что “квантовые вычисления невозможны, так как там настолько много переменных”, не может быть верным, поскольку этот же аргумент говорит, что ваш ноутбук невозможен.”)
Вообще, именно возможность “интерференции между переменными”, это не просто трюк, а она таки составляет смысл квантовых вычислений, которые, собственно, вычислениями, в привычном смысле, и не являются. Чтобы интерференция состояний стала возможной, логично допустить, что эти состояния где-то “должны размещаться”. То есть, это не обязательно так, не является необходимым условием. Потому что можно, скажем, посчитать, что соответствующие потоки вероятностей и составляют некоторую над-реальность, а наблюдается только её “срез”, вызванный представлением экспериментатора (возможны ли при этом квантовые вычисления – другой вопрос). Однако, сама идея, что для 2^1000 состояний используемые модели “квантовой механики” не работают, не только не выглядит нелогичной, но уж точно не разрушается возможностью обработать тысячу битов классическим ноутбуком: в классическом ноутбуке другие состояния битовой строки возникают как программное представление после выполнения преобразования, а не являются фундаментом физической реализации алгоритма в некотором аналоговом вычислителе.
Комментировать »
Исследователями из Watchtowr опубликовано подробное описание того, как обнаружили возможность и реализовали удалённое исполнение кода (RCE) в свежей CVE-2025-0282 (Ivanti Connect Secure – это, как нередко случается, корпоративный продукт для “защищенного корпоративного VPN”).
Описание по ссылке выше – довольно техническое, требует специальных знаний для понимания. Если кратко, то основой данной уязвимости является типовое переполнение буфера из-за перепутанных в исходном коде значений максимального размера массива, но вот для успешной реализации – потребовались не самые прямолинейные техники.
Как справедливо замечают в тексте описания исследователи, исходную ошибку, приводящую к переполнению буфера, смог бы обнаружить даже простой статический анализатор кода. Но, в принципе, понятно, почему статический анализатор не был здесь должным образом использован компанией-разработчиком. Дело в том, что применение таких инструментов не на бумаге требует высокой квалификации от применяющего, так как сам по себе стат. анализатор мало что даёт – ещё нужен редкий специалист, понимающий, что именно происходит, с разных сторон: со стороны ИБ, со стороны устройства компиляторов и разработки ПО, со стороны устройства аппаратуры и практики “сетевых технологий”, и т.д. Ещё один пример, показывающий, что так называемая “безопасная разработка”, как принцип, в целом, интересна, но практическое значение соответствующих инструментов в корпоративной среде сильно преувеличено. Впрочем, вернёмся к описанию уязвимости.
Прямолинейной эксплуатации через перезаписывание стека помешало наличие в этом стеке указателя на блок памяти, который должен был освобождаться перед возвратом из атакуемой функции (то есть, вызов конструкции с free() приводил бы к преждевременному возникновению исключения). Но исследователи смогли найти точку модификации таблицы Vtable, которая содержит указатели на функции (это типовая конструкция для “виртуализации” “методов” в C++), а потом ещё успешно нашли в коде гаджет*, модифицирующий указатель стека. Причём, поиск гаджета был затруднён тем, что требовалось найти точку для входа, которая совпадала бы не только по подобранному значению указателя, но и по значению смещения, жёстко зафиксированного в исполняемом коде. А это стало возможно потому, что исследуемое приложение использует много библиотек: “It’s a good thing that the Ivanti web binary contains so many libraries”. Как говорится, принцип разработки с созданием минималистичного и простого собственного кода мог бы здесь помочь. Ну, раз не помог стат. анализатор.
* – дополнение от 13.01.2025: гаджет – фрагмент машинного кода с нужными свойствами, оканчивающийся командой передачи управления, см. комментарии к записке.
Комментарии (2) »
А в контексте сообщений об отказе Facebook (и сопутствующих сервисов) от “фактчекеров” нужно учитывать пару моментов. Во-первых, причина там не называется, но вот сама ситуация со столь быстрыми изменениями – подозрительная. Во-вторых, насколько можно понять, планируют заменить имеющийся механизм на некий ещё более заметный вариант с демонстрацией значков “одобрено пользователями Facebook”, но даже без минимальных пояснений со ссылками на “газетные публикации”, а так как Facebook – это центральный инструмент, то, предположим, реально одобрять станут AI-LLM-боты, управляющие специальными аккаунтами: развитие давнишней схемы, которая активно используется уже несколько лет, ну и удобное применение для новомодных LLM.
Комментировать »
В 2024 году опубликованы только две моих статьи (записки на dxdt.ru подсчитаю позже отдельно, их сильно больше), обе о разных аспектах постквантовых криптосистем в TLS для браузеров:
“Постквантовая криптография и практика TLS в браузерах” в журнале “Интернет изнутри”;
“Постквантовые криптосистемы в TLS и не только” на сайте ТЦИ.
Комментировать »
Хоть и совсем не планировал, но всё же собрался с силами и, прямо к концу года, подготовил и выпустил обновление технического описания TLS: очень меня беспокоило то, что скоро десять лет регулярным обновлениям описания, а в текущей версии (2023 года, да) вообще не было упоминания ML-KEM; что, с одной стороны, простительно, так как в 2023 году ещё и официального названия такого не было у данной криптосистемы, – было Kyber, – но, с другой стороны, промелькнувшую Kyber768 читающему описание может быть сложно сопоставить с современной ML-KEM.
Поэтому основное изменение новой версии – это раздел про криптосистемы с постквантовой стойкостью в TLS, который я переписал с учётом того, что X25519+Kyber768 в основных браузерах стала ML-KEM+X25519. Ну и ещё внёс в нескольких местах небольшие исправления, актуализировав текст – например, про то, что RSA не рекомендуется в качестве средства обмена ключами.
Комментировать »
Кстати, в рамках свежего обновления, на сервис ТЦИ audit.statdom.ru, кроме прочего, добавлен вывод HTTPS-записи (при наличии, см. скриншот) и определение поддержки MLKEM+X25519 для TLS-узлов (см. второй скриншот).
На скриншоте – HTTPS-запись DNS-зоны, размещённой на сервисе Cloudflare. Можно видеть сведения об IP-адресах, указание на то, что присутствует ECH-конфигурация (сама конфигурация пока что не выводится).
Обнаружение поддержки постквантовой гибридной криптосистемы MLKEM+X25519 выполяется TLS-сканером отдельно (естественно, это, пока что, редкая криптосистема, если распространённость определять по количеству TLS-узлов).
Комментировать »
Кстати, ECH для TLS я достаточно подробно, – но, вместе с тем, популярно, – описывал в отдельной статье на сайте ТЦИ в 2021 году. Описание там дано в контексте развития “этих интернетов”, начиная от ESNI, что, на мой взгляд, весьма полезно.
Comments Off on Ссылки: популярное описание ECH
Языки программирования на GitHub, рейтинг 2024 года: всех обогнал Python, что и понятно – первая же главная тенденция, упомянутая в отчёте GitHub, – рост активности по разработке AI/ИИ. Я GitHub, в смысле публикации результатов, практически не использую (кроме того, конечно, что это типовой источник исходных кодов и других весьма полезных данных), а вот языки программирования – использую. Python, который с первого места рейтинга, – использую регулярно, но по чуть-чуть: в основном, потому что это входной язык SAGE (система компьютерной алгебры), но и потому, что весьма удобно написать какой-то быстрый демонстрационный скрипт, иллюстрирующий работу с тем или иным API.
На втором месте рейтинга – JavaScript. Постоянно теперь использую, так как он среди основных языков в паре проектов, к которым я имею непосредственное отношение.
Третье место – TypeScript. Не использую, однако специфический код, хоть и редко, но попадается.
Четвёртое место – Java. Очень давно не использую. Однако с кодом на Java сталкиваюсь не так редко, как хотелось бы.
Пятое место – C#. Очень и очень давно не использую, не попадается.
Шестое место – C++. Иногда использую, в том числе, всякие “варианты” для Arduino и др. Код попадается постоянно. Вообще, я согласен с известным мнением, что основной недостаток “плюсов”, как явления, в том, что никто их реально не знает (буквально).
Седьмое место – PHP. Иногда использую: например, dxdt.ru работает на WordPress, а это PHP.
Восьмое место – Shell. Что бы это ни значило, однако большие bash-скрипты – и пишу, и использую постоянно.
Девятое место – C. Регулярно использую (см. комментарий к шестому пункту выше). Постоянно требуется смотреть в код на C. Для криптографических инструментов, системных сервисов – всё ещё основной язык подлинной документации (а не “руководства пользователя”).
Десятое место – Go. Сейчас у меня это основной используемый язык, он был бы на первом месте, но в рейтинге GitHub – почему-то на десятом.
Perl не попал в десятку. Шутка. Ну, то есть, действительно не попал, а я иногда использую, но гораздо реже, чем разные ассемблеры. Впрочем, Rust в десятку тоже не попал (пока так и не использую, но код иногда читать приходится).
Кстати, о языках: несмотря на название (GitHub), в том же рейтинге самый большой прирост разработчиков на данной платформе указан для Великобритании.
Комментировать »
На сайте ТЦИ опубликована моя статья «Постквантовые криптосистемы в TLS и не только». Там про ML-KEM и вес ключей, а также о сертификатах и, – немного, – о квантовых вычислениях. Цитата:
Может даже показаться, что массовый переход на постквантовую криптографию в Интернете уже почти завершился, а вот квантовых компьютеров, из-за которых всё и было затеяно много лет назад, на горизонте пока не видно. Впрочем, это не совсем так. Но, конечно, не в части видимости квантовых компьютеров на горизонте, – их не видно всё так же, как и двадцать лет назад, – а в части внедрения постквантовой криптографии. Несмотря на бесспорные практические успехи и огромнейший отрыв от сугубо теоретических квантовых компьютеров, до всеобъемлющего внедрения всё ещё далеко (если такое внедрение когда-либо вообще потребуется).
Комментировать »
Очередная атака “про Spectre”, позволяющая, в частности, читать память произвольных процессов в Linux, и на Intel, и на AMD. Пусть в этот раз речь в публикации не про новые аппаратные особенности, а про исправления в старых особенностях, но я всё же сошлюсь на свою записку о неустранимости подобных дефектов аппаратуры.
(Подробная статья на OpenNET.)
Комментировать »
Решил посмотреть, что пишут в поисковых машинах про TLS. Не обошлось без ИИ. По профильному запросу “Аутентификация в TLS” поиск Ya.ru (это “Яндекс”) отдельным блоком в самом верху страницы показывает текст со странным утверждением, что MITM-атака, это “когда третья сторона вмешивается в соединение двух участников и перехватывает закрытые ключи”. Тут же указано, что это текст от YandexGPT. Да, MITM подразумевает вмешательство третьей стороны, но суть атаки состоит в том, что эта третья сторона выдаёт себя за другого участника обмена, а не “в перехвате закрытых ключей”. MITM, хоть и может использоваться для “перехвата ключей”, но, вообще-то, не про перехват, а про подмену.
Впрочем, цитата сопровождается ссылкой на более объёмное “Введение в TLS”, которое, насколько можно понять, тоже сгенерировано YandexGPT, однако подписано Yandex.Cloud и опубликовано на другом сайте из “обломков” “Яндекса”, а именно, – ни много ни мало, – на сайте самого этого сервиса Yandex.Cloud, который, вроде бы, имеет прямое отношение к информационным технологиям (впрочем, сейчас уже сложно определить). Кроме прочих занимательностей, на этой странице с описанием TLS, например, в блоке с подзаголовком “Целостность данных в TLS” сказано, буквально, следующее:
“TLS гарантирует защиту передаваемых данных от потери, изменения или дублирования. Для этого применяются функции хеширования, вычисляющие контрольный хеш данных и присоединяющие его к основному сообщению. Сравнение отправленной и полученной хеш-суммы данных позволяет убедиться в том, что информация пришла в исходном виде”.
Насколько это далеко от реальности? Так, TLS никак не гарантирует “защиту передаваемых данных от потери”: такая защита – задача из области, как минимум, транспортных протоколов, а как максимум – из области помехоустойчивого кодирования. В TLS и близко нет никакой защиты от потери данных. Напротив, протокол полностью полагается на то, что данные между сторонами уже передаются без потерь. Что касается защиты данных от изменения – да, целостность TLS пытается обеспечить, верно. А вот защита “от дублирования” – это, видимо, из области систем хранения данных (дело в том, что от “дублирования передаваемых данных” TLS тоже никак не защищает, передавайте сколько хотите копий исходных данных, однако не стоит тут путать слова из описаний атак, основанных на повторной передаче сообщений).
Конечно, “сравнение отправленной и полученной хеш-суммы данных” вовсе и не позволяет убедиться в том, что “информация пришла в исходном виде”, как почему-то утверждается: к изменённым данным нетрудно приделать соответствующее значение хеш-функции, поскольку хеш-функции для заданного значения вычисляются быстро, а вот коды аутентификации – они хоть и используют хеш-функции и подобные конструкции, но работают совсем не поэтому и не так: обнаружение изменения данных обеспечивается секретностью общего ключа аутентификации сессии, а не самой хеш-функцией.
К сожалению, некорректные и весьма странные утверждения встречаются по всему упомянутому тексту. Видимо, это всё результат, выданный синонимайзером YandexGPT. Например, в блоке “Преимущества использования TLS” утверждается, что “протокол TLS поддерживает NAT” и что “в TLS встроены функции журналирования и аудита”. Если что, то ни первое, ни второе – не верно: в TLS, естественно, нет “поддержки NAT”, но протокол, понятно, может работать через соединение, использующее трансляцию адресов (NAT); TLS не предусматривает никакого “журналирования и аудита” на уровне протокола, да ещё и в качестве “преимущества”, всё строго наоборот – TLS современной версии (1.3) старается снизить возможности по сбору метаинформации, которая могла бы обеспечить “журналирование” и “аудит”.
Представьте, что текст, позиционируемый как описание принципов построения современных языков программирования, содержит следующий фрагмент: “В языках программирования очень распространён оператор присваивания. Из-за своих преимуществ этот оператор обозначается двойной вертикальной чертой и помещает в переменную справа, которая называется “регистром”, значение суммы переменных слева. Оператор присваивания повсеместно записывается вот так: a,b || c”. Подходит ли такой текст в качестве ответа на вопрос об операторах в современных языках программирования? Вряд ли. При этом, поисковые системы всё ещё не полностью растеряли “авторитетность” в глазах пользователей Веба, так что пользователи теперь вынуждены пытаться осмыслить “ответ”, сгенерированный LLM, тем более, что ответ, – вроде как, – записан строгим текстом. Такой вот прогресс.
Комментировать »