Поддержка постоянного времени ... Заметка
RSS Блог "След бит"

Поддержка постоянного времени появилась в LLVM: Защита криптографического кода на уровне компилятора

Trail of Bits разработала поддержку кодирования с постоянным временем для LLVM 21, предоставляя гарантии на уровне компилятора, защищающие криптографический код от атак с ветвлением, устраняя критическую уязвимость, когда агрессивные современные компиляторы случайно вводят ветки, зависящие от данных, во время оптимизации. Основным решением является __builtin_ct_select intrinsic, который превращается в специальное промежуточное представление LLVM (llvm.ct.select.*), выступающее в роли барьера безопасности, заставляющее компилятора сохранять свойства операции постоянного времени на протяжении всего конвейера компиляции. Без этого тщательно проработанный код постоянного времени, подобный используемым в таблицах поиска, может быть сломлен стандартными оптимизациями компиляторов, которые вводят спекулятивное ветвление, создавая уязвимые тайминговые побочные каналы, обнаруживаемые даже при минимальных колебаниях циклов. Эта работа напрямую затрагивает результаты таких исследований, как «Во все тяжкие», которые документировали систематические сбои гарантий постоянного времени во многих производственных криптографических библиотеках, вызванные компиляторами. Внутренняя __builtin_ct_select обеспечивает постоянное выполнение на различных архитектурах — с использованием cmov на x86-64, CSEL на AArch64 и маскированной арифметики на платформах без инструкций постоянного времени — позволяя разработчикам писать портативный и безопасный код. Обновление этих изменений потребовало широкого взаимодействия с сообществом, что вызвало большой интерес со стороны таких проектов, как Rust Crypto и PuTTY, которые планируют заменить сложные обходные пути сборки на эти новые примитивы. Начальный бенчмаркинг подтверждает минимальные накладные расходы на производительность при 100% сохранении свойств постоянного времени на всех тестируемых уровнях оптимизации, успешно интегрируясь с основными криптографическими библиотеками. В будущих планах предусмотрено расширение поддержки с помощью дополнительных внутренних элементов, таких как __builtin_ct_expr для принудительного вычисления целых выражений без ветвей, а также внедрение в таких языках, как Rust, Swift и WebAssembly, ориентированных на LLVM.