Название базовой системы (платформы): | Unix |
Дата премьеры системы: | 25 августа 1991 года |
Дата последнего релиза: | 2023/12/11 |
Технологии: | ОС |
Linux, GNU/Linux — общее название UNIX-подобных операционных систем на основе одноимённого ядра и собранных для него библиотек и системных программ, разработанных в рамках проекта GNU. Краткое название Linux распространено потому, что первой, наиболее популярной и единственной системной библиотекой, использовавшейся в системах на базе ядра Linux, была GNU C Library (glibc).
GNU/Linux работает на PC-совместимых системах семейства Intel x86, а также на IA-64, AMD64, PowerPC, ARM и многих других.
Основателем проекта GNU является Ричард Мэттью Столлман (Richard Matthew Stallman)
К операционной системе GNU/Linux также часто относят программы, дополняющие эту операционную систему, и прикладные программы, делающие её полноценной многофункциональной операционной средой.
Хронология развития
2024: Доля Linux на мировом рынке ОС впервые перевалила за 4%
По состоянию на февраль 2024 года доля платформ с ядром Linux на мировом рынке операционных систем для персональных компьютеров впервые превысила 4% и составила приблизительно 4,03%. Для сравнения, годом ранее этот показатель равнялся 2,94%. Такие данные в начале марта 2024-го приводит аналитический сервис Statcounter. Подробнее здесь.
2023
Linux 6.6.6
Грег Кроа-Хартман (Greg Kroah-Hartman), отвечающий за поддержку стабильной ветки ядра Linux, опубликовал знаковый выпуск ядра 6.6.6, в котором предложено одно изменение, затрагивающее беспроводной стек cfg80211. Изменение откатывает добавленное в выпуск 6.6.5 исправление ошибки, которое привело к появлению регрессий из-за того, что вместе с исправлением в ядро 6.6.5 из ветки 6.7 не был перенесён ещё один связанный коммит. Аналогичный откат исправления предложен в версии 6.1.67. Об этом стало известно 11 декабря 2023 года.
Регрессивное изменение приводило к возникновению взаимной блокировки в сетевых менеджерах, работающих в пространстве пользователя. Как результат, возникало зависание процессов сетевых менеджеров во время перезагрузки, завершения работы или ухода в спящий режим. Например, проблема приводила к зависанию при попытке остановки сервисов NetworkManage, iwd и wpa_supplicant после обновления ядра до версии 6.6.5 или 6.1.66. Также после установки ядра 6.6.5 наблюдалось прекращение работы Wi-Fi-драйвера brcmfmac для беспроводных чипов Broadcom[1].TAdviser SummIT 28 мая стал самым масштабным за всю историю его проведения. Более 1,5 тыс участников и 50 стендов. ФОТО
Выход ядра Linux 6.6
30 октября 2023 года стало известно о том, что после двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.6. Среди наиболее заметных изменений: планировщик задач EEVDF; механизм теневого стека для защиты от эксплоитов; поддержка fs-verity в OverlayFS; реализация квот и xattr в tmpfs; подготовка online fsck в XFS; оптимизировано отслеживание экспорта символов "GPL-only"; поддержка сетевых сокетов в io_uring; рандомизация памяти в kmalloc(); объявлена устаревшей ReiserFS; в Nouveau добавлены примитивы для Vulkan-драйвера NVK.
Как сообщалось, в версию принято 15291 исправлений от 2058 разработчиков, размер патча - 39 МБ (изменения затронули 14844 файлов, добавлено 553359 строк кода, удалено 284012 строк). В прошлом выпуске было 14674 исправлений от 2016 разработчиков, размер патча - 78 МБ. Около 44% всех представленных в 6.6 изменений связаны с драйверами устройств, примерно 17% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 11% связано с сетевым стеком, 4% - с файловыми системами и 3% c внутренними подсистемами ядра.
Основные изменения в ядре 6.6:
Память и системные сервисы
- Реализован планировщик задач EEVDF (Earliest Eligible Virtual Deadline First), который пришёл на смену планировщику CFS (Completely Fair Scheduler), поставлявшемуся начиная с ядра 2.6.23. Планировщик при выборе следующего процесса для передачи выполнения учитывает процессы, которые недополучили процессорных ресурсов или получили незаслуженно много процессорного времени. В первом случае форсируется передача управления процессу, а во втором, наоборот, откладывается. Старый планировщик CFS использовал для определения процессов, требующих отдельного внимания, эвристику и тонкие настройки, в то время как обновленный планировщик отслеживает их более явно и не требует тонкой настройки. Предполагается, что EEVDF позволит снизить задержки при выполнении задач, с которыми у CFS возникали проблемы с планированием.
- Внесены изменения в обработку внутренних символов категории "GPL-only", нацеленные на усложнение использования проприетарными модулями GPL-прослоек для обхода ограничений доступа к подсистемам ядра, допускающим обращение только кода под лицензией GPL. В функции symbol_get() для проприетарных модулей запрещён поиск символов, помеченных как GPL-only, и наоборот, GPL-модули не смогут находить символы, экспортируемые проприетарными модулями.
- Добавлены дополнительные настройки рабочих очередей (unbound workqueue) для оптимизации эффективности повторного использования процессорного кэша на крупных системах, имеющих несколько кэшей третьего уровня (L3). В состав ядра также включена утилита tools/workqueue/wq_dump.py для проверки текущей конфигурации рабочих очередей.
- В подсистему io_uring добавлена начальная поддержка операций и команд, специфичных для сетевых сокетов. Добавлен sysctl io_uring_disabled для отключения io_uring на уровне всей системы. В io_uring также оптимизирован прямой ввод/вывод (Direct I/O) в асинхронном режиме. Прирост пропускной способности и снижение задержек при выполнении операций ввода-вывода после внесения изменений достигает 37%.
- Для архитектуры PA-RISC реализован JIT-компилятор для BPF.
- В настройку /sys/devices/system/cpu/smt/control добавлена поддержка числовых параметров, определяющих число потоков, доступных для каждого ядра CPU (ранее поддерживались только значения "on" и "off" для включения и выключения поддержки симметричной многопоточности). Данную возможность можно применять на некоторых процессорах PowerPC, поддерживающих режим горячего включения симметричной многопоточности ("hotplug SMT"), для выборочного включения SMT на определённых ядрах во время работы.
- Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Осуществлён переход на использование выпусков Rust 1.71.1 и bindgen 0.65.1. Реализован типаж 'Zeroable'. Добавлены процедурные макросы 'paste!' и '#derive(Zeroable)'. Обеспечена совместимость с '#pin_data'. Добавлены функции инициализации '{,pin_}init_array_from_fn()' и метод '{,pin_}chain'. Расширены возможности модуля 'types'. Во фреймворк unit-тестирования kunit добавлена возможность запуска тестов из документации Rust.
- Добавлена подсистема "eventfs", позволяющая существенно снизить потребление памяти в системе трассировки, за счёт избавления от хранения лишних структур, применяемых для представления точек трассировки в файловой системе. Ранее подобные структуры создавались для всех точек трассировки, независимо от использования трассировки. При помощи eventfs подобные структуры могут создаваться динамически, только во время необходимости в них.
- Расширены возможности утилиты perf.
- В файл /proc/pid/smaps добавлена информация для диагностики эффективности работы механизма слияния идентичных страниц памяти (KSM: Kernel Samepage Merging).
- Удалён API Frontswap, позволяющий разместить раздел подкачки в памяти, которую невозможно напрямую адресовать и которая не предоставляет оперативной информации о наличии свободного места. Данный API использовался только в zswap, поэтому решено напрямую использовать данную функциональность в zswap, избавившись от лишних прослоек.
- Для архитектуры RISC-V добавлена поддержка доступа к счётчикам производительности из пространства пользователя и возможность размещения дампа ядра после сбоя в области за границей 4GB.
- Добавлена начальная поддержка инструкций ARM SME (Scalable Matrix Extension).
- Реализована возможность использования отладочных инструментов KDB, KGDB, kcov, KFENCE и KASAN на системах с архитектурой LoongArch.
- Добавлена поддержка файлов для тестирования ядра в системе непрерывной интеграции GitLab, которая применяется при разработке графических драйверов.
Дисковая подсистема, ввод/вывод и файловые системы
- В файловую систему OverlayFS добавлена поддержка сохранения хэшей fs-verity в расширенном атрибуте (xattr) overlay.verity, что может использоваться для проверки целостности и подлинности файлов в нижних слоях OverlayFS при помощи криптографических хэшей и ключей. Таким образом, в OverlayFS теперь включены все изменения, необходимые проекту Composefs для работы в форме надстройки над ФС OverlayFS и EROFS.
- В файловой системе XFS проведена подготовка к реализации возможности применения утилиты fsck для проверки и исправления выявленных проблем в online-режиме, без отмонтирования файловой системы. Кроме того, в XFS реализована возможность использования крупных фолиантов (folios) в страничном кэше и добавлены некоторые связанные с этим оптимизации, позволившие заметно поднять производительность для некоторых видов нагрузки.
- В файловую систему tmpfs добавлена поддержка пользовательских расширенных атрибутов (user xattrs), прямого ввода/вывода и квот, привязанных к пользователю и группе. Стабилизированы смещения на каталоги, что решило проблемы с экспортом tmpfs через NFS.
- В API управления монтированием для повышения безопасности добавлен флаг FSCONFIG_CMD_CREATE_EXCL, запрещающий совместное использование суперблока в нескольких точках монтирования (запрещает прикрепление одного раздела к нескольким точкам монтирования). В утилите mount для включения данного флага предложена опция "--exclusive".
- В подсистему VFS добавлена поддержка оперативного изменения параметров c временем доступа и изменения (atime, mtime). Ранее данные о времени отражались с некоторой задержкой, что мешало отслеживанию актуальности данных в кэше в системах, подобных NFS (из-за задержки определения изменений в файле, система могла ошибочно посчитать, что данные в кэше актуальны). Об возможность доступна для Btrfs, Ext4, tmpfs и XFS.
- В Btrfs объявлен устаревшим встроенный механизм проверки целостности, включаемый на этапе сборки через параметр BTRFS_FS_CHECK_INTEGRITY. Указанный механизм остался без сопровождения, больше не тестируется и создаёт дополнительную нагрузку на CPU и память. Кроме того, в Btrfs проведена оптимизация производительности кода проверки ФС (scrub).
- В файловой системе Ext4 добавлены периодические проверки обновления суперблока и оптимизировны операции выделения памяти при дозаписи в конец файла.
- В подсистему FUSE добавлена поддержка атрибута btime ("birth time"), определяющего время создания inode.
- Запрещено изменение прав доступа для символических ссылок, так как права доступа на символическую ссылку не имеют значения и не учитываются в VFS в процессе обработки файлового пути.
- Добавлен системный вызов fchmodat2(), который отличается от системного вызова fchmodat() дополнительным аргументом для указания флагов. Из флагов пока поддерживаются только AT_SYMLINK_NOFOLLOW и AT_EMPTY_PATH, позволяющие без обходных путей реализовать в libc-функции fchmodat() запрет разыменования символических ссылок и возможность использования файлового дескриптора при указании пустого пути.
- В файловой системе EROFS (Extendable Read-Only File System), предназначенной для использования на разделах, доступных в режиме только для чтения, добавлена поддержка алгоритма сжатия Deflate. Для оптимизации поиска расширенных атрибутов задействована вероятностная структура bloom filter.
- Добавлена настройка CONFIG_BUFFER_HEAD, позволяющая собрать ядро без использования структуры buffer_head. При сборке без buffer_head можно использовать блочные устройства и некоторые ФС, например, xfs, btrfs, cramfs, erofs и squashfs.
- В драйвер блочных устройств ublk, позволяющий вынести специфичную логику на сторону процесса в пространстве пользователя, добавлена поддержка зонированных устройств хранения (разделение на зоны групп блоков или секторов, в которые допускается лишь последовательное добавление данных с обновлением целиком всей группы блоков).
- Реализация файловой системы ReiserFS переведена из категории поддерживаемых в разряд устаревших (Obsolete). Прекращение поддержки ReiserFS намечено на 2025 год. В качестве причины перевода ReiserFS в разряд устаревших упоминается стагнация в сопровождении данной ФС, нерешённая проблема 2038 года, отсутствие возможностей по обеспечению отказоустойчивости и желание снизить трудозатраты на сопровождение общих для файловых систем изменений, связанных с поддержкой нового API для монтирования, iomap и фолиантов (folios).
- В NFS-сервере реализован механизм делегирования операций записи для NFSv4, оптимизирующий эффективность кэширования записи файлов для сокращения трафика. Включена поддержка операции READ_PLUS, определённой в NFS 4.2.
- В файловую систему Ceph добавлена поддержка fscrypt.
Виртуализация и безопасность
- Добавлена реализация механизма Shadow Stack, которая позволяет блокировать работу многих эксплоитов, используя аппаратные возможности процессоров Intel для защиты от перезаписи адреса возврата из функции в случае переполнения буфера в стеке. Суть защиты в том, что после передачи управления функции, адреса возврата сохраняются процессором не только в обычном стеке, но и в отдельном "теневом" стеке, который не может быть изменён напрямую. Перед выходом из функции адрес возврата извлекается из теневого стека и сверяется с адресом возврата из основного стека. Несовпадение адресов приводит к генерации исключения, блокирующего ситуации, когда эксплоиту удалось перезаписать адрес в основном стеке. Аппаратный теневой стек поддерживается только в 64-разрядных сборках, а в 32-разрядных сборках применяется его программная эмуляция.
- Добавлена поддержка сборки компилятором Clang с включённым режимом защиты CFI (Control Flow Integrity), блокирующим нарушения нормального порядка выполнения (control flow) в результате применения эксплоитов, изменяющих хранимые в памяти указатели на функции.
- Для архитектуры RISC-V включена рандомизация размещения ядра в памяти при загрузке.
- В системный вызов seccomp() добавлен флаг SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP, позволяющий обрабатывать события из отслеживаемых процессов в синхронном режиме для более эффективной работы планировщика задач.
- В функции kmalloc() обеспечена рандомизация slab-кешей, усложняющая эксплуатацию уязвимостей в ядре.
- Из опций, связанных с включением системы принудительного контроля доступа SELinux, убрано упоминание Агентства национальной безопасности США. Так как проект уже 20 лет развивается под крылом сообщества и сопровождается независимыми мэйнтейнерами решено перейти на использование имени "SELinux" вместо "NSA SELinux" в комментариях и документации в Kconfig (например, пояснение к сборочному параметру SECURITY_SELINUX изменено с "NSA SELinux Support" на "SELinux Support").
- В системный вызов userfaultfd() добавлена операция UFFDIO_POISON, позволяющая пометить страницы памяти "отравленными" (poisoned), что может быть использовано для переноса повреждённых страниц памяти при миграции виртуальных машин с одной системы на другую.
- В подсистему VFIO добавлен символьный интерфейс (/dev/vfio/devices/vfioX) для управления устройствами VFIO, позволяющий пользователю напрямую открыть файл с устройством, без обращения к устаревшему групповому интерфейсу /dev/vfio/$groupID.
- В сервере NFS прекращена поддержка устаревших типов шифрования Kerberos, использующих алгоритмы DES и 3DES.
- При запуске в окружении гипервизора Hyper-V добавлена поддержка гостевых систем, защищённых при помощи технологии AMD SEV-SNP (Secure Nested Paging) и Intel TDX (Trusted Domain Extensions).
- При сборке ядра в режиме "W=1" в компиляторе по умолчанию включены предупреждения "-Wformat-overflow", "-Wformat-truncation", "-Wstringop-overflow" и "-Wrestrict". Для любых сборок включено предупреждение "-Wenum-conversion".
Сетевая подсистема
- Реализация семейства адресов AF_XDP (eXpress Data Path) расширена возможностью работы с пакетами, хранимыми в нескольких буферах (например, в одном буфере может находиться заголовок пакета, а во втором данные, или в цепочке из нескольких буферов могут размещаться большие jumbo-кадры Ethernet). Программы, использующие сокеты AF_XDP, теперь могут принимать и передавать пакеты сразу из нескольких буферов.
- В подсистему BPF добавлена поддержка дефрагментации пакетов IPv4 и IPv6, а также возможность фильтрации фрагментированных пакетов.
- В BPF добавлен обработчик update_socket_protocol, позволяющий BPF-программам изменять запрошенный протокол для сокетов. Например, BPF программа может прозрачно заменить протокол TCP на MPTCP (multipath TCP) для оптимизации трафика приложения. В BPF также добавлена поддержка управления маршрутизацией пакетов через разные потоки в MPTCP.
- Снят признак экспериментальной разработки с модуля ksmbd, предлагающего работающую на уровне ядра реализацию файлового сервера на базе протокола SMB3. Добавлена поддержка объединения операций чтения (запросы "read compound").
Оборудование
- В DRM-подсистему (Direct Rendering Manager) внесены изменения, необходимые для работы открытого драйвера NVK с реализацией графического API Vulkan для видеокарт NVIDIA. Изначально DRM-драйвер Nouveau был рассчитан на реализацию OpenGL, поэтому в нём не хватает примитивов, необходимых для эффективной работы Vulkan-драйверов, например, поддержки синхронизированных объектов и управления виртуальным адресным пространством.
- В драйвере AMDGPU реализована поддержка SDMA 6.1.0, HDP 6.1, SMUIO 14.0, PSP 14.0, IH 6.1 и GFX 9.4.3. Переработан код загрузки прошивок PSP (Platform Security Processor). Расширена поддержка технологии адаптивной синхронизации FreeSync (добавлена поддержка Freesync Panel Replay V2).
- В драйвере i915 продолжена реализация поддержки чипов Intel Meteor Lake. Оптимизирована поддержка технологии защиты от копирования HDCP (High-bandwidth Digital Content Protection). Переработан код для взаимодействия с дисплеем.
- Из Kconfig убраны опции отключения загрузки микрокода на этапе сборки - MICROCODE_INTEL и MICROCODE_AMD. Ядро теперь всегда собирается с кодом загрузки микрокода для систем x86, но фактическую загрузку микрокода можно отключить, указав параметр ядра 'dis_ucode_ldr'.
- В звуковую подсистему добавлена возможность управления звуковыми устройствами, подключёнными через подсистему IIO (Industrial I/O).
- Добавлена поддержка звуковых интерфейсов Intel LunarLake, Intel ArrowLake и AMD ACP5x, кодеков Cirrus Logic CS42L43, Realtek RT1017 и TI TAS2781, а также усилителей Cirrus Logic CS35L56 и winic aw88261. Добавлена поддержка ASoC AMD Van Gogh.
- Добавлен драйвер USB MIDI 2.0 Gadget, эмулирующий интерфейс USB MIDI 2.0, привязанный к устройству ALSA UMP rawmidi.
- Добавлена поддержка Ethernet-контроллеров Broadcom ASP 2.0 и Marvell 88Q2XXX.
- Добавлена поддержка панелей Visionox R66451, TDO TL050HDV35, KD070FHFID015, Inanbo T28CP45TN89 и EDT ET028013DMA, дисплейных контроллеров Loongson и контроллеров сенсорных экранов Azoteq IQS7222D/IQS7210A/7211A.
- Добавлена поддержка ARM SoC Qualcomm SM4450 (Snapdragon 4 Gen 2), TI AM62P5, Intel Agilex5, Qualcomm ipq5018, AN400 (Amlogic T7)
- Добавлена поддержка ARM-плат Samsung Galaxy Tab 3 8.0, FriendlyElec NanoPC T6, Amlogic A311D2, Khadas Vim4, Xiaomi SM7125, Facebook Yosemite 4, Orange Pi Zero 3, Radxa ROCK 4SE.
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.6 - Linux-libre 6.6-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.6 обновлён код чистки блобов в различных драйверах и подсистемах, например, в драйверах TI gigabit RU ethernet, MediaTek 792x wifi, Cirrus Logic cs42l43 mfd, cs35l56 HD-audio и aw88261 SoC. Проведена чистка имён блобов в dts-файлах для архитектуры Aarch64. Удалены блобы в драйверах ivpu, в bluetooth-драйверах, в драйвере к сенсорным экранам и в кодировщике/декодировщике Qualcomm Venus V4L2[2].
В ядрe Linux 6.6 убрана возможность сборки без поддержки загрузки микрокода для систем x86
5 сентября 2023 года стало известно, что в ядро Linux 6.6 внесены изменения, убирающие в Kconfig опцию для включения загрузки микрокода процессора. Теперь ядро Linux после сборки будет безусловно содержать код загрузки микрокода для систем x86.
Изменение внесено в контексте переработки кода для загрузки микрокода процессора, и объясняется тем, что в большинстве случаев эту опцию активируют при сборке ядра для "практически всех систем с голым железом". Стоит отметить, что безусловное включение загрузки микрокода может вызвать неодобрение со стороны отдельных людей и организаций, подобных GNU Linux-libre, которые выступают против подобной практики.
Загрузку микрокода процессора по-прежнему можно отключить при загрузке системы, указав параметр ядра 'dis_ucode_ldr'[3].
Linux 6.5
28 августа 2023 года стало известно о том, что после двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.5. Среди наиболее заметных изменений: поддержка механизма управления питанием Intel TPMI, системный вызов cachestat, продолжение интеграции поддержки языка Rust, поддержка протокола Unaccepted Memory, поддержка векторных инструкций RISC-V, механизм "fprobe-events", перевод в разряд устаревших механизма распределения памяти SLAB, режим "data-only" в Overlayfs, режим монтирования "beneath".
В данную версию принято 14674 исправлений от 2016 разработчиков, размер патча - 78 МБ (изменения затронули 17646 файлов, добавлено 1294205 строк кода, удалено 930515 строк). Около 32% всех представленных в 6.5 изменений связаны с драйверами устройств, примерно 26% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 8% связано с сетевым стеком, 2% - с файловыми системами и 2% c внутренними подсистемами ядра.
Основные изменения в ядре 6.5:
- Память и системные сервисы
- В интерфейс RAPL (Running Average Power Limit) добавлена поддержка механизма TPMI (Topology Aware Register and PM Capsule Interface), применяемого в процессорах Intel для активации возможностей, связанных с управлением питанием. RAPL TPMI дополняет ранее доступный интерфейс RAPL MSR/MMIO и отличается более гибкими возможностями настройки ограничения потребления питания.
- Добавлен системный вызов cachestat() для запроса состояния страничного кэша для файлов и каталогов. Данный системный вызов позволяет программам из пространства пользователя определить, какие из страниц файла прокэшированы в оперативной памяти. В отличие от ранее доступного системного вызова "mincore()", вызов "cachestat()" позволяет запрашивать более подробную статистику, например, сообщает такие сведения, как количество прокэшированных страниц, грязных (dirty) страниц, вытесненных страниц, недавно вытесненных страниц и страниц, отмеченных для отложенной записи (writeback).
- За счёт параллельной активации нескольких CPU значительно (до 10 раз) оптимизирована процедура перевода процессоров в состояние online.
- Из ветки Rust-for-Linux продолжен перенос дополнительной функциональности, связанной с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Осуществлён переход на использование выпуска Rust 1.68.2, в котором стабилизированы некоторые возможности, задействованные в ядре. Оптимизирован API pin-init. Расширены возможности модулей 'error', 'sync', 'str', 'task' и 'types'.
- Добавлена поддержка протокола Unaccepted Memory, дающего возможность принимать выделенную хост-системой память в гостевых системах, защищённых при помощи технологии AMD SEV-SNP (Secure Nested Paging) или Intel TDX (Trusted Domain Extensions).
- Для систем на базе архитектуры ARM64 реализована поддержка расширения PIE (ARMv8.9 Permission Indirection Extension), предоставляющего функциональность для настройки прав доступа к памяти. Вместо кодирования информации о полномочиях в таблице страниц памяти, PIE использует индекс массива полномочий, указанный в регистре.
- На системах с процессорами ARM, поддерживающими расширения Armv8.8, предоставлена возможность использования процессорных инструкций memcpy/memset в пространстве пользователя.
- В интерфейсе асинхронного ввода/вывода io_uring реализована возможность хранения кольцевых буферов и очередей отправляемых данных в памяти, выделенной в пространстве пользователя. Приложение теперь может самостоятельно выделить область памяти и передать её в io_uring, чтобы реализовать возможность использования больших страниц памяти (huge page) для размещения очередей и кольцевых буферов. Для больших очередей и кольцевых буферов изменение позволяет добиться повышения производительности за счёт сокращения нагрузки на буферы ассоциативной трансляции (TLB).
- В подсистему BPF добавлена поддержка прикрепления фильтров к kfunc (функции ядра, доступные для использования в программах BPF) для ограничения контекста, в котором допускается вызов kfunc. Например, данная возможность позволяет ограничить вызов функции bpf_sock_destroy() и разрешить её только в BPF-программах с типом BPF_TRACE_ITER.
- Реализована возможность прикрепления объектов BPF, используя файловые дескрипторы O_PATH вместо указания имени целевого каталога.
- Включена сборка ядра с опцией компилятора "-fstrict-flex-arrays=3", включающей третий уровень проверки гибкого элемента-массива в структурах (Flexible Array Members, массив неопределённого размера в конце структуры). На третьем уровне только размер "[]" (например, "int b[]") обрабатывается как гибкий массив, а размер "[0]" (например, "int b[0]") - нет.
- В коде ядра разрешено применение макроса __counted_by() для документирования полей в структурах, содержащих элементы, хранимые с использованием гибких массивов. Макрос может применяться для проверки выхода за границу массива.
- Добавлена, но пока не задействована в ядре, инфраструктура для применения в коде атрибута "cleanup" (Scope-based Resource Management), который может использоваться для дополнительной защиты от ошибок, приводящих к утечкам памяти и проблемам с освобождением блокировок.
- В рабочих очередях ядра (workqueue) реализовано автоматическое выявление и пометка работ, интенсивно расходующих ресурсы CPU (выполняемых более 10 мс). Метки могут использоваться для защиты от блокировки ресурсоёмкими работами других элементов в очереди. Также добавлена отладочная опция для отражения в логе подобных элементов.
- Для архитектуры Loongarch реализована поддержка одновременной многопоточности (SMT, Simultaneous Multi-Threading). Также обеспечена возможность сборки ядра для Loongarch компилятором Clang.
- Для архитектуры RISC-V добавлена поддержка ACPI и расширения "V" (Vector, векторные инструкции). Для управления расширением в prctl() предложен параметр "/proc/sys/abi/riscv_v_default_allow" и серия флагов "PR_RISCV_V_*".
- В механизм трассировки вызова функций добавлена возможность отслеживания значений оператора return, используемых при выходе из функций.
- Предоставлен интерфейс (/sys/kernel/tracing/osnoise/per_cpu/cpu%ld/timerlat_fd) для управления трассировкой задержек при выполнении real-time потоков (timer-latency) из пространства пользователя.
- Добавлен механизм "fprobe-events" для трассировки вхождения в функции и выхода из них, использующий подсистему fprobe вместо kprobe, что позволяет применять его на архитектурах, не поддерживаемых в kprobe.
- Объявлен устаревшим и будет удалён в одном из следующих выпусков механизм распределения памяти SLAB, вместо которого в ядре будет использоваться только SLUB. В качестве причины называются проблемы с сопровождением, наличие проблем в коде и дублирование функциональности с более совершенным аллокатором SLUB.
- В планировщике задач оптимизирована балансировка нагрузки между ядрами CPU за счёт исключения лишней миграции между областями SMT (Simultaneous Multi-Threading) на гибридных системах, в которых сочетаются SMT-ядра, работающие на высокой частоте, и не SMT-ядра, работающие на низкой частоте.
- В балансировщик EAS (Energy Aware Scheduling) добавлен режим 'runnable boosting', учитывающий параметры загруженности CPU, изменение частоты и пиковые нагрузки.
- На системах с Zen 2 и обновленными процессорами AMD для управления энергопотреблением вместо драйвера CPUFreq по умолчанию задействован драйвер P-State. Добавлен параметр X86_AMD_PSTATE_DEFAULT_MODE для выбора режима P-State по умолчанию: 1 (отключено), 2 (пассивный режим управления энергопотреблением), 3 (активный режим, EPP), 4 (управляемый режим).
- Дисковая подсистема, ввод/вывод и файловые системы
- Файловая система Overlayfs переведена на использование обновленного API для монтирования. Внесены изменения, необходимые для организации работы файловой системы Composefs в виде надстройки над ФС OverlayFS и EROFS, вместо сопровождения обособленной реализации. В ядре 6.5 для Composefs добавлена поддержка слоёв "data-only", используемых только для данных (отдельно от метаданных). В следующей версии ядра планируется добавить в OverlayFS поддержку сохранения хэшей fs-verity в расширенном атрибуте (xattr) overlay.metacopy, что завершит интеграцию в ядро всех возможностей, необходимых проекту Composefs.
- В файловой системе F2FS реализована поддержка опции монтирования "errors=", через которую можно настроить поведение в случае возникновения ошибок при чтении или записи данных на накопитель. В качестве значений могут быть указаны режимы remount-ro (перемонтировать в режиме только для чтения), continue (продолжить работу) и panic (аварийная остановка).
- Добавлена возможность монтирования другой ФС слоем ниже в существующую точку монтирования, что может применяться для организации бесшовного обновления совместно используемого раздела /usr в контейнерах, без оставления временного окна, в котором раздел находится в отмонтированном состоянии. Например, к точке монтирования /mnt (mount -t ext4 /dev/sda /mnt) можно примонтировать другой раздел (mount --beneath -t xfs /dev/sdb /mnt), который не будет использоваться пока старый раздел остаётся примонтирован. Если затем выполнить команду отмонтирования (umount /mnt), то старый раздел будет отмонтирован, а новый сразу займёт его место без задержки между отмонтированием старого и примонтированием нового раздела.
- В файловой системе Btrfs предложены дополнительные оптимизации. Реализована передача данных в синхронном режиме для быстрых алгоритмов вычисления контрольных сумм crc32c и xxhash). Удалён избыточный код для отслеживания буферов перемещений экстентов.
- В XFS снят признак экспериментальной разработки с кода подсчёта крупных экстентов. Задействован режим FMODE_CAN_ODIRECT.
- В Ext4 проведена чистка кода, связанного с деревом состояний экстентов, журналированием и выделением блоков. Оптимизирована производительность параллельной перезаписи в режиме DIO (Direct I/O).
- Виртуализация и безопасность
- Включена по умолчанию функциональность "secretmem", работа которой обеспечивается системным вызовом memfd_secret(). Memfd_secret позволяет создать приватную область памяти в изолированном пространстве адресов, видимую только процессу-владельцу, неотражаемую в другие процессы и напрямую недоступную ядру. Подсистема включена так как проведённые тесты опровергли мнение, что "secretmem" снижает производительность.
- В минимальной стандартной Си-библиотеке Nolibc реализована поддержка механизма выявления переполнений стека Stack Protector. Добавлена возможность использования разных определений errno на разных платформах. Добавлена функция syscall().
- В UML (User Mode Linux) добавлена поддержка механизма Landlock, позволяющего ограничить взаимодействие группы процессов с внешним окружением.
- Сетевая подсистема
- Реализован тип сообщений SCM_PIDFD, позволяющий использовать сокеты и вызовы sendmsg()/recvmsg() для передачи сведений о pidfd-идентификаторе процесса, по аналогии с тем как при помощи сообщения SCM_CREDENTIALS передаются данные о PID, UID и GID. Кроме того, в вызов getsockopt() добавлен флаг SO_PEERPIDFD для получения pidfd-идентификатора процесса на другой стороне сокета. Pidfd отличается от PID тем, что связывается с конкретным процессом и не меняется, в том время как PID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID.
- Переписана реализация системных вызовов sendpage и splice, в которых вместо передачи данных в сокет страница за страницей, в обработчиках sendmsg реализована передача ссылок на данные.
- При сборке ядра для работы в режиме реального времени (CONFIG_RT) включена поддержка активного полинга сокетов (busy polling).
- Для беспроводных устройств IEEE 802.15.4 реализована поддержка режима активного сканирования сети.
- В беспроводном стеке продолжена работа над реализацией режима MLO (Multi-Link Operation), представленного в спецификации Wi-Fi 7.
- Оборудование
- В драйвере AMDGPU включена по умолчанию технология адаптивной синхронизации FreeSync для видео, которая позволяет корректировать частоту обновления информации на экране, обеспечивая плавность и отсутствие разрывов изображения во время просмотра видео. Добавлена поддержка разгона (OverDrive) частоты видеокарт Radeon RX 7000. Внесены оптимизации, нацеленные на увеличение производительности и эффективности энергопотребления.
- В драйвере i915 реализована начальная поддержка чипов Intel Meteor Lake и добавлена возможность использования переменной частоты обновления экрана (VRR, Variable Rate Refresh) на ноутбуках с экранами на базе интерфейса eDP (Embedded Display Port). Для framebuffer реализована поддержка мапинга памяти (mmap). Переработан код, связанный с горячим подключением устройств и передачей данных на дисплей.
- В драйвере EDAC (Error Detection And Correction) реализована возможность выявления и корректирования ошибок в памяти на системах с процессорами AMD Zen 4 (EPYC 9004). Также добавлена поддержка EDAC для контроллеров памяти Nuvoton NPCM.
- Расширена поддержка контроллеров USB4, в том числе добавлена начальная поддержка контроллеров Intel Barlow Ridge, поддерживающих USB4 v2 (80 Gbps через USB Type-C).
- В звуковую подсистему ALSA добавлена поддержка устройств с интерфейсом MIDI 2.0.
- Добавлена поддержка звуковых кодеков Realtek RT722 SDCA и Google Chameleon, усилителей Qualcomm WSA8840/WSA8845/WSA8845H, Analog Devices SSM3515 и MAX98388, звуковых карт Loongson.
- Добавлен драйвер для мультимедийных пультов NVIDIA SHIELD (поддерживается модель Thunderstrike, выпускаемая с 2017 года).
- Добавлена поддержка ARM-чипов Nuvoton MA35D1, Amlogic C3 и STMicroelectronics STM32MP2 на базе ARM Cortex-A35, Samsung Exynos 4212, Qualcomm MSM8939 (Snapdragon 615), Qualcomm SC8180x (Snapdragon 8cx), Qualcomm SDX75 и Alibaba T-Head TH1520.
- Добавлена поддержка ARM-плат Marantec Maveo, Endian 4i Edge 200, Epson Moverio BT-200, PHYTEC STM32MP1-3, ICnova ADB4006, Emtop SoM & Baseboard, NXP i.MX8MM EVKB, Gateworks Venice gw7905-2x, NVIDIA IGX Orin, Fxtec Pro1X, NVIDIA Jetson Orin Nano (tegra234), Rockchip Indiedroid Nova (rk3588), Edgeble Neural Compute Module 6B (rk3588), FriendlyARM NanoPi R2C Plus (rk3328), Anbernic RG353PS (rk3566), Lunzn Fastrhino R66S/R68S (rk3568), PHYTEC phyBOARD-Lyra-AM625, Toradex Verdin, а также плат, используемых в устройствах Sony Xperia M4 Aqua и Acer Aspire 1.
- Добавлена поддержка Ethernet-коммутаторов и адаптеров: Synopsys EMAC4 IP, Marvell 88E6361, Marvell 88E6250, Microchip LAN8650/1 Rev.B0 PHYs и MediaTek MT7981/MT7988.
- Добавлена поддержка беспроводных чипов Realtek RTL8192FU, Realtek RTL8723DS и Realtek RTL8851BE.
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.5 - Linux-libre 6.5-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.5 переработан код чистки блобов в драйвере iwlwifi для беспроводных карт Intel. Проведена чистка имён блобов в dts-файлах для архитектуры Aarch64. Обновлён код чистки блобов в различных драйверах и подсистемах, например, в драйверах amdgpu, adreno, rtl8xxxu, коде поддержки сенсорных экранов и документации к atomisp. Удалены блобы в драйверах rtw8851b и tas2781[4].
Устранение уязвимости, позволяющей при монтировании специально оформленного раздела добиться переполнения стека
25 августа 2023 года стало известно о том, что в поставляемом в ядре Linux драйвере для файловой системы exFAT выявлена уязвимость (CVE-2023-4273), позволяющая при монтировании специально оформленного раздела (например, при подключении вредоносного USB Flash) добиться переполнения стека и выполнения своего кода с правами ядра. Проблема устранена в выпусках ядра Linux 6.4.10, 6.1.45, 5.15.25, 5.10.90, 5.4.253, 4.19.291, 4.14.324 и 6.5-rc5.
Отсутствие проверки размера при копировании имени файла в буфер, размещённый в стеке, приводит к переполнению стека ядра в случае задания очень длинного имени файла, превышающего ограничение ФС в 255 символов. Уязвимость присутствует в функции exfat_get_uniname_from_ext_entry, выполняющей реконструкцию длинных имён через цикличное чтение записей с частями имени файла из индекса каталога и слияния полученных частей имени в итоговое длинное имя. Проверка размера в коде exfat_get_uniname_from_ext_entry выполнялась в привязке к каждой записи с частью имени, но не охватывала итоговое имя (например, имя можно разбить на 100 частей и добиться записи в буфер 1500 символов вместо 258).
Выявивший уязвимость исследователь смог подготовить прототип эксплоита, который позволяет повысить свои привилегии в системе. При тестировании в виртуальной машине VirtualBox эксплоит срабатывает в 100% случаев, но при запуске в обычном окружении, работающим поверх оборудования, вероятность срабатывания снижается до примерно 50%. Уязвимость также может быть использована для компрометации ядер, загружаемых в режиме UEFI Secure Boot[5].
Устранение уязвимости StackRot в ядре
Команда разработчиков НТЦ ИТ Роса оперативно устранила недавно обнаруженную уязвимость StackRot в ядре Linux и выпустила обновление ядра с устранением проблемы. Пакет kernel-6.1-generic версии 6.1.38-1 появился в репозитории и стал доступен для установки путем штатного обновления системы. Об этом компания НТЦ ИТ Роса сообщила 14 июля 2023 года.
Выполненный в ядре Linux 6.1 перевод VMA (Virtual Memory Area) со структуры данных «red-black tree» на «maple tree» привел к появлению уязвимости с кодовым названием StackRot. Уязвимость представляла потенциальную угрозу для пользователей, у которых отсутствовали права администратора на рабочей станции. В случае запуска скачанных из интернета программ или скриптов такие файлы могли выполнять операции, которые в отсутствие уязвимости были бы доступны только администратору.
Разработчики российского репозитория ROSA 2021.1, который является пакетной базой для ОС РОСА «ХРОМ» и РОСА «ФРЕШ», провели срочное тестирование и подготовили обновление ядра Linux с целью устранения уязвимости. Тестирование обновлений было успешно завершено вечером 7 июля.
Репозиторий РОСА «ХРОМ» собирается не только для аппаратной архитектуры x86_64 (процессоры Intel и AMD), но также для архитектуры aarch64 (ARMv8), включая процессоры Baikal-M, Huawei Kunpeng и другие. Версия ядра 6.1 является общей для обеих архитектур и обеспечивает поддержку плат с российскими процессорами Baikal-M. Это означает, что обновление безопасности стало доступно для пользователей редкого оборудования с той же оперативностью, что и для пользователей x86_64.
Отдельно стоит отметить, что при использовании РОСА «ХРОМ» администратор может настроить и включить механизм IMA (Integrity Measurement Architecture), который запрещает запуск любых неизвестных исполняемых файлов и библиотек. Это обеспечивает защиту системы по принципу белого списка и предотвращает запуск угроз, включая методы социальной инженерии, когда пользователей убеждают скачивать и запускать вредоносные файлы.
Уязвимость StackRot в ядре Linux, позволявшая пользователю повысить свои привилегии
Выполненный в ядре Linux 6.1 перевод VMA (Virtual Memory Area) со структуры данных "red-black tree" на "maple tree" привёл к появлению уязвимости (CVE-2023-3269), позволяющей непривилегированному пользователю добиться выполнения своего кода с правами ядра. Уязвимость, которой присвоено кодовое имя StackRot, проявляется начиная с выпуска ядра 6.1 и устранена в обновлениях 6.4.1, 6.3.11 и 6.1.37. Об этом стало известно 5 июля 2023 года.
Структура "maple tree" представляет собой вариант B-tree, поддерживающий индексацию по диапазонам значений и спроектированный для эффективного использования кэша процессоров. По сравнению с "red-black tree" применение "maple tree" позволяет добиться более высокой производительности. Уязвимость вызвана ошибкой в обработчике расширения стека - в структуре "maple tree", используемой при управлении областями виртуальной памяти в ядре, замена узла в дереве могла произойти без выставления блокировки на запись, что создавало условия для обращения к области памяти после её освобождения (use-after-free).
Эксплуатацию уязвимости усложняло то, что узлы в структуре "maple tree" освобождаются в отложенном режиме с использованием callback-вызовов с блокировками RCU (Read-copy-update). Тем не менее, исследователям удалось преодолеть возникшие трудности и подготовить рабочий эксплоит, который планируют опубликовать в конце июля 2023 год, чтобы дать пользователям время обновить свои системы. Эксплуатация возможна почти во всех конфигурациях ядра и требует лишь минимальных привилегий[6].
Linux 6.4
26 июня 2023 года стало известно о том, что после двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.4. Среди наиболее заметных изменений: возможность создания kernel worker из пространства пользователя, продолжение интеграции поддержки языка Rust, поддержка механизма Intel LAM (Linear Address Masking), дедупликация страниц памяти на уровне процессов, поддерпривычных итераторов в BPF, поддержка перехода в спящий режим для систем RISC-V, возможность трассировки пользовательских процессов, обновленный механизм управления памятью модулей ядра, запрет отключения SELinux во время работы, поддержка шифрования RPC-пакетов NFS, удаление SLOB slab allocator.
Как сообщалось, в обновленной версии принято 16012 исправлений от 2080 разработчиков, размер патча - 81 МБ (изменения затронули 14220 файлов, добавлено 1006924 строк кода, удалено 597615 строк). Около 43% всех представленных в 6.4 изменений связаны с драйверами устройств, примерно 14% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 10% связано с сетевым стеком, 4% - с файловыми системами и 3% c внутренними подсистемами ядра. игр Основные изменения в ядре 6.4:
- Предоставлена возможность создания работающих на уровне ядра обработчиков (kernel worker) из процессов в пространстве пользователя. В отличие от использования API kthread, создаваемые из пространства пользователя обработчики наследуют свойства процессов и выполняются с учётными данными процесса пространства пользователя, что позволяет более жёстко изолировать их и применять к ним ограничения RLIMIT. Реализация оптимизирована для совместного использования с io_uring.
- Из ветки Rust-for-Linux продолжен перенос дополнительной функциональности, связанной с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Добавлен API pin-init для безопасной инициализации прикреплённых структур данных. Добавлены примитивы блокировок LockClassKey, Lock/Guard, Mutex и SpinLock. Реализованы типы: ARef (always-refcounted) для ссылок на объект, к которому применяется механизм подсчёта ссылок, Task для работы со структурой task_struct и LockedBy для защиты данных через внешние блокировки. Добавлена поддержка условных переменных (CondVar). Реализован crate-пакет UAPI для взаимодействия с пространством пользователя. Добавлены функции для манипуляции с ioctl().
- Добавлена поддержка предоставляемого в процессорах Intel режима LAM_U57 (Linear Address Masking), позволяющего использовать часть битов 64-разрядных указателей (c 57 по 62 биты) для хранения не связанных с адресацией метаданных. Для обычных программ не требуется столько памяти, что могут адресовать 64-разрядные указатели, поэтому верхние биты могут быть задействованы, например, для проверок, связанных с обеспечением безопасности.
- Реализован вариант механизма объединения идентичных страниц памяти, работающий на уровне процессов и позволяющий оптимизировать потребление памяти за счёт дедупликации страниц с одинаковым содержимым. В отличие от ранее предложенного механизма KSM (Kernel Samepage Merging) в данной реализации включение поддержки дедупликации осуществляется через prctl(PR_SET_MEMORY_MERGE) для процесса целиком и наследуется для дочерних процессов, без необходимости активации для каждого диапазона памяти при помощи вызова madvise(MADV_MERGEABLE), что оптимизирует применение.
- Непривилегированным процессам разрешено получение информации от подсистемы ядра PSI (Pressure Stall Information), позволяющей в пространстве пользователя проанализировать сведения о времени ожидания получения различных ресурсов (CPU, память, ввод/вывод) для точной оценки уровня загруженности системы и характера замедления работы. Для непривилегированных процессов опрос PSI допускается не чаще чем каждые две секунды.
- Добавлен механизм "User trace events", позволяющий создавать события трассировки из пользовательских процессов для отслеживания активности в пространстве пользователя.
- В BPF добавлена поддержка типовых итераторов, оптимизирующих создание циклов в BPF-программах, используя шаблон организации цикла, состоящий из шагов "начать итерацию", "перейти к следующему элементу" и "закончить итерацию".
- В BPF также реализовано заполнение в режиме ротации буфера с логом проблем, выявляемых верификатором BPF-кода, т.е. теперь если данные не вмещаются в буфер, в логе сохраняются последние записи, а не начальные. Добавлена возможность сохранения указателей kptr в привязанных к CPU hashmap, LRU hashmap и локальных map-типах (sk, cgrp, task, inode). Оптимизировано использование kptr-типов с буферами пакетов и XDP. В функции bpf_timer_start() разрешено указание абсолютных значений времени.
- Добавлена виртуальная файловая система /sys/kernel/tracing/touched_functions, позволяющая определить все функции ядра, доступные для трассировки и прикрепления BPF-программ.
- В механизм ptrace добавлены операции PTRACE_GET_SYSCALL_USER_DISPATCH и PTRACE_SET_SYSCALL_USER_DISPATCH, позволяющие одному процессу управлять настройками диспетчеризации системных вызовов в другом процессе, что будет использовано в инструментарии CRIU, предназначенном для сохранения и восстановления состояния процессов в пространстве пользователя.
- Добавлена поддержка механизма определения и коррекции ошибок EDAC (Error Detection And Correction) в серверах на базе процессоров Intel Sierra Forest.
- В интерфейсе асинхронного ввода/вывода io_uring появилась возможность одновременной прямой записи в файл в несколько потоков (поддерживается в ext4 и XFS). В io_uring также добавлена опция "multishot" для повторяющейся генерации таймаутов без необходимости промежуточной перенастройки таймера.
- В минимальной стандартной Си-библиотеке Nolibc реализована поддержка архитектуры LoongArch (в дополнение к поддержке ARM, AArch64, i386, x86_64, s390, RISC-V и MIPS).
- Добавлено руководство по быстрой сборке урезанного варианта ядра.
- Удалён SLOB (slab allocator), устаревший механизм распределения памяти slab, который был спроектирован для систем с небольшим объёмом памяти. Вместо SLOB следует использовать SLUB или SLAB.
- Для систем на базе архитектуры RISC-V реализована поддержка перехода в спящий режим (hibernation) и предоставлена возможность сборки ядра в виде файла, скомпонованного в режиме PIE (Position-independent executables). Добавлен системный вызов riscv_hwprobe() для предоставления информации о производителе и архитектуре доступного оборудования. Для RISC-V также добавлена поддержка расширения Svnapot, позволяющего связывать группы страниц памяти, размером 4K, для создания более крупных страниц памяти.
- Для архитектуры S390 реализована поддержка GCC-плагина STACKLEAK, обеспечивающего инициализацию всех хранимых в стеке переменных для предотвращения утечки информации из ядра через неинициализированные переменные, которые могут содержать остатки ранее сохранённых в стеке данных.
- В системный вызов userfaultfd(), позволяющий создавать обработчики обращений к невыделенным страницам памяти (page faults) в пространстве пользователя, добавлены флаги: UFFD_FEATURE_WP_UNPOPULATED для защиты от записи незаполненных анонимных областей памяти и UFFDIO_CONTINUE_MODE_WP для частичной защиты от записи элементов таблицы страниц памяти.
- Проведена работа по удалению макроса MODULE_LICENSE() из кода, который не может быть собран как модуль ядра.
- Предложен более гибкий механизм управления памятью загружаемых модулей ядра - module_memory, также примечательный изменениями, связанными с производительностью и безопасностью.
- В драйвер amd-pstate добавлена поддержка управляемого автономного режима (Guided Autonomous Mode), при котором частота процессора выбирается автоматически, но не может выходить за пределы указанного диапазона.
- В планировщике задач устранено регрессивное изменение, из-за которого в ядрах 6.2 и 6.3 снизилась производительность высоконагруженных систем с СУБД PostgreSQL.
- В файловой системе tmpfs реализована опция монтирования "noswap", запрещающая использование системного раздела подкачки для хранения данных.
- В XFS добавлены изменения, необходимые для реализации проверки ФС на лету (online scrub), включение которой ожидается в одном из следующих выпусков (при этом уже добавлена документация на online fsck).
- В файловой системе Ext4 оптимизирована организация записи журнала (data=journal). Внесены оптимизации, связанные с предварительным распределением inode, позволившие оптимизировать работу в системах, в которых выполняется большое число случайных операций записи. Операции чтения и записи страниц памяти переведены на использование фолиантов страниц памяти (page folios).
- В Btrfs переписан код для проверки ФС, который переведён на использование scrub_stripe, поддерживает проверку RAID56 и выполняется примерно на 10% быстрее. Повышена производительность журналирования каталогов (исключение перебора индексов при журналировании позволило в 4 раза сократить время, затрачиваемое на выполнение fsync).
- В драйвере NTFS3 удалена опция монтирования "noacsrules", которая была некорректно реализована.
- В сервер NFS добавлена поддержка RFC 9289, определяющего механизм TLS-шифрования RPC-вызовов.
- В системном вызове open() запрещено одновременное указание флагов O_DIRECTORY и O_CREAT, которое теперь будет приводить к выводу ошибки EINVAL.
- В файловой системе F2FS добавлена поддержка зонированных блочных устройств, в которых размер зон не кратен степени двойки.
- Изменено кодирование ioctl-команд для драйвера ublk, выносящего специфичную логику на сторону процесса в пространстве пользователя. Для обеспечения совместимости со старыми обработчиками добавлена сборочная настройка UBLK_LEGACY_OPCODES.
- В хранилище ключей (keyring) ".machine" реализован режим, допускающий размещения только ключей, заверенных цифровой подписью известного системе удостоверяющего центра. Хранилище ".machine" содержит ключи владельца системы (MOK, Machine Owner Keys), используемые в shim-загрузчике и применяемых для заверения цифровой подписью компонентов ядра, загружаемых на стадии после начальной загрузки, например, модулей ядра. Режим нацелен на предоставление возможности размещения в хранилище ".machine" ключей, используемых в подсистеме IMA (Integrity Measurement Architecture), предназначенной для проверки целостности компонентов операционной системы по цифровым подписям и хэшам.
- Запрещено отключение и выгрузка модуля SELinux во время работы. Отключение SELinux теперь может производиться только на начальной стадии загрузки через передачу параметра "selinux=0" в командной строке ядра. В большинстве дистрибутивов Linux уже применяется подобный запрет, поэтому изменение не отразится на рабочих процессах.
- В SELinux прекращена поддержка параметра "checkreqprot", позволявшего отключить проверку защиты памяти при обработке правил (параметр разрешал использование исполняемых областей памяти, независимо от предписаний, заданных в правилах).
- Добавлена поддержка гипервызовов Hyper-V, применяемых для проброса PCI-устройств в гостевые системы с драйверами для Hyper-V. Добавлена начальная поддержка виртуальных уровней доверия Hyper-V (VTL, Virtual Trust Level).
- В гипервизоре KVM реализован фреймворк для выноса обработки запросов SMCCC (Secure Monitor Call Calling Conventions) в пространство пользователя, что позволяет реализовывать многие операции, связанные с виртуализацией, в пространстве пользователя, без их добавления в ядро.
- В драйвере AMD IOMMU (amd_iommu) появилась поддержка 5-уровневых таблиц страниц памяти, что позволяет выделять до 4 ПБ физической памяти гостевым системам.
- Реализован универсальный программный интерфейс для управления светодиодными индикаторами на сетевых коммутаторах или сетевых платах. В структуру данных DeviceTree добавлены отдельные поля для привязки светодиодных индикаторов к устройствам.
- Добавлен API на основе протокола Netlink, предназначенный для организации вызова ядром вспомогательных функций, выполняемых в пространстве пользователя. API может использоваться для вызова обработчиков согласования соединения TLSv1.3 и установки сетевого сеанса, используя для этого функциональность из внешних библиотек.
- Для протокола SCTP реализована поддержка планировщиков для справедливого распределения пропускной способности между потоками (Fair Capacity Scheduler) и справедливого заполнения очереди с учётом весовых коэффициентов (Weighted Fair Queueing Scheduler).
- Добавлена возможность прикрепления BPF-программ для обработки хуков NetFilter, например, для создания обработчика, принимающего решение о перенаправлении пакетов (FORWARD) или выполнения действий на стадии до маршрутизации (PREROUTING).
- В драйвере i915 (Intel) продолжена реализация поддержки GPU Meteor Lake.
- В драйвер AMDGPU внесены изменения для управления энергопотреблением на системах на базе APU AMD Van Gogh.
- Добавлен драйвер QAIC для PCIe-карты Qualcomm Cloud AI 100 (AIC100) с ускорителем операций для систем машинного обучения.
- Удалены символьные драйверы для устаревших устройств с интерфейсом PCMCIA, такие как cm4000_cs, cm4040_cs и scr24x_cs.
- Прекращена поддержка SoC Intel Thunder Bay (выпуск данного SoC был отменён Intel).
- Добавлена поддержка игровых контроллеров Turtle Beach.
- Добавлена начальная поддержка звука на системах с CPU Intel Lunar Lake. Добавлен драйвер AMD SoundWire Manager для управления звуковым сопроцессорами AMD.
- Добавлена поддержка мониторинга состояния датчиков температуры через API hwmon для около 100 моделей плат ASUS.
- В драйвере MediaTek MT76 добавлена поддержка Wi-Fi 7.
- Добавлена начальная поддержка систем Apple на базе ARM-чипа M2.
- Добавлен драйвер msi-ec, позволяющий из пространства пользователя управлять расширенными функциями ноутбуков MSI, такими как выбор профиля энергопотребления, изменение скорости кулера, управление светодиодными индикаторами и задание уровней зарядки.
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.4 - Linux-libre 6.4-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.4 обновлён код чистки блобов в документации к микрокоду x86, x86-драйверах для планшетов Android, криптодрайверах QAT, а также в файлах devicetree для устройств qcom на базе архитектуры AArch64. Прекращена чистка драйвера vs6624, который был удалён из ядра. Оптимизирована очистка загрузчиков блобов в коде op-tee, rtl8710b и qcom Cloud AI. Проведена чистка реализации протокола bluetooth nxp[7].
Исправление редкой ошибки в ядре Linux
Разработчик Linux из Red Hat, Ричард Джонс, справился с трудной задачей: он нашёл и исправил редкую ошибку в ядре Linux 6.4, которая приводила к случайному зависанию системы при загрузке. Об этом стало известно 19 июня 2023 года.
При работе с программами для виртуальных машин, Джонс заметил, что система Linux иногда не загружалась до конца. Спустя несколько дней тщательного анализа, он обнаружил, что причиной была функция отображения времени в системных логах.
Чтобы убедиться в правильности своей гипотезы, Джонс применил технику, которую можно сравнить с поиском иголки в стоге сена. Он использовал инструмент под названием guestfish, чтобы автоматически загружать и останавливать Linux, отслеживая процесс. Этот эксперимент был повторен астрономическое количество раз - 292 612, и занял всего 21 час.
Особенностью этой ошибки было то, что она проявлялась чаще на компьютерах с процессорами AMD, нежели на Intel. Но благодаря упорству и терпению Джонса, эта проблема была успешно решена[8].
Сведения о 0-day уязвимости в IPv6-стеке Linux, позволяющей удалённо вызвать крах ядра
Раскрыты сведения о неисправленной (0-day) уязвимости (CVE-2023-2156) в ядре Linux, позволяющей остановить работу системы через отправку специально оформленных пакетов IPv6 (packet-of-death). Проблема проявляется только при включении поддержки протокола RPL (Routing Protocol for Low-Power and Lossy Networks), который в дистрибутивах по умолчанию отключён и применяется, главным образом, на встраиваемых устройствах, работающих в беспроводных сетях с большой потерей пакетов.
Уязвимость вызвана некорректной обработкой внешних данных в коде разбора протокола RPL, которая приводит к срабатыванию assert-сбоя и переходу ядра в состояние panic. При размещении в структуре k_buff (Socket Buffer) данных, полученных в результате разбора заголовка пакета IPv6 RPL, если поле CmprI выставлено в значение 15, поле Segleft в 1, а CmprE в 0, 48-байтный вектор с адресами распаковывается до 528 байт и возникает ситуация, когда выделенной для буфера памяти оказывается недостаточно. В этом случае в функции skb_push, применяемой для помещения данных в структуру, срабатывает проверка на несоразмерность размера данных и буфера, генерирующая состояние panic, чтобы предотвратить запись за границу буфера.
Пример эксплоита:
Примечательно, что разработчики ядра были уведомлены об уязвимости ещё в январе 2022 года и за прошедшие 15 месяцев три раза попытались устранить проблему, выпустив патчи в сентябре 2022 , октябре 2022 и апреле 2023 года, но каждый раз исправлений оказывалось недостаточно и уязвимость удавалось воспроизвести. В конечном счёте проект ZDI, координировавший работу по устранению уязвимости, принял решение раскрыть детальную информацию об уязвимости, не дожидаясь появления работающего исправления в ядре.
Таким образом уязвимость до сих пор остаётся неисправленной. В том числе не эффективен патч, вошедший в ядро 6.4-rc2. Пользователям рекомендуется проверить, что протокол RPL в их системах не используется, что можно сделать при помощи команды[9]
sysctl -a | grep -i rpl_seg_enabled
Linux 6.3
24 апреля 2023 года стало известно о том, что после двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.3. Среди наиболее заметных изменений: чистка устаревших ARM-платформ и графических драйверов, продолжение интеграции поддержки языка Rust, утилита hwnoise, поддержка древовидных структур red-black в BPF, режим BIG TCP для IPv4, встроенный тест производительности Dhrystone, возможность запрета исполнения в memfd, поддержка создания HID-драйверов, используя BPF, в Btrfs приняты изменения для уменьшения фрагментации групп блоков.
Как сообщалось, в обновленную версию принято 15637 исправлений от 2055 разработчиков; размер патча - 76 МБ (изменения затронули 14296 файлов, добавлено 1023183 строк кода, удалено 883103 строк). Для сравнения в прошлой версии было предложено 16843 исправлений от 2178 разработчиков; размер патча - 62 МБ. Около 39% всех представленных в ядре 6.3 изменений связаны с драйверами устройств, примерно 15% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 10% связано с сетевым стеком, 5% - с файловыми системами и 3% c внутренними подсистемами ядра.
Основные изменения в ядре 6.3:
Память и системные сервисы
- Проведена значительная чистка кода, связанного со старыми и не используемыми ARM-платами, что позволило сократить размер исходных текстов ядра на 150 тысяч строк. Удалено более 40 старых ARM-платформ.
- Реализована возможность создания драйверов для устройств ввода с интерфейсом HID (Human Interface Device), реализуемых в форме BPF-программ.
- Продолжен перенос из ветки Rust-for-Linux дополнительной функциональности, связанной с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра. Поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру. Предложенная в прошлых выпусках функциональность расширена поддержкой типов Arc (реализация указателей со счётчиком ссылок), ScopeGuard (выполняется чистку при выходе за область видимости) и ForeignOwnable (обеспечивает перемещение указателей между кодом на Си и Rust). Из пакета 'alloc' удалён модуль 'borrow' (тип 'Cow' и типаж 'ToOwned'). Отмечается, что состояние поддержки Rust в ядре уже близко к тому, чтобы начать принимать в ядро первые модули, написанные на Rust.
- В User-mode Linux (запуск ядра как пользовательского процесса) на системах x86-64 реализована поддержка кода, написанного на языке Rust. Добавлена поддержка сборки User-mode Linux при помощи clang с включением оптимизаций на этапе связывания (LTO).
- Добавлена утилита hwnoise для отслеживания задержек, вызванных особенностями работы аппаратного обеспечения. Определяются отклонения времени выполнения операций (jitter) при отключении обработки прерываний, превышающие одну микросекунду за 10 минут вычислений.
- Добавлен модуль ядра с реализацией теста производительности Dhrystone, который можно использовать для оценки производительности CPU в конфигурациях без компонентов пространства пользователя (например, на стадии портирования для SoC, на которых реализована лишь загрузка ядра).
- Добавлен параметр командной строки ядра "cgroup.memory=nobpf", отключающий учёт потребления памяти для BPF-программ, что может быть полезно для систем с изолированными контейнерами.
- Для BPF-программ предложена реализация структуры данных red-black tree, в которой используются kfunc + kptr (bpf_rbtree_add, bpf_rbtree_remove, bpf_rbtree_first) вместо добавления обновленного типа маппинга.
- В механизм перезапускаемых последовательностей (rseq, restartable sequences) добавлена возможность передачи процессам идентификаторов параллельного выполнения (memory-map concurrency ID), отождествляемых с номером CPU. Rseq предоставляет средства для быстрого атомарного выполнения операций, которые в случае прерывания другим потоком очищаются и предпринимается повторная попытка выполнения.
- На процессорах ARM обеспечена поддержка инструкций SME 2 (Scalable Matrix Extension).
- Для архитектур s390x и RISC-V RV64 реализована поддержка механизма "BPF trampoline", позволяющего минимизировать накладные расходы при передаче вызовов между ядром и программами BPF.
- На системах с процессорами на базе архитектуры RISC-V реализовано использование инструкций "ZBB" для оптимизации операций со строками.
- Для систем на базе архитектуры набора команд LoongArch (применяемой в процессорах Loongson 3 5000 и реализующей RISC ISA, похожий на MIPS и RISC-V) реализована поддержка рандомизации адресного пространства ядра (KASLR), изменения размещения ядра в памяти (relocation), аппаратных точек останова и механизма kprobe.
- В механизме DAMOS (Data Access Monitoring-based Operation Schemes), позволяющем высвобождать память с учётом частоты обращения к памяти, реализована поддержка фильтров для исключения из обработки в DAMOS определённых областей памяти.
- В минимальной стандартной Си-библиотеке Nolibc реализована поддержка архитектуры s390 и набора инструкций Arm Thumb1 (в дополнение к поддержке ARM, AArch64, i386, x86_64, RISC-V и MIPS).
- Проведена оптимизация objtool для оптимизации сборки ядра и снижения пикового потребления памяти при сборке (при сборке ядра в режиме "allyesconfig" теперь не возникает проблем с принудительным завершением процессов на системах с 32 ГБ ОЗУ).
- Прекращена поддержка сборки ядра компилятором Intel ICC, которая уже длительное время находилась в нерабочем виде, и никто не изъявил желание это исправить.
Дисковая подсистема, ввод/вывод и файловые системы
- В tmpfs реализована поддержка маппинга идентификаторов пользователей примонтированных файловых систем, применяемого для сопоставления файлов определённого пользователя на примонтированном чужом разделе с другим пользователем в текущей системе.
- В Btrfs для уменьшения фрагментации групп блоков обеспечено разделение экстентов по размеру при выделении блоков, т.е. любая группа блоков теперь ограничивается мелкими (до 128KB), средними (до 8 МБ) и крупными экстентами. Проведён рефакторинг реализации raid56. Переработан код для проверки контрольных сумм. Внесены оптимизации производительности, позволившие до 10 раз оптимизировать операцию send за счёт кэширования utime для каталогов и выполнения команд только при необходимости. Оптимизировано выполнение операций fiemap за счёт пропуска проверок обратных ссылок для совместно используемых данных (снапшотов). На 10% оптимизированы операции с метаданными за счёт оптимизации поиска ключей в структурах b-tree.
- Оптимизирована производительность ФС ext4 за счёт возможности одновременного выполнения несколькими процессами операций прямого ввода/вывода в заранее выделенные блоки, используя совместные блокировки inode вместо эксклюзивной блокировки.
- В f2fs проведена работа по оптимизации читаемости кода. Решены важные проблемы, связанные с атомарной записью и кэшем экстентов.
- В файловой системе EROFS (Enhanced Read-Only File System), предназначенной для использования в разделах, доступных в режиме только для чтения, реализована возможность привязки к CPU операций распаковки сжатого содержимого файлов для сокращения задержек при доступе к данным.
- В планировщик ввода/вывода BFQ добавлена поддержка продвинутых накопителей на вращающихся дисках, например, таких в которых используется несколько раздельно управляемых приводов головок (Multi Actuator).
- В реализацию клиента и сервера NFS добавлена поддержка шифрования данных с использованием алгоритма AES-SHA2.
- В подсистему FUSE (Filesystems In User Space) добавлена поддержка механизма расширения запросов, позволяющего помещать в запрос дополнительную информацию. На базе данной возможности реализовано добавление идентификаторов групп к запросу ФС, необходимых для учёта прав доступа при создании объектов в ФС (create, mkdir, symlink, mknod).
- В гипервизор KVM для систем x86 добавлена поддержка расширенных гипервызовов Hyper-V и обеспечен их проброс в обработчик, работающий в хост-окружении в пространстве пользователя. Изменение позволило реализовать поддержку вложенного запуска гипервизора Hyper-V.
- В KVM оптимизировано ограничение доступа гостевой системы к событиям PMU (Performance Monitor Unit), связанным с измерением производительности.
- В механизм memfd, позволяющий идентифицировать область памяти через передаваемый между процессами файловый дескриптор, добавлена возможность создания областей, в которых запрещено исполнение кода (non-executable memfd) и невозможно в будущем выставить права на исполнение.
- Добавлена prctl-операция PR_SET_MDWE, блокирующая попытки включения прав доступа к памяти, одновременно разрешающих запись и исполнение.
Добавлена и включена по умолчанию защита от атак класса Spectre, реализованная на основе предложенного в процессорах
- AMD Zen 4 автоматического режима IBRS (Enhanced Indirect Branch Restricted Speculation), позволяющего адаптивно разрешать и запрещать спекулятивное выполнение инструкций во время обработки прерываний, системных вызовов и переключений контекста. Предложенная защита приводит к меньшим накладным расходам по сравнению с защитой Retpoline.
- Устранена уязвимость, позволяющая обойти защиту от атак Spectre v2 при применении технологии одновременной многопоточности (SMT или Hyper-Threading) и вызванная отключением механизма STIBP (Single Thread Indirect Branch Predictors) при выборе режима защиты IBRS.
- Для систем на базе архитектуры ARM64 добавлена сборочная цель "virtconfig", при выборе которой активируется только минимальный набор компонентов ядра, необходимый для загрузки в системах виртуализации.
- Для архитектуры m68k добавлена поддержка фильтрации системных вызовов при помощи механизма seccomp.
- Добавлена поддержка встроенных в процессоры AMD Ryzen устройств CRB TPM2 (Command Response Buffer), основанных на технологии Microsoft Pluton.
Сетевая подсистема
- Добавлен netlink-интерфейс для настройки подуровня предотвращения коллизий PLCA (Physical Layer Collision Avoidance), определённого в спецификации IEEE 802.3cg-2019 и используемого в Ethernet-сетях 802.3cg (10Base-T1S), оптимизированных для подключения устройств интернета-вещей и промышленных систем. Применение PLCA позволяет оптимизировать производительность в Ethernet-сетях с разделяемой средой (shared media).
- Прекращена поддержка API "wireless extensions" для управления беспроводными интерфейсами Wi-Fi 7 (802.11be) так как данный API не охватывает все необходимые настройки. При попытке использования API "wireless extensions", который продолжает поддерживаться как эмулируемый слой, для большинства актуальных устройств теперь будет выводиться предупреждение.
- Подготовлена подробная документация по API netlink (для разработчиков ядра и для разработчиков приложений в пространстве пользователя). Реализована утилита ynl-gen-c для генерации Си-кода на основе YAML-спецификаций протокола Netlink.
- В сетевые сокеты добавлена поддержка опции IP_LOCAL_PORT_RANGE для упрощения настройки исходящих соединений через трансляторы адресов без применения SNAT. При использовании одного IP-адреса на нескольких хостах IP_LOCAL_PORT_RANGE даёт возможность использовать на каждом хосте свой диапазон исходящих сетевых портов, а на шлюзе перенаправлять пакеты на основе номеров портов.
- Для MPTCP (MultiPath TCP) реализована возможность обработки смешанных потоков, в которых используются протоколы IPv4 и IPv6. Предоставлен доступ к статистике об использовании сокета mptcp. MPTCP представляет собой расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам.
- Для IPv4 реализована возможность использования расширения BIG TCP, позволяющего увеличить максимальный размер TCP-пакета до 4ГБ для оптимизации работы внутренних сетей дата-центров. Подобное увеличение размера пакета при 16-битном размере поля в заголовке достигается через реализацию "jumbo"-пакетов, размер в IP-заголовке которых выставляется в 0, а фактический размер передаётся в отдельном 32-разрядном поле в отдельном прикреплённом заголовке.
- Добавлен sysctl-параметр default_rps_mask, через который можно задать применяемую по умолчанию конфигурацию RPS (Receive Packet Steering), отвечающую за распределение обработки входящего трафика по ядрам CPU на уровне обработчиков прерываний.
- Прекращена поддержка дисциплин обработки очередей для ограничения трафика CBQ (class-based queuing), ATM (ATM virtual circuits), dsmark (differentiated service marker), tcindex (traffic-control index) и RSVP (resource reservation protocol). Данные дисциплины длительное время находятся в заброшенном виде и не нашлось желающих продолжить их сопровождение.
- В стеке ieee802154 добавлена поддержка пассивного режима сканирования каналов беспроводных сетей.
- Для ICMP реализованы счётчики IcmpOutRateLimitGlobal, IcmpOutRateLimitHost и Icmp6OutRateLimitHost (nstat -sz "RateLimit") для отслеживания состояния ограничения интенсивности пакетов (rate limit).
- В netfilter для nftables реализован набор команд "NFT_MSG_DESTROY*" для безоговорочного удаления объектов (в отличие от команды delete не генерирует ENOENT при попытке удаления отсутствующего объекта).
Оборудование
- Удалены все графические драйверы на базе DRI1: i810 (старые интегрированные видеокарты Intel 8xx), mga (Matrox GPU), r128 (ATI Rage 128 GPU, включая карты Rage Fury, XPERT 99 и XPERT 128), savage (S3 Savage GPU), sis (Crusty SiS GPU), tdfx (3dfx Voodoo) и via (VIA IGP), которые были объявлены устаревшими в 2016 году и не поддерживаются в Mesa с 2012 года.
- Удалены устаревшие драйверы фреймбуфера (fbdev) omap1, s3c2410, tmiofb и w100fb.
- Добавлен DRM-драйвер для интегрированных в CPU Intel Meteor Lake (14 поколение) блоков VPU (Versatile Processing Unit), предназначенных для оптимизации операций, связанных с компьютерным зрением и машинным обучением. Драйвер реализован с использованием подсистемы "accel", нацеленной на обеспечение поддержки ускорителей вычислений, которые могут поставляться как в форме отдельных ASIC, так и виде IP-блоков внутри SoC и GPU.
- В драйвере i915 (Intel) расширена поддержка дискретных видеокарт Intel Arc (DG2/Alchemist), реализована предварительная поддержка GPU Meteor Lake, включена поддержка GPU Intel Xe HP 4tile.
- В драйвере amdgpu добавлена поддержка технологии AdaptiveSync и возможность использования с несколькими дисплеями режима защиты от перехвата выводимых на экран данных (Secure Display). Обновлена поддержка DCN 3.2 (Display Core Next), SR-IOV RAS, VCN RAS, SMU 13.x и DP 2.1.
- В драйвер msm (GPU Qualcomm Adreno) добавлена поддержка платформ SM8350, SM8450 SM8550, SDM845 и SC8280XP.
- В драйвере Nouveau прекращена поддержка старых вызовов ioctl.
- В драйвер etnaviv добавлена экспериментальная поддержка NPU VerSilicon (VeriSilicon Neural Network Processor).
- Реализован драйвер pata_parport для IDE-накопителей, подключаемых через параллельный порт. Добавленный драйвер позволил удалить из ядра старый драйвер PARIDE и модернизировать подсистему ATA. Ограничением драйвера является невозможность одновременного подключения принтера и диска через параллельный порт.
- Добавлен драйвер ath12k для беспроводных карт на чипах Qualcomm с поддержкой Wi-Fi 7. Добавлена поддержка беспроводных карт на чипах RealTek RTL8188EU.
- Добавлена поддержка плат RISC-V на базе SoC Allwinner D1 и D1s.
- Добавлена поддержка 46 плат с процессорами на базе архитектуры ARM64, среди которых Samsung Galaxy tab A (2015), Samsung Galaxy S5, BananaPi R3, Debix Model A, EmbedFire LubanCat 1/2, Facebook Greatlakes, Orange Pi R1 Plus, Tesla FSD, а также устройства на базе SoC Qualcomm MSM8953 (Snapdragon 610), SM8550 (Snapdragon 8 Gen 2), SDM450 и SDM632, Rockchips RK3128 TV box, RV1126 Vision, RK3588, RK3568, RK3566, RK3588 и RK3328, TI K3 (AM642/AM654/AM68/AM69).
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.3 - Linux-libre 6.3-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.3 проведена чистка блобов в драйверах ath12k, aw88395 и peb2466, а также в обновленных файлах devicetree для устройств qcom на базе архитектуры AArch64. Обновлён код чистки блобов в драйверах и подсистемах amdgpu, xhci-rcar, qcom-q6v5-pas, sp8870, av7110, а также в драйверах для DVB-карт с программным декодированием и в предкомпилированных BPF-файлах. Прекращена чистка драйверах mga, r128, tm6000, cpia2 и r8188eu, так как они были удалены из ядра. Оптимизирована очистка от блобов драйвера i915[10].
Выявление уязвимостей в QoS-подсистеме ядра Linux, позволяющих поднять свои привилегии в системе
В ядре Linux выявлены две уязвимости (CVE-2023-1281, CVE-2023-1829), позволяющие локальному пользователю поднять свои привилегии в системе. Об этом стало известно 12 апреля 2023 года. Для проведения атаки требуются полномочия на создание и изменение классификаторов трафика, доступные при наличии прав CAP_NET_ADMIN, которые можно получить при возможности создания пространств имён идентификаторов пользователя (user namespace). Проблемы проявляются начиная с ядра 4.14 и устранены в ветке 6.2.
Уязвимости вызваны обращением к памяти после её освобождения (use-after-free) в коде классификаторе трафика tcindex, входящего в состав подсистемы QoS (Quality of service) ядра Linux. Первая уязвимость проявляется из-за состояния гонки при обновлении неоптимальных hash-фильтров, а вторая уязвимость при удалении оптимального hash-фильтра. Проследить за исправлением в дистрибутивах можно на следующих страницах: Debian, Ubuntu, Gentoo, RHEL, SUSE, Fedora, Arch. Для блокирования эксплуатации уязвимости обходным путём можно отключить возможность создания пространств имён непривилегированными пользователями ("sudo sysctl -w kernel.unprivileged_userns_clone=0")[11].
Запрет «Байкал Электроникс» вносить изменения в ядро
В середине марта 2023 года стало известно о том, что сообщество разработчиков Linux отказалось принимать патчи и исправления в код ядра этой операционной системы от российской компании «Байкал Электроникс». Подробнее здесь.
Linux 6.2
20 февраля 2023 года стало известно о том, что после двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.2. Среди наиболее заметных изменений: разрешён приём кода под лицензией Copyleft-Next, оптимизирована реализация RAID5/6 в Btrfs, продолжена интеграция поддержки языка Rust, снижены накладные расходы при защите от атак Retbleed, добавлена возможность регулирования потребления памяти при отложенной записи, для TCP добавлен механизм балансировки PLB (Protective Load Balancing), добавлен гибридный механизм защиты потока выполнения команд (FineIBT), в BPF появилась возможность определения собственных объектов и структур данных, в состав включена утилита rv (Runtime Verification), снижено энергопотребление в реализации блокировок RCU.
Как сообщалось, в данную версию принято 16843 исправлений от 2178 разработчиков; размер патча - 62 МБ (изменения затронули 14108 файлов, добавлено 730195 строк кода, удалено 409485 строк). Около 42% всех представленных в 6.2 изменений связаны с драйверами устройств; примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур; 12% связано с сетевым стеком; 4% - с файловыми системами и 3% c внутренними подсистемами ядра.
Основные изменения в ядре 6.2:
Память и системные сервисы
- Разрешено включение в состав ядра кода и изменений, поставляемых под лицензией Copyleft-Next 0.3.1. Лицензия Copyleft-Next создана одним из авторов GPLv3 и является полностью совместимой с лицензией GPLv2, что подтверждено юристами компаний SUSE и Red Hat. По сравнению с GPLv2 лицензия Copyleft-Next значительно компактнее и проще для понимания (убрана вводная часть и упоминание устаревших компромиссов), определяет сроки и порядок устранения нарушений, автоматически снимает копилефт-требования для устаревшего кода, которому более 15 лет.
- Copyleft-Next также содержит пункт о предоставлении прав на запатентованные технологии, что (в отличие от GPLv2) делает данную лицензию совместимой с лицензией Apache 2.0. Для обеспечения полной совместимости с GPLv2 в тексте Copyleft-Next явно указано, что производная работа может поставляться не только под исходной лицензией Copyleft-Next, но и под лицензией GPL.
- В состав включена утилита "rv", предоставляющая интерфейс для взаимодействия из пространства пользователя с обработчиками подсистемы RV (Runtime Verification), предназначенной для проверки корректности работы на высоконадёжных системах, обеспечивающих отсутствие сбоев. Проверка производится во время выполнения через прикрепление обработчиков к точкам трассировки, сверяющих фактический ход выполнения с заранее определённой эталонной детерминированной моделью автомата, определяющей ожидаемое поведение системы.
- В устройстве zRAM, позволяющем хранить раздел подкачки в памяти в сжатом виде (в памяти создаётся блочное устройство на которое производится своппинг со сжатием), реализована возможность переупаковки страниц с использованием альтернативного алгоритма для достижения более высокого уровня сжатия. Основная идея в предоставлении выбора между несколькими алгоритмами (lzo, lzo-rle, lz4, lz4hc, zstd), предлагающими свои компромиссы между скоростью сжатия/распаковки и уровнем сжатия или оптимальными в особых ситуациях (например, для сжатия больших страниц памяти).
- Добавлен API "iommufd" для управления из пространства пользователя системой управления памятью ввода-вывода - IOMMU (I/O Memory-Management Unit). API даёт возможность управлять таблицами страниц памяти ввода/вывода, используя файловые дескрипторы.
- В BPF предоставлена возможность создания типов, определения собственных объектов, построения своей иерархии объектов и гибкого формирования собственных структур данных, таких как связанные списки. Для переходящих в режим сна BPF-программ (BPF_F_SLEEPABLE) добавлена поддержка блокировок bpf_rcu_read_{,un}lock(). Реализована поддержка сохранения объектов task_struct. Добавлен map-тип BPF_MAP_TYPE_CGRP_STORAGE, предоставляющий локальное хранилище для cgroups.
- Для механизма блокировок RCU (Read-copy-update) реализован опциональный механизм "ленивых" callback-вызовов, в котором по таймеру в пакетном режиме разом обрабатывается несколько callback-вызовов. Применение предложенной оптимизации позволяет на 5-10% снизить энегропотребление на устройствах Android и ChromeOS за счёт откладывания RCU-запросов во время простоя или низкой нагрузки на систему.
- Добавлен sysctl split_lock_mitigate для управления реакцией системы при выявлении расщеплённых блокировок ("split lock"), возникающих при доступе к не выровненным данным в памяти из-за того, что при выполнении атомарной инструкции данные пересекают две линии кэша CPU. Подобные блокировки приводят к значительному падению производительности. При выставлении в split_lock_mitigate значения 0 выводится лишь предупреждение о наличии проблемы, а при выставлении значения 1 помимо вывода предупреждения также осуществляется замедление выполнения процесса, вызвавшего блокировку, чтобы сохранить производительность остальной системы.
- Для архитектуры PowerPC предложена обновленная реализация блокировок qspinlock, демонстрирующая более высокую производительность и решающая некоторые проблемы с блокировками, возникающие в исключительных случаях.
- Переработан код обработки прерываний MSI (Message-Signaled Interrupts), в котором устранены накопившиеся архитектурные проблемы и добавлена поддержка привязки отдельных обработчиков к разным устройствам.
- Для систем на базе архитектуры набора команд LoongArch (применяемой в процессорах Loongson 3 5000 и реализующей RISC ISA, похожий на MIPS и RISC-V) реализована поддержка ftrace, защиты стека, спящего и ждущего режимов.
- Предоставлена возможность присвоения имён областям разделяемой анонимной памяти (ранее имена могли назначаться только приватной анонимной памяти, закреплённой за конкретным процессом).
- Добавлен параметр командной строки ядра "trace_trigger", предназначенный для активации триггера трассировки, применяемого для привязки условных команд, вызываемых при срабатывании контрольной проверки (например: trace_trigger="sched_switch.stacktrace if prev_state == 2").
- Оптимизированы требования к версии пакета binutils. Для сборки ядра теперь требуется как минимум binutils 2.25.
- При вызове exec() добавлена возможность помещения процесса в пространство имён времени (time namespace), в котором время отличается от системного.
- Начался перенос из ветки Rust-for-Linux дополнительной функциональности, связанной с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра. Поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру. Предложенная в прошлом выпуске базовая функциональность расширена возможностями для поддержи низкоуровневого кода, такого как тип Vec и макросы pr_debug!(), pr_cont!() и pr_alert!(), а также процедурный макрос "#vtable", оптимизирующий работу с таблицами указателей на функции. Добавление высокоуровневых Rust-обвязок над подсистемами ядра, которые позволят создавать полноценные драйверы на Rust, ожидается в следующих выпусках.
- Используемый в ядре тип "char" теперь для всех архитектур по умолчанию объявлен как беззнаковый.
- Объявлен устаревшим механизм распределения памяти slab - SLOB (slab allocator), который был спроектирован для систем с небольшим объёмом памяти. Вместо SLOB в обычных условиях рекомендуется использовать SLUB или SLAB. Для систем с небольшим объёмом памяти рекомендуется применять SLUB в режиме SLUB_TINY.
- Стабилизирован драйвер IFS (In-Field Scan), позволяющий запускать на процессорах Intel низкоуровневые диагностические тесты CPU, способные выявлять проблемы, не определяемые штатными средствами на основе кодов коррекции ошибок (ECC) или битов чётности. Выполняемые тесты оформляются в форме загружаемой прошивки, оформленной по аналогии с обновлениями микрокода. Результаты тестирования доступны через sysfs.
Дисковая подсистема, ввод/вывод и файловые системы
- В Btrfs внесены изменения, нацеленные на исправление проблемы "write hole" в реализации RAID 5/6 (попытка восстановления RAID, если крах случился во время записи и невозможно понять, какой блок на каком из устройств RAID записался корректно, что может привести к разрушению блоков, соответствующих недозаписанным блокам). Кроме того, для SSD теперь по возможности автоматически активируется по умолчанию асинхронное выполнение операции "discard", позволяющее добиться более высокой производительности из-за эффективной группировки операций "discard" в очереди и обработки очереди фоновым обработчиком. Повышена производительность операций send и lseek, а также ioctl FIEMAP.
- Расширены возможности по управлению отложенной записью (writeback: фоновое сохранение изменённых данных) для блочных устройств. В некоторых ситуациях (например: при использовании сетевых блочных устройств или USB-накопителей) отложенная запись может приводить к большому потреблению оперативной памяти. Для того чтобы управлять поведением отложенной записи и держать размер страничного кэша в определённых рамках в sysfs (/sys/class/bdi/) предложены параметры "strict_limit", "min_bytes", "max_bytes", "min_ratio_fine" и "max_ratio_fine".
- В файловой системе F2FS реализована ioctl-операция атомарной замены, позволяющая выполнить запись данных в файл в рамках одной атомарной операции. В F2FS также добавлен блочный кэш экстентов, помогающий определить активно используемые данные или данные, к которым давно не было обращений.
- В ФС ext4 отмечается только исправление ошибок.
- В файловой системе ntfs3 предложено несколько дополнительных опций монтирования: "nocase" для управления учётом регистра символов в именах файлов и директорий; windows_name для запрета создания имён файлов, содержащих символы, недопустимые для ОС Windows; hide_dot_files для управления назначением метки скрытых файлов для файлов, начинающихся на точку.
- В драйвере exFAT оптимизированы операции создания файлов и каталогов.
- В файловой системе Squashfs реализована опция монтирования "threads=", при помощи которой можно определить число потоков для распараллеливания операций распаковки. В Squashfs также появилась возможность маппинга идентификаторов пользователей примонтированных файловых систем, применяемого для сопоставления файлов определённого пользователя на примонтированном чужом разделе с другим пользователем в текущей системе.
- Переработана реализация списков контроля доступа POSIX (POSIX ACL). В данной реализации устранены архитектурные проблемы, упрощено сопровождение кодовой базы и задействованы более безопасные типы данных.
- В подсистему fscrypt (которая используется для прозрачного шифрования файлов и каталогов) добавлена поддержка алгоритма шифрования SM4 (китайский стандарт GB/T 32907-2016).
- Предоставлена возможность сборки ядра без поддержки NFSv2 (в будущем поддержку NFSv2 планируют полностью прекратить).
- Изменена организация проверки прав доступа к устройствам NVMe. Предоставлена возможность чтения и записи на устройство NVMe, если записывающий процесс имеет доступ к специальному файлу устройства (ранее процесс должен был иметь полномочие CAP_SYS_ADMIN).
- Удалён пакетный драйвер для CD/DVD, который был объявлен устаревшим в 2016 году.
Виртуализация и безопасность
- Реализован обновленный метод защиты от уязвимости Retbleed в CPU Intel и AMD, использующий отслеживание глубины вызовов, что не настолько замедляет работу, как ранее присутствующая защита от Retbleed. Для включения дополнительного режима предложен параметр командной строки ядра "retbleed=stuff".
- Добавлен гибридный механизм защиты потока выполнения команд FineIBT, сочетающий применение аппаратных инструкций Intel IBT (Indirect Branch Tracking) и программной защиты kCFI (kernel Control Flow Integrity) для блокирования нарушения нормального порядка выполнения (control flow) в результате применения эксплоитов, изменяющих хранимые в памяти указатели на функции. FineIBT разрешает выполнение по косвенному переходу только в случае перехода на инструкцию ENDBR, которая размещается в самом начале функции. Дополнительно (по аналогии с механизмом kCFI) следом осуществляется проверка хэшей, обеспечивающих неизменность указателей.
- Добавлены ограничения для блокирования атак, манипулирующих генерацией состояний "oops", после которых проблемные задачи завершаются и состояние восстанавливается без остановки работы системы. При очень большом числе вызовов состояния "oops" возникает переполнение счётчика ссылок (refcount), что позволяет эксплуатировать уязвимости, вызванные разыменованием NULL-указателей. Для защиты от подобных атак в ядро добавлен лимит на максимальное число срабатываний "oops", после превышения которого ядро будет инициировать переход в состояние "panic" с последующей перезагрузкой, что не позволит добиться числа итераций, необходимого для переполнения refcount. По умолчанию лимит выставлен в 10 тысяч "oops", но при желании его можно изменить через параметр oops_limit.
- Добавлен параметр конфигурации LEGACY_TIOCSTI и sysctl legacy_tiocsti для отключения возможности помещения данных в терминал при помощи ioctl TIOCSTI, так как данная функциональность может применяться для подстановки произвольных символов в буфер ввода терминала и симуляции пользовательского ввода.
- Предложен дополнительный тип внутренних структур encoded_page, в котором нижние биты указателя используются для сохранения дополнительной информации, применяемой для защиты от случайного разыменования указателя (при реальной необходимости разыменования вначале нужно очистить эти дополнительные биты).
- На платформе ARM64 на этапе загрузки предоставлена возможность включения и выключения программной реализации механизма Shadow Stack, применяемого для защиты от перезаписи адреса возврата из функции в случае переполнения буфера в стеке (суть защиты в сохранении после передачи управления функции адреса возврата в отдельном "теневом" стеке и извлечении данного адреса перед выходом из функции). Поддержка в одной сборке ядра аппаратной и программной реализации Shadow Stack позволяет использовать одно ядро на разных ARM-системах, не зависимо от поддержки в них инструкций для аутентификации указателей. Включение программной реализации осуществляется через подмену во время загрузки необходимые инструкций в коде.
- Добавлена поддержка использования на процессорах Intel механизма асинхронного уведомления о выходе (asynchronous exit notification), позволяющего выявлять single-step атаки на код, выполняемый в анклавах SGX.
- Предложен набор операций, позволяющих гипервизору поддерживать запросы из гостевых систем Intel TDX (Trusted Domain Extensions).
- Удалены сборочные настройки ядра RANDOM_TRUST_BOOTLOADER и RANDOM_TRUST_CPU, вместо которых следует использовать соответствующие опции командной строки random.trust_bootloader и random.trust_cpu.
- В механизм Landlock (позволяющий ограничить взаимодействие группы процессов с внешним окружением) добавлена поддержка флага LANDLOCK_ACCESS_FS_TRUNCATE, дающего возможность контролировать выполнение операций усечения файлов.
Сетевая подсистема
- Для IPv6 добавлена поддержка PLB (Protective Load Balancing), механизма балансировки нагрузки между сетевыми линками, нацеленного на сокращение точек перегрузки на коммутаторах дата-центров. Через изменение IPv6 Flow Label, PLB случайным образом меняет пути пакетов для выравнивания нагрузки на портах коммутатора. Для снижения переупорядочивания пакетов данная операция по возможности производится после периодов простоя (idle). Применение PLB в дата-центрах Google позволило снизить дисбаланс нагрузки на порты коммутаторов в среднем на 60%, уменьшить потерю пакетов 33% и снизить задержки на 20%.
- Добавлен драйвер для устройств MediaTek с поддержкой Wi-Fi 7 (802.11be).
- Добавлена поддержка 800-гигабитных линков.
- Добавлена возможность переименования сетевых интерфейсов на лету, без остановки работы.
- В записываемые в лог сообщения о SYN-флуде добавлено упоминание об IP-адресе, на который пришёл пакет.
- Для UDP реализована возможность использования отдельных хэш-таблиц для разных сетевых пространств имён.
- Для сетевых мостов реализована поддержка метода аутентификации MAB (MAC Authentication Bypass).
- Для протокола CAN (CAN_RAW) реализована поддержка режима сокетов SO_MARK для прикрепления фильтров трафика на базе fwmark.
- В ipset реализован параметр bitmask, позволяющий задать маску на основе произвольных битов в IP-адресе (например, "ipset create set1 hash:ip bitmask 255.128.255.0").
- В nf_tables добавлена поддержка обработки внутренних (inner) заголовков, идущих внутри туннелируемых пакетов.
- В драйвере TUN заявленная скорость линка повышена c 10Mbps до 10Gbps, что решило проблемы с ограничением скорости в некоторых приложениях (например, Open vSwitch на основе заявленной скорости виртуального интерфейса настраивает ограничение максимальной пропускной способности).
Оборудование
- Добавлена подсистема "accel" с реализацией фреймворка для ускорителей вычислений, которые могут поставляться как в форме отдельных ASIC, так и виде IP-блоков внутри SoC и GPU. Главным образом подобные ускорители ориентированы на ускорение решения задач машинного обучения.
- В драйвере amdgpu включена поддержка IP-компонентов GC, PSP, SMU и NBIO. Для систем ARM64 реализована поддержка DCN (Display Core Next). Реализация защищённого вывода на экран переведена с использования DCN10 на DCN21 и может теперь использоваться при подключении нескольких экранов.
- В драйвере i915 (Intel) стабилизирована поддержка дискретных видеокарт Intel Arc (DG2/Alchemist) и оптимизирована поддержка GPU Meteor Lake.
- В драйвере Nouveau реализована поддержка GPU NVIDIA GA102 (RTX 30) на базе архитектуры Ampere. Для карт nva3 (GT215) добавлена возможность управления фоновой подсветкой.
- Добавлена поддержка беспроводных адаптеров на базе чипов Realtek 8852BE, Realtek 8821CU, 8822BU, 8822CU, 8723DU (USB) и MediaTek MT7996, Bluetooth интерфейсов Broadcom BCM4377/4378/4387, а также Ethernet-контроллеров Motorcomm yt8521, NVIDIA Tegra GE.
- Добавлена поддержка ASoC (ALSA System on Chip) для встроенных звуковых чипов HP Stream 8, Advantech MICA-071, Dell SKU 0C11, Intel ALC5682I-VD, Xiaomi Redmi Book Pro 14 2022, i.MX93, Armada 38x, RK3588. Добавлена поддержка звукового интерфейса Focusrite Saffire Pro 40. Добавлена поддержка звукового кодека Realtek RT1318.
- Добавлена поддержка смартфонов и планшетов Sony Xperia 10 IV, 5 IV, X и X compact, OnePlus One, 3, 3T и Nord N100, Xiaomi Poco F1 и Mi6, Huawei Watch, Google Pixel 3a, Samsung Galaxy Tab 4 10.1.
- Добавлена поддержка ARM SoC и плат Apple T6000 (M1 Pro), T6001 (M1 Max), T6002 (M1 Ultra), Qualcomm MSM8996 Pro (Snapdragon 821), SM6115 (Snapdragon 662), SM4250 (Snapdragon 460), SM6375 (Snapdragon 695), SDM670 (Snapdragon 670), MSM8976 (Snapdragon 652), MSM8956 (Snapdragon 650), RK3326 Odroid-Go/rg351, Zyxel NSA310S, InnoComm i.MX8MM, Odroid Go Ultra.
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.2 - Linux-libre 6.2-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В обновленном выпуске проведена чистка блобов в драйвере nouveau. Отключена загрузка блобов в драйверах mt7622, mt7996 wifi и bcm4377 bluetooth. Проведена чистка имён блобов в dts-файлах для архитектуры Aarch64. Обновлён код чистки блобов в различных драйверах и подсистемах. Прекращена чистка драйвера s5k4ecgx, так как он был удалён из ядра[12].
2022
Выявление троянской программы для Linux, которая взламывает сайты на базе CMS WordPress
Компания «Доктор Веб» выявила троянскую программу для ОС Linux, которая взламывает сайты на базе CMS WordPress через эксплуатацию 30 уязвимостей в ряде плагинов и тем оформления для этой платформы. Подробнее здесь.
Релиз ядра Linux 6.1
12 декабря 2022 года стало известно о том, что после двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.1. Среди наиболее заметных изменений: поддержка разработки драйверов и модулей на языке Rust, модернизация механизма определения используемых страниц памяти, специальный менеджер памяти для BPF-программ, система диагностики проблем с памятью KMSAN, механизм защиты KCFI (Kernel Control-Flow Integrity), внедрение структуры Maple tree.
Как сообщалось, в обновленную версию принято 15115 исправлений от 2139 разработчиков, размер патча - 51 МБ, что примерно в 2 раза меньше размера патчей от ядер 6.0 и 5.19. Изменения затронули 13165 файлов, добавлено 716247 строк кода, удалено 304560 строк. Около 45% всех представленных в 6.1 изменений связаны с драйверами устройств, примерно 14% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 14% связано с сетевым стеком, 3% - с файловыми системами и 3% c внутренними подсистемами ядра.
Основные изменения в ядре 6.1:
- Добавлена возможность использования языка Rust в качестве второго языка для разработки драйверов и модулей ядра. Основным мотивом поддержки Rust является оптимизация написания безопасных и качественных драйверов устройств за счёт снижения вероятности совершения ошибок при работе с памятью. Поддержка Rust неактивна по умолчанию и не приводит к включению Rust в число обязательных сборочных зависимостей к ядру. В ядро пока принят минимальный урезанный вариант патчей, который сокращён с 40 до 13 тысяч строк кода и обеспечивает только необходимый минимум, достаточный для сборки простого модуля ядра, написанного на языке Rust. В дальнейшем планируется постепенно наращивать имеющуюся функциональность, перенося и другие изменения из ветки Rust-for-Linux. Параллельно развиваются проекты по использованию предложенной инфраструктуры для разработки на языке Rust драйверов накопителей NVMe, сетевого протокола 9p и GPU Apple M1.
- Для систем на базе архитектур AArch64, RISC-V и LoongArch с EFI реализована возможность прямой загрузки сжатых образов ядра. Добавлены обработчики для загрузки, запуска и выгрузки образов ядра, вызываемые напрямую из EFI zboot. Также добавлены обработчики установки и удаления протоколов из БД протоколов EFI. Ранее распаковка осуществлялась отдельным загрузчиком, а теперь это может делать обработчик в самом ядре - образ ядра формируется в виде EFI-приложения.
- В состав принята часть патчей с реализацией многоуровневневой модели управления памятью, позволяющей разделять банки памяти с разными характеристиками производительности. Например, наиболее интенсивно используемые страницы могут размещаться в наиболее быстрой памяти, а редко используемые страницы могут хранится в относительно медленной памяти. В ядро 6.1 принят механизм для определения нахождения интенсивно используемых страниц в медленной памяти для их продвижения в быструю память, а также реализована общая концепция уровней памяти и их относительной производительности.
- В состав включён механизм MGLRU (Multi-Generational LRU), который заменил собой старую реализацию LRU (Least Recently Used) на основе двух очередей на многоступенчатую структуру, лучше определяющую какие страницы памяти по настоящему используются, а какие можно вытеснить в раздел подкачки.
- Добавлена поддержка предложенной инженерами Oracle структуры данных "maple tree", которая позиционируется как более эффективная замена структуре "red-black tree". Maple tree представляет собой вариант B-tree, поддерживающий индексацию по диапазонам значений и спроектированный для эффективного использования кэша современных процессоров. На maple tree уже переведены некоторые подсистемы управления памятью, что положительно отразилось на их производительности. В будущем maple tree может использоваться для реализации блокировок по диапазонам (range locking).
- В подсистему BPF добавлена возможность создания "деструктивных" BPF-программ, специально рассчитанных на инициирование аварийного завершения работы через вызов crash_kexec(). Подобные BPF-программы могут потребоваться в отладочных целях для инициирования создания crash-дампа в определённый момент времени. Для доступа к деструктивным операциям при загрузке BPF-программы требуется указание флага BPF_F_DESTRUCTIVE, активация sysctl kernel.destructive_bpf_enabled и наличие прав CAP_SYS_BOOT.
- Для BPF-программ предоставлена возможность перебора элементов cgroup, а также перебора ресурсов (файлы, vma, процессы и т.п.) определённого потока или задачи. Реализован обновленный map-тип для создания пользовательских кольцевых буферов (user ring buffer).
- Добавлен специальный вызов для выделения памяти в BPF-программах (memory allocator), который обеспечивает более безопасное распределение памяти в контексте BPF, чем штатный kmalloc().
- Интегрирована первая часть изменений, обеспечивающих возможность создания драйверов для устройств ввода с интерфейсом HID (Human Interface Device), реализуемых в форме BPF-программ.
- Из ядра полностью удалён код для поддержки формата исполняемых файлов a.out, который был переведён в разряд устаревших в выпуске 5.1, а начиная с версий 5.18 и 5.19 был отключён для основных архитектур. Формат a.out давно не применяется на системах с Linux, а генерация файлов a.out не поддерживается современными инструментальными средствами в конфигурациях для Linux по умолчанию. Загрузчик для a.out файлов может быть реализован целиком в пространстве пользователя.
- Для систем на базе архитектуры набора команд LoongArch, применяемой в процессорах Loongson 3 5000 и реализующей RISC ISA, похожий на MIPS и RISC-V, реализована поддержка событий измерения производительности (perf event), kexec, kdump, SysRq-x (TLB Dump), qspinlock и JIT-компиляции BPF. Добавлен типовой драйвер для ноутбуков, использующий ACPI.
- В интерфейсе асинхронного ввода/вывода io_uring предложен режим IORING_SETUP_DEFER_TASKRUN, позволяющий временно отложить выполнение связанных с кольцевым буфером работ до момента, пока не поступит запрос от приложения, что может использоваться для организации выполнения работ в пакетном режиме и предотвращения проблем с задержками из-за вытеснения приложения в неподходящий момент.
- Процессам в пространстве пользователя предоставлена возможность инициирования преобразования диапазона обычных страниц памяти в набор больших страниц памяти (Transparent Huge-Pages).
- Добавлена реализация устройства /dev/userfaultfd, позволяющего организовать доступ к функциональности системного вызова userfaultfd() с использованием прав доступа в ФС. Функциональность userfaultfd позволяет создавать обработчики обращений к невыделенным страницам памяти (page faults) в пространстве пользователя.
- Изменены требования к версии утилиты GNU Make - для сборки ядра теперь требуется как минимум версия 3.82.
- В файловую систему Btrfs внесены существенные оптимизации производительности, среди прочего на порядки изменена производительность операций fiemap и lseek (проверка совместного использования экстентов ускорена в 2-3 раза, а смена позиции в файлах ускорена в 1.3-4 раза). Кроме того оптимизировано журналирование inode для каталогов (в тесте dbench прирост производительности на 25% и снижение задержек на 21%), оптимизирован буферизированный ввод/вывод и сокращено потребление памяти.
- Добавлена поддержка асинхронной буферизированной записи для приложений, использующих io_uring, применение которого демонстрирует двухкратное ускорение пропускной способности при записи и существенное снижение задержек (от 2 до 150 раз). В операцию "send" добавлена поддержка файлов, защищённых при помощи fs-verity. Сокращено потребление памяти при выполнении проверки целостности ФС. Добавлена структура block-group-tree для отслеживания групп блоков, позволяющая оптимизировать монтирование многотерабайтных ФС.
- В ФС ext4 добавлены оптимизации производительности, связанные с поддержанием журнала и работой в режиме только для чтения. Прекращена поддержка устаревших атрибутов noacl и nouser_xattr.
- В файловой системе EROFS (Enhanced Read-Only File System), предназначенной для использования на разделах, доступных в режиме только для чтения, реализована возможность совместного хранения данных, дублирующихся в разных ФС.
- В системный вызов statx() добавлена возможность вывода сведений о возможности применения к файлу прямого ввода/вывода.
- В подсистему FUSE (Filesystems in User Space) добавлена поддержка создания временных файлов с флагом O_TMPFILE.
- В CIFS оптимизирована поддержка уведомлений об изменениях в разделах SMB3, включено кэширование каталогов и изменена обработка символических ссылок в SMB2 и SMB3.
- Заменена реализация механизма защиты CFI (Control Flow Integrity), добавляющего перед каждым косвенным вызовом функции проверки для выявления некоторых форм неопределённого поведения, которые потенциально могут привести к нарушению нормального порядка выполнения (control flow) в результате применения эксплоитов, изменяющих хранимые в памяти указатели на функции. Штатная реализация CFI от проекта LLVM заменена на вариант, также основанный на использовании Clang, но специально адаптированный для защиты низкоуровневых подсистем и ядер операционных систем. В LLVM обновленная реализация будет предложена в выпуске Clang 16 и будет включаться опцией "-fsanitize=kcfi". Ключевым отличием данной реализации является то, что она не привязана к оптимизациям на этапе связывания (LTO) и не приводит к замене указателей функций на ссылки в таблице переходов.
- Для LSM-модулей (Linux Security Module) предоставлена возможность создания обработчиков, перехватывающих операции по созданию пространств имён.
- Предоставлены средства для верификации цифровых подписей PKCS#7 в BPF-программах.
- В /dev/random возвращена возможность открытия в неблокирующем режиме (O_NONBLOCK), которая была по недосмотру удалена в ядре 5.6.
- На системах с архитектурой x86 добавлен вывод предупреждения в случае маппинга подсистемами ядра страниц памяти, одновременно допускающими исполнение и запись. В дальнейшем рассматривается возможность полностью запретить подобный маппинг памяти.
- Добавлен отладочный механизм KMSAN (Kernel Memory Sanitizer) для выявления использования неинициализированной памяти в ядре, а также утечек неинициализированной памяти между пространством пользователя и устройствами.
- Внесены изменения в генератор чисел CRNG, используемый в вызове getrandom. Изменения подготовлены Джейсоном Доненфилдом (Jason A. Donenfeld), автором VPN WireGuard и нацелены на повышение безопасности извлечения псевдослучайных целых чисел.
- В TCP-стеке реализована возможность (отключена по умолчанию) раздельного использования хэш-таблиц сокетов для каждого пространства имён, что позволяет оптимизировать производительность систем с большим числом пространств имён.
- Удалён код для поддержки устаревшего протокола DECnet. Для пространства пользователя оставлены заглушки API, позволяющие компилировать приложения, использующие DECnet, но данные приложения не смогут подключиться к сети.
- Документирован протокол netlink. Добавлена возможность определения отсутствующих атрибутов netlink.
- Добавлена начальная поддержка Ethernet PSE (Power Sourcing Equipment) для организации питания устройств через Ethernet.
- Реализована возможность создания mesh-сетей на базе Bluetooth.
- Для MPTCP (MultiPath TCP) реализована поддержка режима быстрой установки соединения (TCP_FASTOPEN_CONNECT) и разрешены привилегированные операции из пространств имён идентификаторов пользователей. MPTCP представляет собой расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам.
- Во встроенную в ядро реализацию протокола TLS добавлена поддержка алгоритма ARIA-GCM и возможность применения 256-разрядных ключей при использовании offload-ускорения.
- В драйвере amdgpu добавлена поддержка проброса DSC (Display Stream Compression) для сжатия данных без потерь при обмене информацией с экранами, поддерживающими большое разрешение. Продолжена работа по обеспечению поддержки платформ AMD RDNA3 (RX 7000) и CDNA (Instinct). Добавлена поддержка IP-компонентов DCN 3.2, SMU 13.x, NBIO 7.7, GC 11.x, PSP 13.x, SDMA 6.x и GMC 11.x. В драйвере amdkfd (для дискретных GPU AMD, таких как Polaris) реализована поддержка GFX 11.0.3.
- В драйвере i915 (Intel) включена поддержка GPU Meteor Lake. Для Meteor Lake и следующих GPU обеспечена поддержка интерфейса DP 2.0 (DisplayPort). Добавлены идентификаторы для видеокарт на базе микроархитектуры Alder Lake S.
- Добавлена поддержка звуковых подсистем, реализованных в процессорах Apple Silicon, Intel SkyLake и Intel KabyLake. В звуковом драйвере CS35L41 HDA обеспечена поддержка перехода в спящий режим. Добавлена поддержка ASoC (ALSA System on Chip) для встроенных звуковых чипов Apple Silicon, AMD Rembrant DSPs, AMD Pink Sardine ACP 6.2, Everest ES8326, Intel Sky Lake и Kaby Lake, Mediatek MT8186, NXP i.MX8ULP DSPs, Qualcomm SC8280XP, SM8250, SM8450 и Texas Instruments SRC4392
- Добавлена поддержка LCD-панелей Samsung LTL101AL01, B120XAN01.0, R140NWF5 RH, Densitron DMT028VGHMCMI-1A TFT, AUO B133UAN02.1, IVO M133NW4J-R3, Innolux N120ACA-EA1, AUO B116XAK01.6, BOE NT116WHM-N21, INX N116BCA-EA2, INX N116BCN-EA1, Multi-Inno Technology MI0800FT-9.
- Добавлена поддержка AHCI SATA-контроллеров, используемых в SoC Baikal-T1.
- Добавлена поддержка Bluetooth-чипов MediaTek MT7921, Intel Magnetor (CNVi, Integrated Connectivity), Realtek RTL8852C, RTW8852AE и RTL8761BUV (Edimax BT-8500).
- В драйвер ath11k для беспроводных модулей Qualcomm добавлена поддержка спектрального сканирования в диапазоне 160 MHz, реализован многопоточный NAPI, оптимизирована поддержка Wi-Fi чипов Qualcomm WCN6750.
- Добавлены драйверы для клавиатуры к PinePhone, тачпадов InterTouch (ThinkPad P1 G3), X-Box Adaptive Controller, PhoenixRC Flight Controller, VRC-2 Car Controller, DualSense Edge Controller, управляющих панелей IBM (IBM Operation Panel), пультов XBOX One Elite, планшетов XP-PEN Deco Pro S и Intuos Pro Small (PTH-460).
- Добавлен драйвер для криптографических ускорителей Aspeed HACE (Hash and Crypto Engine).
- Добавлена поддержка интегрированных Thunderbolt/USB4 контроллеров Intel Meteor Lake.
- Добавлена поддержка смартфонов Sony Xperia 1 IV, Samsung Galaxy E5, E7 и Grand Max, Pine64 Pinephone Pro.
- Добавлена поддержка ARM SoC и плат: AMD DaytonaX, Mediatek MT8186, Rockchips RK3399 и RK3566, TI AM62A, NXP i.MX8DXL, Renesas R-Car H3Ne-1.7G, Qualcomm IPQ8064-v2.0, IPQ8062, IPQ8065, Kontron SL/BL i.MX8MM OSM-S, MT8195 (Acer Tomato), Radxa ROCK 4C+, NanoPi R4S Enterprise Edition, JetHome JetHub D1p. Обновлены драйверы для SoC Samsung, Mediatek, Renesas, Tegra, Qualcomm, Broadcom и NXP.
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.1 - Linux-libre 6.1-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В обновленном выпуске проведена чистка драйвера rtw8852b и DTS-файлов для разных SoC Qualcomm и MediaTek с процессорами на базе архитектуры AArch64. Обновлён код чистки блобов в драйверах и подсистемах amdgpu, i915, brcmfmac, r8188eu, rtw8852c, Intel ACPI. Откорректирована чистка устаревших драйверов tm6000 TV cards, cpia2 v4l, sp8870, av7110[13].
В России резко участились атаки на системы под Linux
В третьем квартале 2022 года в России доля вирусных атак на операционные системы на базе Linux выросла до 30% с 12% тремя месяцами ранее. Об этом свидетельствуют данные Positive Technologies, обнародованные 5 декабря 2022-го. Подробнее здесь.
Американцы напряглись, обнаружив в ядре Linux внушительный след программиста российской Positive Technologies
Аналитики базирующейся в Нью-Йорке аналитической компании Margin Research по заказу Управления перспективных исследовательских проектов Министерства обороны США (DAPRA) проводят исследование SocialCyber, в рамках которого требуется понять, кто является ключевыми игроками в экосистеме open source, и как сообщество и код могут сталкиваться с угрозами[14]. Необходимость такой работы DAPRA объясняет тем, что у Минобороны США есть критические зависимости от ПО с открытым кодом.
SocialCyber широко подходит к изучению рисков, исследование охватывает, в том числе, то, как злоумышленники могут нацеливаться на сообщества разработчиков, отправлять код с дефектами, вмешиваться в исправление уязвимостей, отправлять вводящие в заблуждение отчёты о найденных багах и др.
На сайте DAPRA дата начала исследовательского проекта обозначена 4-м июня 2021 года, а срок работы над ним составляет 18 месяцев. Получается, что завершиться проект должен в декабре 2022 года. Некоторыми уже полученными в рамках этой работы результатами исследователи делятся на различных профильных конференциях.
Из записи в блоге Margin Research по итогам одной из таких конференций, написанной в ноябре участником исследования SocialCyber Джастином Шерманом (Justin Sherman), следует, что в своей работе аналитики сфокусировалась на ядре Linux[15]. Это включает изучение того, кто является критическими контрибьюторами кода, с использованием связанных с Linux данных из GitHub, данных из Twitter и других источников, и развитие путей толкования полученных данных.
К примеру, один из моментов, которые выяснили аналитики Margin Research, – то, что люди, связанные с Huawei, были среди топовых контрибьюторов ядра Linux в 2021 году, и превзошли вклад, который внесли в ядро индивидуальные контрибьюторы, аффилированные с Intel. По мере того, как накапливаются данные о контрибьюторах, Margin Research привлекает дополнительных экспертов для дальнейшего анализа компаний, исследовательских институтов и отдельных персон.
Другая «находка» аналитиков – что один из лидирующих контрибьюторов ядра Linux из России работает в Positive Technologies, компании-разработчике ИБ-решений, которая с 2021 года находится под американскими санкциями «за поддержку киберактивностей российского правительства». Это имеет значение по нескольким причинам, уверены в Margin Research. Одна из них - эта информация важна для понимания, кто в России драйвит изменения в широко используемой ОС. Вклад сотрудника Positive Technologies в ядро аналитики оценили как безвредный. Это Джастин Шерман подчёркивает в своей записи в блоге.
Российское правительство нацелено на замену западных технологий российскими технологиями, в том числе на основе ПО с открытым кодом. Речь идёт и о замене ОС Microsoft Windows. Соответственно, есть масса причин, почему российское правительство хочет, чтобы ОС Linux была более безопасной, и один из «основных поставщиков правительства», к каковым американские аналитики относят Positive Technologies, заинтересован в том, чтобы лучше защитить Linux.
![]() | Вместе с тем, это вызывает ряд вопросов, связанных с безопасностью, с неясными ответами, - говорит представитель Margin Research. | ![]() |
Американское правительство считает, что Positive Technologies «поставляет эксплойты российскому правительству». Учитывая, что компания предлагает много сервисов для защиты, как и многие организации, она может иметь разные команды, занимающиеся разными проблемами. Например, команды могли разделиться на тех, кто занимается вопросами атак, и тех, кто сфокусирован на защите, рассуждают в Margin Research.
Американские аналитики провели большую работу по изучению деятельности Positive Technologies, вплоть до того, сколько человек из года в год посещают её конференцию Positive Hack Days, а также исследовали рынок частных игроков в области ИБ в России в целом.
В Margin Research говорят, что в ходе своей работы они помечают подсанкционные кибер-субъекты, их вклад в ядро Linux, а также частные фирмы, которые поддерживают российские кибер-операции. Впрочем, других примеров российских подсанкционных контрибьюторов ядра Linux в этой записи в блоге или ещё где-то аналитики пока не приводят.
Основатель Margin Research София д'Антуан (Sophia d’Antoine) ранее отмечала, что в этом исследовании даже самые простые вещи выглядят в новинку для многих важных людей.
![]() | Правительство только сейчас осознаёт, что наша критическая инфраструктура использует код, который в прямом смысле мог быть написан субъектами, находящимся под санкциями, - говорила основатель Margin Research[16]. | ![]() |
В своём исследовании аналитики увязывают российскую экосистему кибербезопасности, представленную частными игроками, и экосистему open source, чтобы в дальнейшем лучше понять ландшафт киберугроз, зарубежные сообщества хакеров и то, как open source код пересекается развитием возможностей проводить кибератаки, с наймом иностранных кибер-талантов и др. В Positive Technologies, учитывая текущую геополитическую обстановку, решили не раскрывать подробности, связанные со своим ключевым контрибьютором ядра Linux.
Насколько действительно могут представлять угрозу для одной страны контрибьюторы ядра Linux из недружественной ей страны? Разговоры о том, что контрибьюторы могут заложить в программное обеспечение с открытым кодом вредоносные элементы, идут давно, отмечает заместитель гендиректора «Базальт СПО» Алексей Новодворский. Но когда код открытый, то всё можно проверить, для оценки кода существуют и специальные инструменты, и эксперты. А в случае с закрытым кодом мы ничего не можем проверить, кроме как всякими гораздо более сложными методами.
![]() | Кроме того, чтобы нанести вред конкретной организации или организациям из конкретной страны, уязвимости должны быть адресными. Это нетривиальная задача. А в случае с ядром Linux, вдобавок, сообщество разработчиков большое, процедура проверки и принятия кода тщательно прописана, и трудно представить, что можно внести вредительские изменения, - объяснил TAdviser заместитель гендиректора «Базальт СПО». | ![]() |
Вместе с тем, действительно, даже в случае с ПО с открытым кодом появилось немало рисков в области ИБ, и полностью исключить их вряд ли возможно. Эти риски существенны в том случае, если, например, в какой-то фирме с не самыми опытными сотрудниками ИТ-специалист собирает в продакшн код, который он откуда-то взял, и процессы тестирования софта там не отлажены. А если организация дорожит репутацией, и у неё есть подразделение тестирования, проверяющее этот код, и тем более, если сами сотрудники этой организации принимают участие в его разработке, тогда риск минимальный. Если компания использует open source код в сборках от сторонних поставщиков, то важно понимать из каких открытых репозиториев этот код берётся, и убедиться, что код тестируется.
![]() | Это относится к организациям, применяющим ПО с открытым кодом в любой стране, – хоть в России, хоть в Америке: необходимо тщательно проверять и тестировать используемый открытый код, - резюмировал Алексей Новодворский в разговоре с TAdviser. | ![]() |
Релиз ядра Linux 6.0
3 октября 2022 года стало известно о том, что после двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.0. Значительное изменение номера версии произведено из эстетических соображений и является формальным шагом, снимающим дискомфорт из-за накопления большого числа выпусков в серии (Линус пошутил, что причина смены номера ветки скорее в том, что у него заканчиваются пальцы на руках и ногах считать номера версий). Среди наиболее заметных изменений: поддержка асинхронной буферизированной записи в XFS, блочный драйвер ublk, оптимизация планировщика задач, механизм верификации корректности работы ядра, поддержка блочного шифра ARIA.
Как сообщалось, в данную версию принято 16585 исправлений от 2129 разработчиков, размер патча - 103 МБ (изменения затронули 13939 файлов, добавлено 1420093 строк кода, удалено 318741 строк). Около 40% всех представленных в 6.0 изменений связаны с драйверами устройств, примерно 19% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 4% - с файловыми системами и 2% c внутренними подсистемами ядра.
Основные изменения в ядре 6.0:
- Дисковая подсистема, ввод/вывод и файловые системы
- В файловую систему XFS добавлена поддержка асинхронной буферизированной записи для приложений, использующих io_uring. Тесты производительности, проведённые при помощи инструментария fio (1 поток, размер блока 4кб, 600 секунд, последовательная запись), показывают увеличение числа операций ввода/вывода в секунду (IOPS) с 77k до 209k, скорости передачи данных – с 314MB/s до 854MB/s, и падения задержек с 9600ns до 120ns (80 раз).
- В файловой системе Btrfs реализована вторая версия протокола для команды "send", реализующая поддержку дополнительных метаданных, отправки данных более крупными блоками (более 64K) и передачи экстентов в сжатом виде. Значительно (до 3 раз) увеличена производительность операций прямого чтения (direct read) за счёт одновременного чтения до 256 секторов. Уменьшены конфликты блокировок и ускорена проверка метаданных за счёт сокращения резервируемых метаданных для отложенных элементов.
- В файловую систему ext4 добавлены ioctl-операции EXT4_IOC_GETFSUUID и EXT4_IC_SETFSUUID для извлечения или установки UUID-идентификатора, хранимого в суперблоке.
- В файловой системе F2FS предложен режим низкого потребления памяти, который оптимизирует работу на устройствах с небольшим объёмом ОЗУ и позволяет снизить потребление памяти ценой уменьшения производительности.
- Добавлена поддержка аутентификации по внутреннему каналу ("in-band") для накопителей NVMe.
- В сервере NFSv4 реализован лимит на число активных клиентов, который выставляется как 1024 допустимых клиентов на каждый гигабайт оперативной памяти в системе.
- В реализации CIFS-клиента оптимизирована производительность в режиме многоканальной передачи.
- В подсистему отслеживания событий в ФС fanotify добавлен флаг FAN_MARK_IGNORE для игнорирования специфичных событий.
- В ФС Overlayfs, при монтировании поверх ФС с маппингом идентификаторов пользователей, обеспечена корректная поддержка POSIX-совместимых списков управления доступом.
- Добавлен блочный драйвер ublk, выносящий специфичную логику на сторону фонового процесса в пространстве пользователя и использующий подсистему io_uring.
- Память и системные сервисы
- В подсистему DAMON (Data Access MONitor) добавлены возможности, позволяющие не только отслеживать доступ процессов к оперативной памяти из пространства пользователя, но и влиять на управление памятью. В частности, предложен модуль "LRU_SORT", обеспечивающий перегруппировку списков LRU (Least Recently Used) для повышения приоритета определённых страниц памяти.
- Реализована возможность создания регионов памяти, используя возможности шины CXL (Compute Express Link), применяемой для организации взаимодействия CPU с устройствами памяти. CXL позволяет подключать дополнительные регионы памяти, предоставляемые внешними устройства памяти, и использовать их как дополнительные ресурсы физического адресного пространства для расширения системной оперативной памяти (DDR) или постоянной памяти (PMEM).
- Решены проблемы с производительностью систем на процессорах AMD Zen, вызванные кодом, добавленным 20 лет назад для обхода аппаратной проблемы в некоторых чипсетах (добавлялась дополнительная инструкция WAIT, замедляющая процессор чтобы чипсет успевал перейти в состояние простоя). Изменение приводило к снижению производительности при нагрузках, в которых часто чередуются состояния простоя (idle) и активности (busy). Например, после отключения обходного манёвра средние показатели теста tbench увеличились с 32191 MB/s до 33805 MB/s.
- Из планировщика задач убран код с эвристикой, обеспечивающий миграцию процессов на наименее загруженные CPU с учётом прогнозируемого выигрыша в энергопотреблении. Разработчики пришли к выводу, что эвристика не приносит должной пользы и её проще удалить и переносить процессы без дополнительных оценок каждый раз когда такой перенос потенциально может привести к снижению потребления энергии (например, когда целевой CPU находится на уровне с более низким энергопотреблением). Отключение эвристики привело к снижению энергопотребления при выполнении интенсивных задач, например, в тесте с декодированием видео энергопотребление снизилось на 5.6%.
- Проведена оптимизация распределения задач по ядрам CPU на крупных системах, позволившая поднять производительность при некоторых видах нагрузки.
- В интерфейсе асинхронного ввода/вывода io_uring предложен флаг IORING_RECV_MULTISHOT, позволяющий использовать режим "multi-shot" с системным вызовом recv() для выполнения разом нескольких операций чтения с одного сетевого сокета. В io_uring также реализована поддержка сетевой передачи без промежуточной буферизации (zero-copy).
- Реализована возможность перевода программ BPF, прикреплённых к uprobe, в состояние сна. В BPF также добавлен итератор ksym для работы с таблицами символов ядра.
- Удалён устаревший интерфейс "efivars" в sysfs, предназначенный для доступа к загрузочным переменным UEFI (для доступа к данным EFI теперь повсеместно применяется виртуальная ФС efivarfs).
- В утилите perf реализованы отчёты для анализа конфликта блокировок и времени, проводимого процессором для выполнения компонентов ядра.
- Удалена настройка CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3, позволявшая собирать ядро в режиме оптимизации "-O3". Отмечается, что эксперименты с режимами оптимизации могут проводиться через передачу флагов при сборке ("make KCFLAGS=-O3"), а для добавления настройки в Kconfig требуется обеспечить повторяемое профилирование производительности, показывающее что применяемое в режиме "-O3" развёртывание циклов даёт выигрыш по сравнению с уровнем оптимизации "-O2".
- Добавлен debugfs-интерфейс для получения информации о работе отдельных "memory shrinker" (обработчики, вызываемые при нехватке памяти и осуществляющие упаковку структур данных ядра для сокращения потребления ими памяти).
- Для архитектур OpenRISC и LoongArch реализована поддержка шины PCI.
- Для архитектуры RISC-V реализовано расширение "Zicbom" для управления устройствами c DMA, не согласованным с кэшем (non-cache-coherent).
- Виртуализация и безопасность
- Добавлен механизм верификации RV (Runtime Verification) для проверки корректности работы на надежных системах, обеспечивающих отсутствие сбоев. Проверка производится во время выполнения через прикрепление обработчиков к точкам трассировки, сверяющих фактический ход выполнения с заранее определённой эталонной детерминированной моделью автомата, определяющей ожидаемое поведение системы. Сверка с моделью во время выполнения позиционируется как более легковесный и простой для реализации на практике способ подтверждения корректности выполнения на критически важных системах, дополняющий классические методы подтверждения надёжности. Из особенностей RV называется возможность обеспечить строгую верификацию без отдельной реализации всей системы на языке моделирования, а также гибкое реагирование на непредвиденные события.
- Интегрированы компоненты ядра для управления анклавами на базе технологии Intel SGX2 (Software Guard eXtensions), позволяющей приложениям выполнять код в изолированных зашифрованных областях памяти, доступ остальной системы к которым ограничен. Технология Intel SGX2 поддерживается в чипах Intel Ice Lake и Gemini Lake, и отличается от Intel SGX1 дополнительными инструкциями для динамического управления памятью анклавов.
- Для архитектуры x86 реализована возможность передачи затравки для генератора псевдослучайных чисел через настройки загрузчика.
- В LSM-модуль SafeSetID добавлена возможность управления изменениями, совершаемыми через вызов setgroups(). SafeSetID позволяет системным сервисам безопасно управлять пользователями без повышения привилегий (CAP_SETUID) и без получения полномочий пользователя root.
- Добавлена поддержка блочного шифра ARIA.
- В модуле управления безопасностью на базе BPF реализована возможность прикрепления обработчиков к отдельным процессам и группам процессов (cgroup).
- Добавлен механизм c реализацией watchdog для определения зависаний гостевых систем на основе мониторинга активности vCPU.
- Сетевая подсистема
- В подсистему BPF добавлены обработчики для генерации и проверки SYN cookies. Также добавлен набор функций (kfunc) для доступа и изменения состояния соединений.
- В беспроводной стек добавлена поддержка механизма MLO (Multi-Link Operation), определённого в спецификации Wi-Fi 7 и позволяющего устройствам одновременно получать и отправлять данные с использованием разных диапазонов частот и каналов, например, для установки одновременно нескольких каналов связи между точкой доступа к клиентским устройством.
- Оптимизирована производительность встроенной в ядро реализации протокола TLS.
- Добавлен параметр командной строки ядра "hostname=", позволяющий выставить имя хоста на ранней стадии загрузки, до того как будут запущены компоненты пространства пользователя.
- Оборудование
- В драйвере i915 (Intel) обеспечена поддержка дискретных видеокарт Intel Arc (DG2/Alchemist) A750 и A770. Предложена начальная реализация поддержки GPU Intel Ponte Vecchio (Xe-HPC) и Meteor Lake. Продолжена работа по поддержке платформы Intel Raptor Lake.
- В драйвере amdgpu продолжена работа по обеспечению поддержки платформ AMD RDNA3 (RX 7000) и CDNA (Instinct).
- В драйвере Nouveau переработан код поддержки дисплейных движков GPU NVIDIA nv50.
- Добавлен DRM-драйвер logicvc для экранов LogiCVC.
- В драйвере v3d (для GPU Broadcom Video Core) реализована поддержка плат Raspberry Pi 4.
- В драйвер msm добавлена поддержка GPU Qualcomm Adreno 619.
- В драйвер Panfrost добавлена поддержка GPU ARM Mali Valhall.
- Добавлена начальная поддержка процессоров Qualcomm Snapdragon 8cx Gen3, используемых в ноутбуках Lenovo ThinkPad X13s.
- Добавлены звуковые драйверы для платформ AMD Raphael (Ryzen 7000), AMD Jadeite, Intel Meteor Lake и Mediatek MT8186.
- Добавлена поддержка ускорителей систем машинного обучения Intel Habana Gaudi 2.
- Добавлена поддержка ARM SoC Allwinner H616, NXP i.MX93, Sunplus SP7021, Nuvoton NPCM8XX, Marvell Prestera 98DX2530, Google Chameleon v3.
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.0 - Linux-libre 6.0-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В данном выпуске отключено использование блобов в драйвере CS35L41 HD-audio и драйвере с интерфейсом UCSI для микроконтроллеров STM32G0. Проведена чистка dts-файлов для чипов Qualcomm и MediaTek. Переделано отключение блобов в драйвере MediaTek MT76. Обновлён код чистки блобов в драйверах и подсистемах AMDGPU, Adreno, Tegra VIC, Netronome NFP и Habanalabs Gaudi2. Прекращена чистка драйвера VXGE, удалённого из ядра[17].
Выпуск первой предварительной версии ядра Linux 6.0
Линус Торвальдс объявил о выпуске первой предварительной версии ядра Linux 6.0 доступной для тестировщиков и пользователей, желающих узнать побольше о том, что будет включено в финальный релиз, который ожидается в начале октября 2022 года. Об этом стало известно 15 августа 2022 года.
По словам Линуса Торвальдса , в даной версии ядра Linux нет ничего принципиально нового, ведь около 60% релиза – это обновленные драйверы, направленные на улучшение поддержки «железа», причем упор был сделан на графические процессоры от AMD. Однако, не обошлось и без обновлений архитектуры, улучшений файловой системы и инструментария, а также некоторых изменений, повышающих производительность системы.
Окончательный релиз ядра Linux 6.0 ожидается в начале октября – либо 2-го, либо 9-го числа. А пока пользователям доступна первая сборка предварительной версии ядра на сайте kernel.org[18].
Linux 5.19
1 августа 2022 года стало известно о том, что после двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.19. Среди наиболее заметных изменений: поддержка процессорной архитектуры LoongArch, интеграция патчей "BIG TCP", режим "on-demand" в fscache, удаление кода для поддержки формата a.out, возможность применения ZSTD для сжатия прошивок, интерфейс для управления вытеснением памяти из пространства пользователя, оптимизация надёжности и производительности генератора псевдослучайных чисел, поддержка расширений Intel IFS (In-Field Scan), AMD SEV-SNP (Secure Nested Paging), Intel TDX (Trusted Domain Extensions) и ARM SME (Scalable Matrix Extension).
Как сообщалось, в анонсе Линус сообщил, что скорее всего следующему выпуску ядра будет присвоен номер 6.0, так как в ветке 5.x накопилось достаточного выпусков для смены первого числа в номере версии. Смена нумерации осуществляется из эстетических соображений и является формальным шагом, снимающим дискомфорт из-за накопления большого числа выпусков в серии.
Также Линус упомянул, что использовал для формирования релиза ноутбук Apple на базе архитектуры ARM64 (Apple Silicon) с Linux-окружением на базе дистрибутива Asahi Linux. Это не основная рабочая станция Линуса, но он использовал данную платформу, чтобы проверить её пригодность для работы над ядром и быть уверенным в том, что сможет формировать выпуски ядра в поездке, имея под рукой лёгкий ноутбук. До этого много лет назад Линус имел опыт использования оборудования Apple для разработки - когда-то он пользовался компьютером на базе CPU ppc970 и ноутбуком Macbook Air.
В обновленную версию принято 16401 исправлений от 2190 разработчиков (в прошлом выпуске было 16206 исправлений от 2127 разработчиков), размер патча - 90 МБ (изменения затронули 13847 файлов, добавлено 1149456 строк кода, удалено 349177 строк). Около 39% всех представленных в 5.19 изменений связаны с драйверами устройств, примерно 21% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 11% связано с сетевым стеком, 4% - с файловыми системами и 3% c внутренними подсистемами ядра.
Основные изменения в ядре 5.19:
Дисковая подсистема, ввод/вывод и файловые системы
- Файловая система EROFS (Enhanced Read-Only File System), предназначенная для использования на разделах, доступных в режиме только для чтения, переведена на использование подсистемы fscache, обеспечивающей кэширование данных. Изменение позволило заметно поднять производительность систем, в которых из образа на базе EROFS запускается большое число контейнеров.
- В подсистему fscache добавлен режим чтения по требованию ("on-demand"), который задействован для оптимизации EROFS. Обновленный режим позволяет организовать кэширование чтения из образов ФС, находящихся в локальной системе. В отличие от изначально доступного режима работы, ориентированного на кэширование в локальной файловой системе данных, передаваемых через сетевые файловые системы, режим "on-demand" делегирует функции извлечения данных и их записи в кэш отдельному фоновому процессу, выполняемому в пространстве пользователя.
- В XFS обеспечена возможность хранения миллиардов расширенных атрибутов в i-node. Максимальное количество экстентов для одного файла увеличено с 4 миллиардов до 247. Реализован режим для атомарного обновления сразу нескольких расширенных атрибутов файла.
- В файловой системе Btrfs оптимизирована работа с блокировками, что позволило добиться оптимизации производительности примерно на 7% при прямой записи в режиме nowait. Производительность операций в режиме NOCOW (без copy-on-write) повышена приблизительно на 3%. Снижена нагрузка на страничный кэш при работе команды "send". Минимальный размер подстраниц снижен с 64К до 4K (можно использовать подстраницы размером меньше страниц ядра). Осуществлён переход с использования базисного дерева (radix tree) на алгоритм XArrays.
- В NFS-сервер добавлен режим продления сохранения состояния блокировки, выставленной клиентом, который перестал отвечать на запросы. Данный режим позволяет задержать очистку блокировки вплоть до суток, если другой клиент не запросит конкурирующую блокировку. В штатном режиме блокировка очищается через 90 секунд после того как клиент перестал отвечать.
- В подсистеме отслеживания событий в ФС fanotify реализован флаг FAN_MARK_EVICTABLE, при помощи которого можно отключить закрепление целевых i-node в кэше, например, для игнорирования подветок без закрепления их частей в кэше.
- В драйвер для ФС FAT32 добавлена поддержка получения сведений о времени создания файла через системный вызов statx c реализацией более эффективного и функционального варианта stat(), возвращающего расширенную информацию о файле.
- Внесены значительные оптимизации в драйвер exFAT, связанные с обеспечением одновременной очистки группы секторов при активном режиме dirsync, вместо последовательной посекторной очистки. За счёт сокращения числа запросов блоков после внесения оптимизации производительность создания большого числа каталогов на SD-карте возросла более чем на 73-85% в зависимости от размера кластера.
- В состав ядра включено первое корректирующее обновление драйвера ntfs3. С момента включения ntfs3 в состав ядра 5.15 в октябре 2021 года драйвер не обновлялся, а с разработчиками была потеряна связь, но теперь разработчики возобновили публикацию изменений. В предложенных патчах устранены ошибки, приводящие к утечкам памяти и аварийным завершениям, решены проблемы с выполнением xfstests, проведена чистка неиспользуемого кода и исправлены опечатки.
- Для OverlayFS реализована возможность маппинга идентификаторов пользователей примонтированных файловых систем, применяемого для сопоставления файлов определённого пользователя на примонтированном чужом разделе с другим пользователем в текущей системе.
Память и системные сервисы
- Добавлена начальная поддержка архитектуры набора команд LoongArch, применяемой в процессорах Loongson 3 5000 и реализующей RISC ISA, похожий на MIPS и RISC-V. Архитектура LoongArch доступна в трёх вариантах: урезанный 32-разрядный (LA32R), обычный 32-разрядный (LA32S) и 64-разрядный (LA64).
- Удалён код для поддержки формата исполняемых файлов a.out, который был переведён в разряд устаревших в выпуске 5.1. Формат a.out давно не применяется на системах с Linux, а генерация файлов a.out не поддерживается современными инструментальными средствами в конфигурациях для Linux по умолчанию. Загрузчик для a.out файлов может быть реализован целиком в пространстве пользователя.
- Прекращена поддержка загрузочных опций, специфичных для архитектуры x86: nosep, nosmap, nosmep, noexec и noclflush).
- Прекращена поддержка устаревшей архитектуры CPU h8300 (Renesas H8/300), давно оставшейся без сопровождения.
- Расширены возможности, связанные с реагированием на выявление расщеплённых блокировок ("split lock"), возникающих при доступе к невыровненным данным в памяти из-за того, что при выполнении атомарной инструкции данные пересекают две линии кеша CPU. Подобные блокировки приводят к значительному падению производительности. Если ранее по умолчанию ядро выдавало предупреждение с информацией о вызвавшем блокировку процессе, то теперь проблемный процесс дополнительно будет замедлен, чтобы сохранить производительность остальной системы.
- Добавлена поддержка реализованного в процессорах Intel механизма IFS (In-Field Scan), позволяющего запускать низкоуровневые диагностические тесты CPU, способные выявлять проблемы, не определяемые штатными средствами на основе кодов коррекции ошибок (ECC) или битов чётности. Выполняемые тесты оформляются в форме загружаемой прошивки, оформленной по аналогии с обновлениями микрокода. Результаты тестирования доступны через sysfs.
- Добавлена возможность встраивания в ядро файла bootconfig, позволяющего помимо опций командной строки определять параметры работы ядра через файл с настройками. Встраивание осуществляется при помощи сборочной опции 'CONFIG_BOOT_CONFIG_EMBED_FILE="/PATH/TO/BOOTCONFIG/FILE"'. Ранее bootconfig определялся через прикрепление к образу initrd. Встраивание в ядре позволяет использовать bootconfig в конфигурациях без initrd.
- Реализована возможность загрузки прошивок, сжатых использованием алгоритма Zstandard. В sysfs добавлен набор управляющих файлов /sys/class/firmware/, позволяющий инициировать загрузку прошивок из пространства пользователя.
- В интерфейсе асинхронного ввода/вывода io_uring предложен обновленный флаг IORING_RECVSEND_POLL_FIRST, при выставлении которого сетевая операция вначале будет передана для обработки с использованием полинга (polling), что может сэкономить ресурсы в ситуациях, когда допустима обработка операции с некоторой задержкой. В io_uring также добавлена поддержка системного вызова socket(), предложены дополнительные флаги для оптимизации управления файловыми дескрипторами, добавлен режим "multi-shot" для приёма в вызове accept() разом нескольких соединений, добавлены операции для проброса команд NVMe напрямую в устройство.
- Для архитектуры Xtensa обеспечена поддержка отладочного инструмента KCSAN (Kernel Concurrency Sanitizer), предназначенного для динамического выявления состояний гонки внутри ядра. Также добавлена поддержка спящего режима и сопроцессоров.
- Для архитектуры m68k (Motorola 68000) реализована виртуальная машина (симулятор платформы), основанная на эмуляторе Android Goldfish.
- Для архитектуры AArch64 реализована поддержка расширений Armv9-A SME (Scalable Matrix Extension).
- В подсистеме eBPF разрешено хранение типизированных указателей в map-структурах, а также добавлена поддержка динамических указателей.
- Предложен обновленный упреждающий механизм вытеснения памяти, поддерживающий управление из пространства пользователя при помощи файла memory.reclaim. Запись числа в указанный файл приведёт к попытке вытеснения соответствующего числа байт из набора, связанного с cgroup.
- Оптимизирована точность учёта использования памяти при сжатии данных в разделе подкачки при помощи механизма zswap.
- Для архитектуры RISC-V обеспечена поддержка запуска 32-разрядных исполняемых файлов на 64-разрядных системах, добавлен режим для привязки ограничивающих атрибутов к страницам памяти (например, для запрета кэширования) и реализована функция kexec_file_load().
- Реализация поддержки 32-разрядых систем Armv4T и Armv5 адаптирована для использования в универсальных многоплатформенных сборках ядра, подходящих для разных ARM-систем.
Виртуализация и безопасность
- В подсистеме EFI реализована возможность конфиденциальной передачи гостевым системам секретной информации без её раскрытия хост-системе. Данные предоставляются через каталог security/coco в securityfs.
- В режиме защиты Lockdown, который ограничивает доступ пользователя root к ядру и блокирует пути обхода UEFI Secure Boot, устранена лазейка, позволявшая обходить защиту через манипуляции с отладчиком ядра.
- Включены патчи, нацеленные на оптимизацию надёжности и производительности генератора псевдослучайных чисел.
- При сборке при помощи Clang 15 реализована поддержка механизма рандомизации структур ядра.
- В механизм Landlock, позволяющий ограничить взаимодействие группы процессов с внешним окружением, предоставлена поддержка правил, позволяющих контролировать выполнение операций переименования файлов.
- Подсистема IMA (Integrity Measurement Architecture), предназначенная для проверки целостности компонентов операционной системы по цифровым подписям и хэшам, переведена на использование модуля fs-verity для верификации файлов.
- Изменена логика действий при отключении непривилегированного доступа к подсистеме eBPF - ранее отключались все команды, связанные с системным вызовом bpf(), а начиная с версии 5.19 оставлен доступ к командам, которые не приводят к созданию объектов. При подобном поведении для загрузки BPF-программы требуется привилегированный процесс, но затем непривилегированные процессы могут взаимодействовать с этой программой.
- Добавлена поддержка расширения AMD SEV-SNP (Secure Nested Paging), обеспечивающего безопасную работу с вложенными таблицами страниц памяти и защищающего от атак "undeSErVed" и "SEVerity" на процессоры AMD EPYC, позволяющих обойти механизм защиты AMD SEV (Secure Encrypted Virtualization).
- Добавлена поддержка механизма Intel TDX (Trusted Domain Extensions), позволяющий блокировать попытки стороннего доступа к зашифрованной памяти виртуальных машин.
- В драйвер virtio-blk, используемый для эмуляции блочных устройств, добавлена поддержка ввода/вывода с использованием полинга (polling), что по проведённым тестам позволило сократить задержки примерно на 10%.
Сетевая подсистема
- В состав включена серия патчей BIG TCP позволяющих увеличить максимальный размер TCP-пакета до 4ГБ для оптимизации работы высокоскоростных внутренних сетей дата-центров. Подобное увеличение размера пакета при 16-битном размере поля в заголовке достигается через реализацию "jumbo"-пакетов, размер в IP-заголовке которых выставляется в 0, а фактический размер передаётся в отдельном 32-разрядном поле в отдельном прикреплённом заголовке. При тестировании производительности выставление размера пакета в 185 КБ позволило увеличить пропускную способность на 50% и значительно сократить задержки передачи данных.
- Продолжена работа по интеграции в сетевой стек средств для отслеживания причин отбрасывания пакетов (коды reason). Код причины передаётся во время освобождения памяти, связанной с пакетом, и позволяет учитывать такие ситуации, как отбрасывание пакета из-за ошибок заполнения полей в заголовке, выявление спуфинга фильтром rp_filter, неверная контрольная сумма, нехватка памяти, срабатывание правил IPSec XFRM, неверный номер последовательности TCP и т.п.
- Добавлена поддержка отката соединений MPTCP (MultiPath TCP) на использование обычного TCP, в ситуациях, когда определённые возможности MPTCP не могут быть использованы. MPTCP представляет собой расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам. Добавлен API для управления потоками MPTCP из пространства пользователя.
Оборудование
- Добавлено более 420 тысяч строк кода, связанных с драйвером amdgpu, из которых около 400 тысяч строк приходится на автоматически сгенерированные заголовочные файлы с данными для регистров ASIC в драйвере для GPU AMD, а ещё 22.5 тысяч строк обеспечивают начальную реализацию поддержки AMD SoC21. Общий размер драйвера для GPU AMD превысил 4 млн строк кода. Кроме SoC21 в драйвере AMD включена поддержка SMU 13.x (System Management Unit), обновлена поддержка USB-C и GPUVM, проведена подготовка к поддержке следующих поколений платформ RDNA3 (RX 7000) и CDNA (AMD Instinct).
- В драйвере i915 (Intel) расширены возможности, связанные с управлением энергопотреблением. Добавлены идентификаторы GPU Intel DG2 (Arc Alchemist), используемых на ноутбуках, обеспечена начальная поддержка платформы Intel Raptor Lake-P (RPL-P), добавлена информация о графических картах Arctic Sound-M), реализован ABI для вычислительных движков, для карт DG2 добавлена поддержка формата Tile4, для систем на базе микроархитектуры Haswell реализована поддержка DisplayPort HDR.
- В драйвере Nouveau осуществлён переход на использование обработчика drm_gem_plane_helper_prepare_fb, для некоторых структур и переменных применено статическое выделение памяти. Что касается использования в Nouveau открытых компанией NVIDIA исходных текстов модулей ядра, то работа пока сводится к выявлению и устранению ошибок. В дальнейшем опубликованную прошивку планируется использовать для повышения производительности драйвера.
- Добавлен драйвер для контроллера NVMe, используемого в компьютерах Apple на базе чипа M1.
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 5.19 - Linux-libre 5.19-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В данном выпуске проведена чистка драйверов для pureLiFi X/XL/XC и TI AMx3 Wkup-M3 IPC. Обновлён код чистки блобов в драйверах и подсистемах Silicon Labs WFX, AMD amdgpu, Qualcomm WCNSS Peripheral Image Loader, Realtek Bluetooth, Mellanox Spectrum, Marvell WiFi-Ex, Intel AVS, IFS, pu3-imgu drivers. Реализована обработка devicetree-файлов Qualcomm AArch64. Добавлена поддержка схемы наименования компонентов Sound Open Firmware. Прекращена чистка драйвера ATM Ambassador, удалённого из ядра. Управление чисткой блобов в HDCP и Mellanox Core перенесено в отдельные теги kconfig[19].
Уязвимость в ядре Linux, позволяющая обойти механизм защиты Lockdown
21 июля 2022 года стало известно о том, что в ядре Linux выявлена уязвимость (CVE-2022-21505), позволяющая легко обойти механизм защиты Lockdown, который ограничивает доступ пользователя root к ядру и блокирует пути обхода UEFI Secure Boot. Для обхода предлагается использовать подсистему ядра IMA (Integrity Measurement Architecture), предназначенную для проверки целостности компонентов операционной системы по цифровым подписям и хэшам.
В режиме lockdown ограничивается доступ к /dev/mem, /dev/kmem, /dev/port, /proc/kcore, debugfs, отладочному режиму kprobes, mmiotrace, tracefs, BPF, PCMCIA CIS (Card Information Structure), некоторым интерфейсам ACPI и MSR-регистрам CPU, блокируются вызовы kexec_file и kexec_load, запрещается переход в спящий режим, лимитируется использование DMA для PCI-устройств, запрещается импорт кода ACPI из переменных EFI, не допускаются манипуляции с портами ввода/вывода, в том числе изменение номера прерывания и порта ввода/вывода для последовательного порта.
Суть уязвимости в том, что при использовании загрузочного параметра "ima_appraise=log", допускается вызов kexec для загрузки новой копии ядра, если в системе не активен режим Secure Boot и режим Lockdown используется обособленно от него. IMA не допускает включения режима "ima_appraise" при активном Secure Boot, но не учитывает возможность использования Lockdown отдельно от Secure Boot.[20]
Представление шестой версии патчей для ядра Linux с поддержкой языка Rust
8 мая 2022 года стало известно, что Мигель Охеда (Miguel Ojeda), автор проекта Rust-for-Linux, предложил для рассмотрения разработчиками ядра Linux выпуск v6 компонентов для разработки драйверов устройств на языке Rust. Это седьмая редакция патчей с учётом первого варианта, опубликованного без номера версии. Поддержка Rust рассматривается как экспериментальная, но уже включена в ветку linux-next и достаточно развита для начала работы по созданию слоёв абстракции над подсистемами ядра, а также для написания драйверов и модулей. Разработка финансируется компанией Google и организацией ISRG (Internet Security Research Group), которая является учредителем проекта Let's Encrypt и способствует продвижению HTTPS и развитию технологий для повышения защищённости интернета.
В представленной версии:
- Инструментарий и вариант библиотеки alloc, избавленный от возможных генераций состояния "panic" при возникновении ошибок, обновлены до выпуска Rust 1.60, в которой стабилизирована поддержка режима "maybe_uninit_extra", применяемого в патчах к ядру.
- Добавлена возможность выполнения тестов из документации (тесты, одновременно используемые в качестве примеров в документации), через преобразование во время компиляции тестов, завязанных на API ядра, в тесты KUnit, выполняемые во время загрузки ядра.
- Приняты требования, в соответствии с которыми тесты не должны приводить к выводу предупреждения линтера Clippy, как и код для ядра на языке Rust.
- Предложена начальная реализация модуля "net" с сетевыми функциями. Для кода на языке Rust предоставлен доступ к таким сетевым структурам ядра, как "Namespace" (на основе структуры ядра "struct net"), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) и их эквивалентам для IPv6.
- Реализована начальная поддержка методов асинхронного программирования (async), реализованная в форме модуля kasync. Например, можно создавать работающий в асинхронном режиме код для манипуляции с TCP-сокетами:
- Добавлен модуль net::filter для манипуляции с фильтрами сетевых пакетов. Добавлен пример rust_netfilter.rs с реализацией фильтра на языке Rust.
- Добавлена реализация простого мьютекса smutex::Mutex, не требующего привязки (pinning).
- Добавлена блокировка NoWaitLock, которая никогда не приводит к ожиданию освобождения, а в случае занятия другим потоком приводит к выводу ошибки при попытке получения блокировки вместо остановки вызывающего.
- Добавлена блокировка RawSpinLock отождествлённая с raw_spinlock_t в ядре, применяемая к секциям, которые не могут находиться в состоянии ожидания.
- Добавлен тип ARef для ссылок на объект, к которому применяется механизм подсчёта ссылок (always-refcounted).
- В бэкенде rustc_codegen_gcc, позволяющем использовать библиотеку libgccjit от проекта GCC в качестве генератора кода в rustc для обеспечения в rustc поддержки доступных в GCC архитектур и оптимизаций, реализована возможность раскрутки компилятора (bootstrapping) rustc. Под раскруткой компилятора понимается возможность использования в rustc генератора кода на основе GCC для сборки самого компилятора rustc. Кроме того, в недавний выпуск GCC 12.1 включены исправления в libgccjit, необходимые для корректной работы rustc_codegen_gcc. Ведётся подготовка к предоставлению возможности установки rustc_codegen_gcc при помощи утилиты rustup.
- Отмечается прогресс разработки GCC-фронтэнда gccrs с реализацией компилятора языка Rust на базе GCC. На начало мая 2022 года над gccrs в режиме полного рабочего дня работают два разработчика.
Предложенные изменения дают возможность использовать Rust в качестве второго языка для разработки драйверов и модулей ядра. Поддержка Rust преподносится как опция, не активная по умолчанию и не приводящая к включению Rust в число обязательных сборочных зависимостей к ядру. Использование Rust для разработки драйверов позволит с минимальными усилиями создавать безопасные и более качественные драйверы, избавленные от таких проблем как обращение к области памяти после её освобождения, разыменование нулевых указателей и выход за границы буфера.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами и учёт времени жизни объектов (области видимости), а также через оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.[21]
Linux 5.17
21 марта 2022 года стало известно о том, что после двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.17. Среди наиболее заметных изменений: обновленная система управления производительностью для процессоров AMD, возможность рекурсивного маппинга идентификаторов пользователей в файловых системах, поддержка переносимых скомпилированных BPF-программ, перевод генератора псевдослучайных чисел на алгоритм BLAKE2s, утилита rtla для анализа выполнения в режиме реального времени, бэкенд fscache для кэширования сетевых ФС, возможность прикрепления имён к анонимным операциям mmap.
Как сообщалось, в данную версию принято 14203 исправления от 1995 разработчиков, размер патча - 37 МБ (изменения затронули 11366 файлов, добавлено 506043 строк кода, удалено 250954 строк). Около 44% всех представленных в 5.17 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 15% связано с сетевым стеком, 4% - с файловыми системами и 4% c внутренними подсистемами ядра.
Основные возможности в ядре 5.17:
Дисковая подсистема, ввод/вывод и файловые системы
- Реализована возможность вложенного маппинга идентификаторов пользователей примонтированных файловых систем, применяемого для сопоставления файлов определённого пользователя на примонтированном чужом разделе с другим пользователем в текущей системе. Добавленная возможность позволяет рекурсивно использовать маппинг поверх файловых систем для которых уже применяется маппинг.
- Полностью переписана подсистема fscache, применяемая для организации кэширования в локальной файловой системе данных, передаваемых через сетевые файловые системы. Обновленная реализация отличается значительным изменением кода и заменой усложнённых операций планирования и отслеживания состояний объектов на более простые механизмы. Поддержка fscache реализована в файловой системе CIFS.
- В подсистеме отслеживания событий в ФС fanotify реализован тип событий FAN_RENAME, который позволяет разом перехватить операцию переименования файлов или каталогов (ранее для обработки переименований применялись два раздельных события FAN_MOVED_FROM и FAN_MOVED_TO).
- В файловой системе Btrfs проведена оптимизация операций логгирования и fsync для больших каталогов, реализованная за счёт копирования только индексных ключей и сокращения объёма логгируемых метаданных. Обеспечена поддержка индексации и поиска по размеру записей о свободном пространстве, что позволило примерно на 30% уменьшить задержки и сократить время поиска. Разрешено прерывать операции дефрагментации. Включена возможность добавлять устройства при отключении балансировки между накопителями, т.е. при монтировании ФС с опцией skip_balance.
- Предложен синтаксис монтирования файловой системы Ceph, решающий имевшиеся проблемы, связанные с привязкой к IP-адресам. Кроме IP-адресов для определения сервера теперь можно использовать идентификатор кластера (FSID).
- Файловая система Ext4 переведена на другой API для монтирования, который разделяет стадии разбора опций монтирования и настройки суперблока. Прекращена поддержка опций монтирования lazytime и nolazytime, которые добавлялись как временное изменение для оптимизации перевода util-linux на использование флага MS_LAZYTIME. Добавлена поддержка установки и чтения меток в ФС (ioctl FS_IOC_GETFSLABEL и FS_IOC_SETFSLABEL).
- NFSv4 добавлена поддержка работы в файловых системах без разделения регистров символов в именах файлов и каталогов. В NFSv4.1+ добавлена поддержка определения агрегированных сеансов (trunking).
Память и системные сервисы
- Добавлен драйвер amd-pstate, обеспечивающий динамическое управление частотой для достижения оптимальной производительности. Драйвер поддерживает CPU и APU AMD, включая некоторые чипы поколения Zen 2 и Zen 3, разработан совместно с компанией Valve и нацелен на оптимизацию эффективности управления энергопотреблением. Для адаптивного изменения частоты используется механизм CPPC (Collaborative Processor Performance Control), который позволяет более точно менять показатели (не ограничен тремя уровнями производительности) и более оперативно реагировать на изменение состояния, чем ранее используемые P-state драйверы на базе ACPI (CPUFreq).
- В подсистеме eBPF предложен обработчик bpf_loop(), предоставляющий альтернативный способ организации циклов в eBPF-программах, более быстрый и простой для проверки верификатором.
- На уровне ядра реализован механизм CO-RE (Compile Once - Run Everywhere), позволяющий собирать код eBPF-программ только один раз и использовать специальный универсальный загрузчик, адаптирующий загружаемую программу к текущему ядру и типам BTF (BPF Type Format). CO-RE решает проблему с переносмостью скомпилированных eBPF-программ, которые ранее могли использоваться только в той версии ядра, для которой были собраны, так как позиция элементов в структурах данных меняется от версии к версии.
- Предоставлена возможность назначения имён для областей приватной анонимной (выделенной через malloc) памяти, что может оптимизировать проведение отладки и оптимизации потребления памяти в приложениях. Имена присваиваются через prctl с флагом PR_SET_VMA_ANON_NAME и отображаются в /proc/pid/maps и /proc/pid/smaps в форме "anon:<name>".
- В планировщике задач обеспечено отслеживание и отображение в /proc/PID/sched времени, проведённого процессами в состоянии принудительного простоя (forced-idle), применяемого например, для снижения нагрузки при перегреве процессора.
- Добавлен модуль gpio-sim, предназначенный для симуляции чипов GPIO для проведения тестирования.
- В команду "perf ftrace" добавлена подкоманда "latency" для генерации гистограмм с информацией о задержках.
- Добавлен набор утилит "rtla" для анализа работы в режиме реального времени и выявления причин появления непредвиденных задержек. Инструментарий реализован на базе штатных механизмов трассировки ядра. В состав входят такие команды, как osnoise (определяет влияние операционной системы на выполнение задачи) и timerlat (изменяет задержки, связанные с таймером).
- Интегрирована вторая серия патчей с реализацией концепции фолиантов страниц памяти (page folios), которые напоминают объединённые страницы памяти (compound pages), но отличаются оптимизированной семантикой и более понятной организацией работы. Использование фолиантов позволяет ускорить управление памятью в некоторых подсистемах ядра. В предложенных патчах завершён перевод страничного кэша на использование фолиантов и добавлена начальная поддержка фолиантов в ФС XFS.
- Добавлен режим сборки "make mod2noconfig", при котором генерируется конфигурация, собирающая все отключённые подсистемы в форме модулей ядра.
- Подняты требования к версии LLVM/Clang, которую можно использовать для сборки ядра. Для сборки теперь требуется как минимум выпуск LLVM 11.
- Добавлена поддержка предложенного компанией Intel интерфейса PFRUT (Platform Firmware Runtime Update and Telemetry), позволяющего обновлять прошивки без перезагрузки системы и извлекать данные о работе прошивки.
Виртуализация и безопасность
- Предложена обновлённая реализация генератора псевдослучайных чисел RDRAND, отвечающего за работу устройств /dev/random и /dev/urandom, примечательная переходом на использование хеш-функции BLAKE2s вместо SHA1 для операций смешивания энтропии. Изменение позволило оптимизировать безопасность генератора псевдослучайных чисел, благодаря избавлению от проблемного алгоритма SHA1 и исключению перезаписи вектора инициализации RNG. Так как алгоритм BLAKE2s опережает SHA1 по производительности, то его применение также положительно отразилось на производительности.
- Добавлена защита от уязвимостей в процессорах, вызванных спекулятивным выполнением инструкций после операций безусловного прямого перехода. Проблема возникает из-за упреждающей обработки инструкций, следующих в памяти сразу за командой перехода (SLS, Straight Line Speculation). Для включения защиты требуется сборка с использованием выпуска GCC 12, находящегося на стадии тестирования.
- Добавлен механизм отслеживания подсчёта ссылок (refcount, reference-count), нацеленный на снижение числа ошибок при подсчёте ссылок, приводящих к обращению к памяти после её освобождения. Механизм пока ограничен сетевой подсистемой, но в будущем может быть адаптирован и для других частей ядра.
- Реализованы расширенные проверки записей в таблице страниц памяти, позволяющие выявлять нелегальные операции совместного доступа к страницам памяти разных процессов и блокировать на ранней стадии атаки, манипулирующие неверным подсчётом указателей. Из-за негативного влияния на производительность проверки отключены по умолчанию и для активации требуют сборки ядра с опцией "PAGE_TABLE_CHECK=y" и загрузки с параметром "page_table_check=on".
- Добавлена возможность распаковки модулей ядра непосредственно самим ядром, а не обработчиком в пространстве пользователя, что позволяет при помощи LSM-модуля LoadPin гарантировать, что модули ядра загружены в память из верифицированного устройства хранения.
- Обеспечена сборка с флагом "-Wcast-function-type", включающим вывод предупреждений о приведении указателей функций к несовместимому типу.
- Добавлен виртуальный хостовый драйвер pvUSB для гипервизора Xen, предоставляющий доступ к USB-устройствам, проброшенным в гостевые системы (позволяет из гостевых систем обращаться к физическим USB-устройствам, закреплённым за гостевой системой).
- Добавлен модуль, позволяющий через Wi-Fi взаимодействовать с подсистемой IME (Intel Management Engine), которая поставляется в большинстве современных материнских плат с процессорами Intel и реализована в виде отдельного микропроцессора, работающего независимо от CPU.
- Для архитектуры ARM64 реализована поддержка отладочного инструмента KCSAN (Kernel Concurrency Sanitizer), предназначенного для динамического выявления состояний гонки внутри ядра.
- Для 32-разрядных систем ARM добавлена возможность применения механизма KFENCE для выявления ошибок при работе с памятью.
- В гипервизоре KVM добавлена поддержка инструкций AMX (Advanced Matrix Extensions), реализованных в грядущих серверных процессорах Intel Xeon Scalable.
Сетевая подсистема
- Добавлена поддержка выноса (offloading) на сторону сетевых устройств операций, связанных с управлением трафиком.
- Добавлена возможность использования протокола MCTP (Management Component Transport Protocol) поверх устройств с последовательным интерфейсом. MCTP может использоваться для взаимодействия управляющих контроллеров и связанных с ними устройств (хост-процессоры, периферийные устройства и т.п.).
- Проведена оптимизация TCP-стека, например, для оптимизации производительности вызовов recvmsg реализовано отложенное освобождение буферов сокетов.
- На уровне полномочий CAP_NET_RAW разрешено выставление через функцию setsockopt режимов SO_PRIORITY и SO_MARK.
- Для IPv4 разрешено прикрепление raw-сокетов не к локальным IP-адресам, используя опции IP_FREEBIND и IP_TRANSPARENT.
- Добавлен sysctl arp_missed_max для настройки порогового числа сбоев при проверке ARP-
монитором, после которого сетевой интерфейс переводится в отключённое состояние.
- Предоставлена возможность настройки отдельных значений sysctl min_pmtu и mtu_expires для сетевых пространств имён.
- В API ethtool добавлена возможность установки и определения размера буферов входящих и исходящих пакетов.
- В Netfilter добавлена поддержка фильтрации транзитного pppoe-трафика в сетевом мосте.
- В модуль ksmbd с реализацией файлового сервера, использующего протокол SMB3, добавлена поддержка обмена ключами, задействован сетевой порт 445 для smbdirect и добавлена поддержка параметра "smb2 max credit".
Оборудование
- В подсистему drm (Direct Rendering Manager) и драйвер i915 добавлена поддержка экранов для вывода конфиденциальной информации, например, некоторые ноутбуки комплектуются экранами со встроенным режимом конфиденциального просмотра, затрудняющим просмотр со стороны. Добавленные изменения позволяют подключать специализированные драйверы для подобных экранов и управлять режимами конфиденциального просмотра через выставление свойств в обычных KMS-драйверах.
- В драйвере amdgpu включена поддержка отладочной технологии STB (Smart Trace Buffer) для всех поддерживающих её GPU AMD. STB оптимизирует анализ сбоев и выявление источника проблем через сохранение в специальном буфере информации о функциях, выполняемых перед последним сбоем.
- В драйвере i915 добавлена поддержка чипов Intel Raptor Lake S и включена по умолчанию поддержка графической подсистемы чипов Intel Alder Lake P. Для чипов Intel Ice Lake включена поддержка технологии Adaptive-Sync (VRR), позволяющей адаптивно менять частоту обновления монитора для обеспечения плавного вывода и отсутствия разрывов. Предоставлена возможность управления подсветкой экрана через DPCD-интерфейс VESA.
- В драйверах fbcon/fbdev возвращена поддержка аппаратного ускорения прокрутки в консоли.
- Продолжена интеграция изменений для поддержки чипов Apple M1. Реализована возможность использования драйвера simpledrm на системах с чипом Apple M1 для вывода через фреймбуфер, предоставляемый прошивкой.
- Добавлена поддержка ARM SoС, устройств и плат Snapdragon 7c, 845 и 888 (Sony Xperia XZ2 / XZ2C / XZ3, Xperia 1 III / 5 III, Samsung J5, Microsoft Surface Duo 2),Mediatek MT6589 (Fairphone FP1), Mediatek MT8183 (Acer Chromebook 314), Mediatek MT7986a/b (применяется в Wi-fi маршрутизаторах), Broadcom BCM4908 (Netgear RAXE500), Qualcomm SDX65, Samsung Exynos 7885, Renesas R-Car S4-8, TI J721s2, TI SPEAr320s, NXP i.MX8 ULP8, Aspeed AST2500/AST2600, Engicam i.Core STM32MP1, Allwinner Tanix TX6, Facebook Bletchley BMC, Goramo MultiLink, JOZ Access Point, Y Soft IOTA Crux/Crux+, t6000/t6001 MacBook Pro 14/16.
- Добавлена поддержка процессоров ARM Cortex-M55 и Cortex-M33.
- Добавлена поддержка устройств на базе CPU MIPS: Linksys WRT320N v1, Netgear R6300 v1, Netgear WN2500RP v1/v2.
- Добавлена поддержка SoC StarFive JH7100 на базе архитектуры RISC-V.
- Добавлен драйвер lenovo-yogabook-wmi для управления подсветкой клавиатуры и доступа к различным датчикам в Lenovo Yoga Book.
- Добавлен драйвер asus_wmi_sensors для доступа к датчикам, используемым на материнских платах Asus X370, X470, B450, B550 и X399 на базе процессоров AMD Ryzen.
- В драйвере iwlwifi для беспроводных карт Intel появилась поддержка модулей Intel Wi-Fi AX211, реализован режим сканирования OCE (Optimized Connectivity Experience), обеспечивающий получение расширенной информации о точках доступа, и решены проблемы со сканированием сетей в диапазоне 6GHz.
- Добавлен драйвер x86-android-tablets для планшетных ПК на базе архитектуры x86, поставляемых с платформой Android.
- Добавлена поддержка сенсорных экранов TrekStor SurfTab duo W1 и электронного пера для планшентов Chuwi Hi10 Plus и Pro.
- В драйверы для SoC Tegra 20/30 добавлена поддержка управления питанием и напряжением. Обеспечена возможность загрузки на старых 32-разрядных устройствах на базе SoC Tegra, таких как ASUS Prime TF201, Pad TF701T, Pad TF300T, Infinity TF700T, EeePad TF101 и Pad TF300TG.
- Добавлены драйверы для промышленных компьютеров Siemens.
- Добавлена поддержка LCD-панелей Sony Tulip Truly NT35521, Vivax TPC-9150, Innolux G070Y2-T02, BOE BF060Y8M-AJ0, JDI R63452, Novatek NT35950, Wanchanglong W552946ABA и Team Source Display TST043015CMHX.
- Добавлена поддержка звуковых систем и кодеков AMD Renoir ACP, Asahi Kasei Microdevices AKM4375, Intel systems using NAU8825/MAX98390, Mediatek MT8915, nVidia Tegra20 S/PDIF, Qualcomm ALC5682I-VS, Texas Instruments TLV320ADC3xxx. Решены проблемы с Tegra194 HD-audio. Добавлена поддержка HDA для кодеков CS35L41. Оптимизирована поддержка звуковых систем для ноутбуков Lenovo и HP, а также материнских плат Gigabyte[22].
Поддержка ОС Linux в Comindware Business Application Platform из-за ухода Microsoft
15 марта 2022 года компания Comindware, разработчик low-code платформы для автоматизации государственных и коммерческих организаций, сообщила, что будет поддерживать ОС семейства Linux. Таким образом компания стремится минимизировать риски клиентов, которые могут столкнуться с проблемой дальнейшего использования продуктов Microsoft. Подробнее здесь.
Исправление уязвимости Dirty Pipe, позволяющей перезаписывать данные в произвольных файлах
8 марта 2022 года стало известно, что исследователь кибербезопасности опубликовал подробности об уязвимости Linux, которая позволяет злоумышленнику перезаписывать данные в произвольных файлах, предназначенных только для чтения.
Уязвимость локального повышения привилегий Linux, получившая название Dirty Pipe, была обнаружена и раскрыта вместе с экспериментальным кодом эксплойта. Уязвимость CVE-2022-0847 появилась в версии ядра 5.8 и исправлена в версиях 5.16.11, 5.15.25 и 5.10.102.
Уязвимость была обнаружена Максом Келлерманном в апреле 2021 года, но ему потребовалось еще несколько месяцев, чтобы разобраться к чему она может привести.
Все началось год назад с обращения в службу поддержки по поводу поврежденных файлов. Клиент пожаловался на то что не может распаковать загруженные им журналы доступа. Как оказалось, на одном из серверов был поврежденный файл журнала, его можно было распаковать, но gzip сообщил об ошибке CRC. Исследователь не смог разобраться о причинах повреждения файла, и просто вручную исправил CRC файла, закрыл тикет и вскоре забыл о проблеме. Однако проблема возникала все снова и снова.
Каждый раз содержимое файла не было повреждено, только не совпадала контрольная сумма. Имея несколько поврежденных файлов, Келлерман смог копнуть глубже и обнаружил закономерность.
Келлерман подробно рассказал, как он обнаружил проблему и как ее можно было использовать. Изначально он считал, что уязвимость можно использовать только тогда, когда привилегированный процесс записывает файл.
Конечным результатом эксплуатации уязвимости, которую Келлерманн назвал Dirty Pipe, является возможность записи произвольных данных в целевой файл. Злоумышленник должен иметь права на чтение, а также есть некоторые другие ограничения. Но Келлерманн сказал, что использовать уязвимость несложно. Он опубликовал экспериментальный эксплойт, и другие исследователи также подтвердили простоту эксплойта.
20 февраля Келлерман представил подробности и исправление команде безопасности ядра Linux. Исправления были выпущены 23 февраля для Linux и 24 февраля для ядра Android.
Использование Dirty Pipe может позволить злоумышленникам получить контроль над системами и уничтожить или эксфильтровать конфиденциальные данные. Учитывая распространенность Linux в высокочувствительной инфраструктуре, уязвимость необходимо быстро устранить.[23]
Исправление уязвимости cgroups, которая позволяла злоумышленнику выйти за пределы контейнера
5 марта 2022 года появились подробности об уже исправленной серьезной уязвимости в ядре Linux, которая потенциально может быть использована для выхода из контейнера с целью выполнения произвольных команд на хосте контейнера.
Уязвимость CVE-2022-0492 обнаружена в функции ядра Linux cgroups, которая позволяет организовывать позволяет образовывать иерархические группы процессов с заданными ресурсными свойствами и обеспечивает программное управление ими.
Уязвимость была обнаружена в cgroup_release_agent_write ядра Linux в функции kernel/cgroup/cgroup-v1.c. При определенных обстоятельствах злоумышленник может использовать функцию cgroups v1 release_agent для повышения привилегий и обхода изоляции пространства имен.
![]() | Это одна из самых простых эскалаций привилегий Linux, обнаруженных за последнее время: ядро Linux по ошибке предоставило привилегированную операцию непривилегированным пользователям, — сказал исследователь Unit 42 Юваль Авраами. | ![]() |
Однако стоит отметить, что только процессы с привилегиями «root» могут записывать в файл, а это означает, что уязвимость позволяет исключительно root процессам повышать привилегии.
![]() | На первый взгляд уязвимость повышения привилегий, которую может использовать только root пользователь , может показаться странной, — пояснил Авраами. Запуск от имени root не обязательно означает полный контроль над машиной: существует серая зона между root пользователем и полными привилегиями, включая возможности, пространства имен и контейнеры. В этих сценариях, когда root процесс не имеет полного контроля над машиной, CVE-2022-0492 становится серьезной уязвимостью[24]. | ![]() |
Обнаружение уязвимости, наделяющей любого пользователя правами админа
В конце января 2022 года в Linux нашли серьезную уязвимость, наделяющую любого пользователя правами администратора. Проблема существует с момента появления операционной системы.
Как сообщает американская компания Qualys, специализирующаяся на информационной безопасности, уязвимость была выявлена во встроенной системе Polkit, которая позволяет распределять права пользователей на компьютерах под управлением любого крупного дистрибутива Linux. Содержащееся в одном из компонентов этой системы — pkexec — серьезное повреждение памяти дает возможность злоумышленникам с низким уровнем доступа повышать свои привилегии до суперпользователя, что открывает неограниченные возможности по работе с корпоративными ИТ-системами.
Проблема заключается в том, что разработчики неправильно реализовали разбор аргументов функции main(). В результате, упрощенно говоря, даже если pkexec запускается без параметров, код все равно обращается к массиву argv, выполняя в конечном счете как чтение, так и запись за пределами выделенного ему участка памяти.
Уже спустя всего несколько часов после публичного раскрытия уязвимости появились прототипы эксплойтов (программы для использования данной уязвимости), а дистрибутивы Linux приступили к производству обновлений безопасности.
Уязвимости присвоены идентификатор CVE-2021-4034 и имя PwnKit, опасность оценена в 7,8 балла из 10 возможных (высокий уровень).
Старший исследователь угроз кибербезопасности «Лаборатории Касперского» Борис Ларин сообщил «Коммерсанту», что уязвимость присутствует и в некоторых российских дистрибутивах Linux. По мнению руководителя центра мониторинга и реагирования на инциденты «Инфосистемы Джет» Алексея Мальнева, мишенью могут быть банки, промышленные предприятия и госсектор.[25]
2021
Атаки программ-вымогателей и криптоджекинга
18 февраля 2022 года компания VMware поделилась результатами исследования угроз вредоносного ПО на базе Linux Exposing Malware in Linux-Based Multi-Cloud Environments.
В числе главных выводов, в которых описаны сценарии использования вредоносных программ злоумышленников для атак на ОС Linux:
- Программы-вымогатели все чаще нацелены на серверы, используемые для развертывания рабочих нагрузок в виртуализированных средах;
- В 89% атак методом криптоджекинга используются библиотеки, связанные с криптомайнером XMRig;
- Более половины пользователей фреймворка Cobalt Strike могут быть киберпреступниками или, по крайней мере, использовать Cobalt Strike незаконно.
Подробнее здесь.
Рост атак
В 2021 г. активность вредоносного ПО для Linux выросла на 35% в сравнении с 2020 г. Это объясняется ростом популярности недорогих устройств интернета вещей с плохой защитой, которые хакеры ломают и объединяют в ботнеты. Активнее всего в 2021 г. они пользовались софтом семейств XorDDoS, Mirai и Mozi. Об этом стало известно 18 января 2022 года. Подробнее здесь.
Обнаружение уязвимостей в ядре и системном менеджере system
21 июля 2021 года стало известно о том что в ядре и системном менеджере (systemd) Linux найдены опасные уязвимости. Они позволяют вызвать крах системы и выполнить произвольный код.
Одна из уязвимостей затрагивает его ядро, а вторая – системный менеджер systemd. Их выявили специалисты по информационной безопасности компании Qualys.
Уязвимость, затрагивающая ядро Linux, получила идентификатор CVE-2021-33909. Если проэксплуатировать ее, то у пользователя появится возможность выполнить любой код с root-правами. Эксперты подчеркнули, проблема связана с неправильно обработкой длины имени файла.
Обнаружившие эту «дыру» специалисты Qualys смогли проэксплуатировать ее сразу в нескольких популярных дистрибутивах. Их затея увенчалась успехом в Debian 11, Fedora 34, Red Hat Enterprise Linux (RHEL) 6, 7 и 8. а также в Ubuntu версий 20.04, 20.10 и 21.04, то есть самых последних на момент публикации материала.
Эксперты отметили, что не проверяли работоспособность своих эксплойтов в других Linux-дистрибутивах. С их слов, они вполне могут заработать в любых других сборках Linux, так что группа риска не ограничивается лишь пользователями перечисленных ОС.
Специалисты Qualys приняли решение не публиковать полный код своих эксплойтов до тех пор, пока разработчики ядра и дистрибутивов не решат проблему с ней.
Пока что они выложили в свободный доступ прототип одного из своих эксплойтов. Запустить любой код с root-правами из-под учетки обычного пользователя при помощи него нельзя, а вот вызвать крах системы, наоборот, можно.
По утверждению представителей Qualys, данная проблема скоро отметит свое семилетие. Она присутствует в ядре Linux с 2014 г. Проэксплуатировать брешь можно даже в ядре версии 3.16, увидевшей свет в первых числах августа 2014 г.
Эксперты Qualys подготовили патч, устраняющий данную брешь в ядре Linux. 19 июля 2021 г. они скоординировали его с сообществом разработчиков, после чего он был принят в состав ядра.
На 21 июля 2021 года устраняющий «дыру» апдейт выпустили лишь разработчики дистрибутивов Arch, Debian, Fedora, RHEL, SUSE и Ubuntu. Когда то же сделают авторы других сборок, неизвестно.
В процессе создания и тестирования эксплойтов для CVE-2021-33909 экплойтов специалисты Qualys неожиданно обнаружили в Linux еще одну «дыру». Но на этот раз не в ядре. Уязвимость нашлась в системном менеджере systemd. Ее эксплуатация может вызвать переполнение памяти стека, что вызывает крах всей системы.
Данная брешь имеет идентификатор CVE-2021-33910, как и в случае CVE-2021-33909, существует далеко не первый год. Со слов специалистов, впервые она проявилась еще в systemd версии 220, вышедшей в апреле 2015 г. Примечательно, что в systemd версии 248 (март 2021 г.) проэксплуатировать эту уязвимость нельзя, но лишь по причине кривого кода менеджера. Другими словами, эксклойт не заработает из-за ошибки в коде, которую исправили в systemd 249 (июль 2021 г.).
На июль 2021 года systemd избавлен от CVE-2021-33910 в Arch, Debian, Fedora, RHEL, SUSE и Ubuntu[26].
Релиз ядра Linux 5.12
26 апреля 2021 года стало известно о том, что после двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.12. Эта версия не содержит каких-то глобальных изменений. Более радикальный патч ожидается в версии 5.13.
Среди наиболее заметных изменений: поддержка зонированных блочных устройств в Btrfs, возможность маппинга идентификаторов пользователей для ФС, чистка устаревших ARM-архитектур, режим "нетерпеливой" записи в NFS, механизм LOOKUP_CACHED для определения файловых путей из кэша, поддержка атомарных инструкций в BPF, отладочная система KFENCE для выявления ошибок при работе с памятью, работающий в отдельном потоке ядра режим NAPI poll-инга в сетевом стеке, гипервизор ACRN, возможность изменения на лету preempt-модели в планировщике задач и поддержка LTO-оптимизаций при сборке в Clang.
В целом в версию 5.12 принято 14170 (в прошлом выпуске 15480) исправлений от 1946 (1991) разработчиков, размер патча - 38 МБ (изменения затронули 12102 (12090) файлов, добавлено 538599 (868025) строк кода, удалено 333377 (261456) строк). Около 43% всех представленных в 5.12 изменений связаны с драйверами устройств, примерно 17% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 5% - с файловыми системами и 4% c внутренними подсистемами ядра.[27]
Исправление пяти уязвимостей, которые могут быть использованы для локального повышения привилегий
Александр Попов, эксперт по безопасности компании Positive Technologies, выявил и исправил пять похожих уязвимостей в виртуальных сокетах ядра Linux. Об этом PT сообщила 3 марта 2021 года.
Эти уязвимости могут быть использованы для локального повышения привилегий — Александр подтвердил возможность атаки на Fedora 33 Server. Уязвимости получили общий идентификатор CVE-2021-26708 и оценку 7,0 по шкале CVSS v3, что соответствует высокому уровню опасности.
К проблеме безопасности ядра привели ошибки типа «состояние гонки», которые были неявно внесены при добавлении поддержки нескольких транспортов для виртуальных сокетов. Эта функциональность появилась в ядре Linux версии 5.5 в ноябре 2019 года. Уязвимые драйверы (CONFIG_VSOCKETS и CONFIG_VIRTIO_VSOCKETS) поставляются как ядерные модули основными дистрибутивами GNU/Linux. Данные модули автоматически загружаются системой при создании сокета AF_VSOCK, и это действие доступно непривилегированному пользователю.
![]() | Мне удалось разработать прототип эксплойта, который выполняет локальное повышение привилегий на Fedora 33 Server и обходит защитные механизмы SMEP и SMAP платформы x86_64. Это исследование в дальнейшем позволит усовершенствовать средства защиты ядра Linux, — уточнил Александр Попов. | ![]() |
Александр подготовил исправления и выполнил ответственное разглашение уязвимостей. Патч уже принят в ванильное ядро Linux v5.11-rc7, а также применен в стабильных ветках, которые были подвержены CVE-2021-26708.
Обнаружить уязвимость в инфраструктуре можно с помощью системы управления уязвимостями MaxPatrol VM. Ранее Александр Попов выявил и исправил в ядре Linux уязвимости CVE-2019-18683 и CVE-2017-2636. .
2020
Уязвимость в ядре Linux подвергает опасности web-серверы и устройства на Android
Уязвимость в ядре Linux подвергает опасности web-серверы и устройства на Android. Об этом стало известно 26 декабря 2020 года.
Проблема позволяет отслеживать Linux- и Android-устройства даже в тех случаях, когда в браузере включен приватный режим или используется VPN.
Web-серверы на Linux и миллионы Android-устройств находятся в зоне риска в связи с уязвимостью в ядре Linux, которая затрагивает генератор псевдослучайных чисел и позволяет осуществлять межуровневые атаки благодаря тому, что алгоритмы генерации UDP, IPv6 и IPv4, работающие на некоторых Linux-системах, используют уязвимый ГПСЧ.
Как пояснил автор исследования ИБ-эксперт Амит Кляйн (Amit Klein), злоумышленник может определить внутреннее состояние ГПСЧ на одном OSI-уровне и использовать эти данные для прогнозирования случайного числового значения на другом OSI-уровне. Таким образом атакующий получает возможность выполнить атаку типа DNS cache poisoning (подмена DNS) на Linux-системах как локально, так и удаленно. Условие заключается в том, что DNS-сервер должен находиться за пределами сети.
Подмена DNS может использоваться для различных вредоносных действий, например, перехвата электронной почты и HTTP-трафика, обхода анти-спам механизмов и черных списков электронной почты, проведения локальной DoS-атаки, отслеживания клиента NTP и пр.
По словам специалиста, наиболее уязвимыми к данным атакам являются серверы на Ubuntu - порядка 13,4% web-серверов работают на Ubuntu, 3-5% серверов используют Ubuntu и публичную DNS-службу, удовлетворяя условиям для потенциальной атаки. Однако этот показатель может быть выше, полагает Кляйн, поскольку в зоне риска также находятся серверы, использующие внешние частные DNS-серверы (например, управляемые интернет-правайдерами).
Эксперт уведомил команду разработчиков Linux об уязвимости (CVE-2020-16166) в марте 2020 года. Проблема была устранена с выпуском патча, реализовывающего более надежный ГПСЧ, использующий SipHash (исправленные версии 5.10-rc1, 5.9.2, 5.4.78, 4.19.158, 4.14.207, 4.9.244 и 4.4.244). В Android проблема была исправлена в октябре, альтернативный метод защиты от данной атаки - использование прокси или Tor. Протокол DNS-over-HTTPS также блокирует подмену DNS, но не защищает от отслеживания[28].
Релиз ядра Linux 5.8
3 августа 2020 года глава команды разработчиков Linux Линус Торвальдс (Linus Torvalds) объявил о выпуске ядра Linux, получившего, по его словам, самое большое число нововведений за всю историю проекта. В обновленной версии девелоперы постарались внести изменения в как можно большее число составляющих ядра.
Как сообщалось, на нововведения в ядро Linux, связанные с поддержкой «железа», пришлось больше трети всех изменений, почти 40%. В частности, в него впервые в истории была добавлена поддержка российского процессора. «Первенцем» стал 28-нанометровый чип Baikal-T1 компании Baikal Electronics. Общее число изменений в коде ядра, имеющих отношение нему, превысило 40, и все они вошли сперва в предварительную сборку 5.8-rc2 (Release Candidate), вышедшую 22 июня 2020 г., чтобы затем появиться и в финальном релизе.
В составе Baikal-T1 есть два скалярных ядра P5600 MIPS 32 r5 на частоте 1,2 ГГц, 1 МБ кэш-памяти второго уровня, контроллеры PCIe Gen.3 х4 и оперативной памяти DDR3-1600 ECC, а также следующие интегрированные интерфейсы: один порт Ethernet 10Gb, 2 Ethernet 1Gb, два порта SATA 3.0 и один USB 2.0.
Процессор потребляет менее 5 Вт энергии и поставляется в корпусе HFCBGA-576 размерами 25х25 мм. Число контактных выводов – 576 с шагом 1 мм.
На работу над Linux 5.8 ушло около двух месяцев – премьера сборки 5.7 состоялась 31 мая 2020 г., а к работе над 5.8 команда разработчиков приступила в первых числах июня 2020 г. За этот период к внедрению принято свыше 17,6 тыс. исправлений, подготовленных командой из более чем 2080 разработчиков со всего мира.
Изменения были внесены приблизительно в 20% файлов, хранящихся в репозитории с кодом ядра, а это около 16,2 тыс. файлов. Из кода было удалено более 489,8 тыс. строк кода, но суммарное их число все равно увеличилось за счет добавления более 1,04 млн других строчек.
Итоговый размер патча 5.8 к ядру достиг 65 МБ (мегабайтов) против 39 МБ у версии 5.7, разработка которой тоже заняла около двух месяцев. Она содержала немногим более 15 тыс. модификаций кода. Планы на Linux 5.9 разработчики пока не раскрывают.
К ключевым изменениям относятся общий код ядра и архитектуры MIPS CPU P5600, конфиг сборки ядра специфичного для CPU MIPSr5, а также конфиг сборки ядра специфичного для CPU P5600. Помимо этого, в ядро была добавлена поддержка детектирования и расшифровки CM2 L2 ECC ошибок и MAAR-регистров в режиме XPA, доработан драйвер R4K clocksource для работы при включенном CPU-freq, интегрирована регистрация таймера в качестве sched_clock и др.
Вместе с Baikal T1 в Linux 5.8 появилась поддержка китайского MIPS- процессора Loongson-2K и заодно Android-смартфонов Xiaomi Redmi Note 7, вышедшего в январе 2019 г. и Samsung Galaxy S2 образца 2011 г. Также разработчики обучили ядро Linux корректной работе с сенсорами энергопотребления процессоров AMD на архитектурах Zen и Zen2 и датчиков температуры чипов AMD Ryzen поколения 4000 Renoir, дебютировавших в 2020 г.
В DRM-драйвер i915 для интегрированных видеоускорителей Intel была добавлена поддержка процессоров семейства Tiger Lake. В список нововведений также вошли драйверы для ARM-чипов Rockchip RK3326 и MediaTek MT6765, тогда как драйвер Qualcomm теперь работает с видеоядрами Adreno 405, 640 и 650.
Вместе с изменениями, относящимися к «железу», разработчики внесли в Linux 5.8 изменения, связанные с сетевым стеком. Их приблизительно 11% от общего числа, а еще 4% - это изменения во внутренних подсистемах ядра, и 3% связаны с поддержкой файловых систем.[29]
В основной ветке ядра Linux впервые появилась поддержка российского процессора
25 июня 2020 года стало известно о том, что в основной ветке ядра Linux впервые появилась поддержка российского процессора. Речь идёт об однокристальной системе BE-T1000 (Baikal-T). Подробнее здесь.
Сотрудник Huawei попытался внести уязвимости в основное ядро Linux
13 мая 2020 года TAdviser стало известно, что корпорация Huawei вновь оказалась в центре крупного скандала с конспирологическим душком: ее обвинили[30] в попытке саботажа безопасности ядра Linux.
10 мая 2020 года сотрудник Huawei представил на рассмотрение в рассылку разработчиков ядра Linux патч, который, согласно описанию, должен был усилить безопасность кода.
Подобная практика весьма распространена: крупные корпорации, использующие в работе ПО с открытым исходным кодом, довольно часто вносят в него какие-то исправления и усовершенствования и затем предоставляют доработанный код основному сообществу разработчиков. Программисты Google, Microsoft, Amazon в разное время предоставляли разработчикам ядра Linux свои дополнения и исправления - ко всеобщему удовлетворению.
Однако у Huawei крайне неоднозначная репутация. Компанию часто обвиняют в распространении ПО и аппаратных устройств с различными незадокументированными «закладками» и бэкдорами (а также промышленном шпионаже, недобросовестной рекламе и избыточно тесном сотрудничестве с правительством и спецслужбами Китая). В США ее продукцию запрещено использовать в правительственных учреждениях, Google в 2019 году прекратил сотрудничество с Huawei и лишил ее права использовать операционную систему Android. С Huawei также расстались компания ARM, так что фирме пришлось искать другого поставщика процессоров.
Репутация Huawei стала причиной, по которой патч к ядру Linux - Huawei Kernel Self Protection (Самозащита ядра от Huawei) немедленно привлек массу внимания. Изучив код, эксперты компании Grsecurity (которая также занимается разработками средств защиты ядра Linux) заявили, что в нем содержится серьезная уязвимость, которую очень легко эксплуатировать.
Это немедленно вызвало всплеск конспирологических спекуляций - и обвинений в том, что корпорация Huawei нарочно пыталась внедрить уязвимость, то есть, фактически, саботировать ядро Linux.
Разновидности этой операционной системы весьма широко распространены в корпоративных средах, и в том почти невероятном случае, если бы уязвимый патч прошел одобрение и был внедрен в основной код ядра, это открывало бы для тех, кто знал о существовании уязвимости самые широкие возможности для компрометации чужих систем.
В ответ на поднявшийся шум компания Huawei опубликовала заявление, в котором говорится, что Huawei Kernel Self Protection не является официальным проектом корпорации, хотя и носит ее название. Дескать, это частная разработка одного из экспертов по кибербезопасности Huawei, который даже не используется в продуктах фирмы.
![]() | Это только демонстрационный код, который частное лицо использовало для технических дискуссий в сообществе разработчиков ПО с открытым кодом Openwall, - говорится в заявлении Huawei. | ![]() |
Пояснение аналогичного содержания впоследствии опубликовал на GitHub[31] и сам разработчик уязвимого патча.
В том, что разработки программистов Huawei содержат уязвимости, нет ничего нового: компания постоянно поставляет программные и аппаратные разработки, полные уязвимостей, и весьма нечасто выпускает к ним патчи. Некоторые «баги» остаются неисправленными на протяжении нескольких лет.
![]() | Вероятность того, что сотрудник Huawei «по команде сверху» пытался сознательно скомпрометировать безопасность ядра Linux, стремится к нулю. Было бы слишком наивно ожидать, что уязвимый код, исходящий от компании с проблемной репутацией, не изучат «под микроскопом». Однако разработки Huawei, несмотря на свою популярность, и без того полны уязвимых мест и ошибок, так что в данном случае речь действительно, скорее всего, идет о квалификации отдельно взятого сотрудника этой фирмы, а не о преднамеренной попытке саботажа. считает Анастасия Мельникова, эксперт по информационной безопасности компании SEC Consult Services
| ![]() |
Публикация GRSecurity доступна по этой ссылке.
Релиз ядра Linux 5.5
27 января 2020 года стало известно, что Линус Торвальдс (Linus Torvalds) представил стабильный релиз ядра Linux версии 5.5. Исходный код Linux 5.5 уже доступен для загрузки. Представленная версия включает много изменений, в том числе поддержку нового оборудования, улучшения сетевой и дисковой подсистем, обновления функций безопасности, а также механизма применения патчей без перезагрузки системы.
Как отмечает портал Phoronix, скорее всего именно эта версия ядра Linux станет основой для будущего релиза Ubuntu 20.04 с расширенным жизненным циклом (LTS), которая выйдет в апреле 2020 года.
В числе наиболее значимых изменений портал Phoronix, в частности, отмечает поддержку графики чипов Intel семейств Tiger Lake и Jasper Lake, системы на кристалле Broadcom BCM2711, которая используется в одноплатном компьютере Raspberry Pi 4, а также ряда других ARM-чипов и плат. Добавлена начальная поддержка китайских MIPS-процессоров Loongson-3A.
Для архитектуры x86 по умолчанию используется пятиуровневая организация таблиц страниц памяти, что позволяет, по мнению CNews, существенно увеличить максимальный объем оперативной памяти, с которым может работать ядро.
В Linux 5.5 реализован механизм присвоения альтернативных имен сетевым интерфейсам, благодаря которому один интерфейс может иметь сразу несколько имен. Максимальная длина имени увеличена с 16 до 128 символов.
Для файловой системы Btrfs добавлена поддержка быстрых алгоритмов вычисления контрольных сумм xxhash64, blake2b и sha256. В реализации RAID1 поддерживается возможность зеркалирования данных сразу на три или четыре устройства вместо двух, как это было раньше. Режимы называются RAID1C3 и RAID1C4 соответственно.
Также у пользователей Linux появилась возможность «разгона» графических чипов AMD Navi и мониторинга температуры твердотельных NVMe-накопителей через sysfs.
Помимо прочего, усовершенствован механизм наложения патчей ядра без необходимости выполнять перезагрузку (Livepatching) – как правило, таким образом применяются исправления безопасности. В Linux 5.5 каждый последующая «заплатка» позволяет администратору убедиться в том, что ее наложение не вызовет конфликтов с изменениями, внесенными предыдущими патчами.
Внесены значительные изменения в работу системного планировщика задач по умолчанию – CFS. Алгоритм балансировки нагрузки подвергся переработке.
В рамках интеграции VPN Wireguard в Linux, которую планируется осуществить к релизу 5.6, в штатный Crypto API из криптографической библиотеки Zinc перенесен ряд функций.[32]
2019
Обновленная версия Ryuk не шифрует Unix-подобные системы
28 декабря 2019 года стало известно, что разработчики вымогательского ПО Ryuk выпустили обновленную версию программы, обходящую стороной папки, которые чаще всего встречаются в UNIX-подобных системах.
Как сообщает портал Bleeping Computer, в атаке на Новый Орлеан (Луизиана, США), имевшей место в декабре 2019 года, использовалась версия Ryuk с именем исполняемого файла v2.exe. Исследователь безопасности Виталий Кремез изучил его и обнаружил интересное изменение – вымогатель перестал шифровать папки, связанные с UNIX-подобными системами. В частности, в черный список папок, которые Ryuk теперь обходит стороной, попали bin, boot, Boot, dev, etc, lib, initrd, sbin, sys, vmlinuz, run и var.
Linux/Unix-версии Ryuk не существует, однако известны случаи, когда в результате атак с использованием вымогателя зашифрованными оказывались и папки Linux.
В Windows 10 существует функция WSL (подсистема Windows для Linux), позволяющая устанавливать дистрибутивы Linux непосредственно на Windows-машинах, и эти установки как раз используют перечисленные выше папки. Из-за роста популярности WSL в результате атак с использованием Ryuk все чаще оказывались зашифрованными и папки Linux. Когда вымогатель шифрует эти папки, установки Linux перестают работать.
Целью операторов вымогательского ПО является шифрование данных пользователей, а не выведение из строя операционной системы. Внеся папки Linux в черный список, операторы Ryuk избавили себя от дополнительной головной боли, связанной с восстановлением работоспособности системы после уплаты жертвой выкупа[33].
Шифровальщик PureLocker атакует корпоративные серверы под управлением Windows и Linux
18 ноября 2019 года стало известно, что эксперты компании Intzer и подразделения IBM X-Force IRIS team опубликовали анализ шифровальщика PureLocker, характеризующегося целым рядом нетипичных для программ подобного рода особенностей. Шифровальщик атакует прежде всего корпоративные серверы под управлением Windows и Linux. Подробнее здесь.
Уязвимость в системной утилите Sudo, позволяющая выполнять команды с уровнем прав Root
16 октября 2019 года стало известно, что серьёзная уязвимость в системной утилите Sudo, которая есть практически в каждой ОС на базе UNIX/Linux, позволяет обходить её политику безопасности и выполнять команды с уровнем прав Root непривилегированным пользователям, даже если настройки утилиты (Sudoers configuration) прямо это запрещают.
Утилита Sudo (Superusers do) предназначена для того, чтобы пользователи, работающие в среде UNIX/Linux с неадминистративным уровнем прав, могли запускать некоторые приложения или команды без переключения сред, то есть без перехода в административный режим.
В файле настроек /etc/sudoers по умолчанию для всех пользователей, входящих в группы администраторов и sudo, выставлено разрешение запускать любую команду в качестве любого пользователя; иными словами, даже если данный конкретный администратор в текущий момент работает из-под непривилегированной учётной записи, он всё равно может выполнять команды как администратор.
Поскольку жёсткое разделение полномочий - одна из основных парадигм безопасности в Linux, администраторы могут прописывать более конкретно, что может делать тот или иной пользователь и с какими правами, а чего он делать не может.
Однако, если у данного пользователя есть полномочия на запуск команд и приложений с любыми правами ниже рута, выявленная уязвимость в Sudo, тем не менее, позволяет ему обходить это ограничение и фактически делать всё, что может делать пользователь с root-полномочиями.
Например, если в файле /etc/sudoers заданы параметры «myhost bob = (ALL, !root) /user/bin/vi», то пользователь с идентификатором bob может запускать приложение Vi (текстовый редактор, по умолчанию включённый в большинство дистрибутивов Linux) с любыми правами, кроме root.
Однако если bob запускает Vi, используя команды вида «sudo -u#-1 id -u» или «sudo -u#4294867295 id -u», то у него появляется возможность запуска Vi с правами суперпользователя (рута).
Всё, что идёт после sudo - это присвоение нового идентификатора данному пользователю. Функция Sudo, отвечающая за конвертацию идентификатора в пользовательское имя, некорректно интерпретирует -1 или 4294867295 (это число является беззнаковым эквивалентом -1), как 0, а нулевой идентификатор - это обозначение рута.
По данным на октябрь 2019 года уязвимость, получившая индекс CVE-2019-14287, затрагивает все версии Sudo. Пользователям Linux рекомендуется обновить Sudo, отметили в CNews.
![]() | «Эксплуатация уязвимости едва ли угрожает большому количеству пользователей: слишком специфичными являются условия, при которых это возможно. С другой стороны, эта ситуация в очередной раз свидетельствует о том, что даже самые распространённые и часто используемые разработки с открытым кодом могут содержать очень серьёзные ошибки, чреватые компрометацией системы»[34], | ![]() |
Линус Торвальдс одобрил внедрение функции Lockdown («блокировка») в ядре Linux 5.4
4 октября 2019 года стало известно, что «отец» Linux Линус Торвальдс (Linus Torvalds) одобрил внедрение функции безопасности в ядро Linux, которая называется Lockdown («блокировка»). Она появится в версии ядра 5.4 в виде модуля безопасности LSM (Linux Security Module) и значительно ограничит права суперпользователя, сообщает ZDNet.
В UNIX-подобных операционных системах, к котором относится и Linux, суперпользователем называют учетную запись с именем root, владелец которой имеет право на выполнение любых операций без каких-либо ограничений. Аналогом root в ОС Windows является учетная записьадминистратора.
Lockdown позволит более жестко разграничить процессы, запущенные в пространстве пользователя, и код ядра, запретив взаимодействовать с ним даже привилегированным аккаунтам.
В Linux подчеркнули, что в конфигурации ядра по умолчанию данная функция будет отключена. Ее использование сделают опциональным, потому что разработчики опасаются нарушения работы существующих систем. По мнению разработчиков, такой подход повысит уровень устойчивости операционных систем на базе Linux к кибератакам.
Как отметили в Linux, злоумышленник, тем или иным способом заполучивший права суперпользователя в Linux-системе, может выполнить произвольный код на уровне ядра. Для этого ему нужно, к примеру, записать этот код непосредственно в память ядра через виртуальное устройство /dev/kmem или просто подменить запущенное ядро копией собственной сборки при помощи механизма kexec. В результате взломщик сможет получить доступ к конфиденциальным данным, хранящимся на уровне ядра, или обойти механизм безопасной загрузки UEFI Secureboot и скрыть факт своего присутствия в системе.
Активация модуля Lockdown заблокирует доступ пользовательских процессов к памяти ядра (через /dev/kmem, /dev/kmem и /dev/port), запретит выполнение системных вызовов, используемых для загрузки нового ядра (kexec_load, k_exec_file_load), ограничит возможности по манипуляции портами ввода/вывода, а также некоторые другие возможности.
Представленный модуль получит два режима блокировки: «целостность» (integrity) и «конфиденциальность» (confidentiality). Первый режим запрещает внесение изменений в работу запущенного ядра. Второй, помимо этого, не позволит считывать из него конфиденциальную информацию.
По словам Торвальдса, в случае необходимости разработчики смогут добавить собственные режимы работы системы защиты, однако это потребует применения отдельных патчей.[35]
Выпущено ПО для запуска Linux в виртуальной реальности
В конце июля 2019 года компания Collabora анонсировала программное обеспечение с открытым исходным кодом Xrdesktop, которое предназначено для запуска Linux в виртуальной реальности. Подробнее здесь.
Linux стала популярнее Windows Server у пользователей Azure
В конце июня 2019 года стало известно о том, что Linux стала более популярной операционной системой, чем Windows Server, среди пользователей Azure. Компания Microsoft осознаёт высокий спрос на Linux и стремится развивать соответствующие проекты. Подробнее здесь.
Релиз ядра Linux 5.0
4 марта 2019 года стало известно, что Линус Торвальдс (Linus Torvalds) представил обновление стабильной ветки ядра Linux с версии 4.20 до 5.0. Как отметил сам Торвальдс, изменение старшего числа в номере версии не является признаком грандиозных изменений, а всего лишь свидетельствует о накоплении большого числа выпусков в серии.
Релиз включает улучшения планировщика процессов, протокол шифрования данных Adiantum, поддержку технологии AMD Freesync в драйвере amdgpu, поддержку файловой системы BinderFS, множество разнообразных драйверов устройств, в том числе драйвер для сенсорных экранов одноплатного компьютера Raspberry Pi, и прочие улучшения.
В Linux 5.0 реализован режим работы планировщика задач для процессоров ARM на базе архитектуры big.LITTLE. Он позволяет снизить потребление энергии за счет выполнения задач в первую очередь на более энергоэффективных ядрах процессора. Данная возможность перенесена в основное ядро из варианта для мобильной ОС Android.
В ядро включен разработанный Google алгоритм шифрования файловых систем Adiantum для маломощных устройств. Google утверждает, что производительность процессорного ядра Cortex-A7 в шифровании и дешифровании с использованием Adiantum примерно в пять раз выше по сравнению с применением AES.
Видеодрайвер Intel получил поддержку чипов Amber Lake и форматов цветовой субдискретизации YCBCR 4:2:0 и YCBCR 4:4:4, а в свободном драйвере Nouveau для видеокарт Nvidia появилась базовая поддержка чипов Turing TU104 и TU106. Поддержка технологии Freesync, добавленная в свободный драйвер amdgpu для видеокарт Radeon, позволяет автоматически настраивать частоту обновления кадров на экране монитора для получения оптимального времени отклика, а также снижения энергопотребления системы благодаря уменьшению интенсивности обновления экрана при выводе статичного изображения.
В Linux 5.0 включена поддержка BinderFS – файловой системы для межпроцессного взаимодействия (IPC) – она позволяет запустить несколько экземпляров Android в одной среде.
Добавлена возможность размещения раздела подкачки в файлах внутри файловой системы btrfs, а ext4 и xfs получили ряд исправлений и были оптимизированы.
Также в представленной версии Linux появилась поддержка массивов NVM-памяти со встроенными операциями обеспечения безопасности, такими как защита данных паролем, очистка и блокировка.[36]
Утечка памяти ядра Linux от 754.el6 и старше
17 января 2019 года компания Carbon Soft сообщила, что инженеры Carbon Soft обнаружили проблемы с операционной системой CentOS Linux.
По информации компании, в декабре 2018 года несколько пользователей Carbon Reductor DPI вручную обновили ядро операционной системы CentOS, через несколько дней система мониторинга Carbon Soft обнаружила проблему с нехваткой оперативной памяти на серверах. После подключения инженеров, выяснили, что ядра система от 754.el6 имеют утечку памяти, в результате чего весь сервер перестаёт работать - у нескольких операторов связи перестала работать фильтрация по реестру запрещённых сайтов. Подробнее здесь.
2018
В обновленной версии Linux 4.19 принято 15214 исправлений от 1879 разработчиков
22 октября 2018 года стало известно, что после двух месяцев разработки Грег Кроа-Хартман представил релиз ядра Linux 4.19. Среди наиболее заметных изменений в ядре 4.19:
- файловая система EROFS,
- алгоритм управления сетевыми очередями CAKE,
- поддержка Wi-Fi 6 (802.11ax),
- дополнительная защита для sticky-каталогов,
- контроллер задержек при вводе/выводе,
- повышение минимальной версии GCC с 3.2 до 4.6.
В представленную версию принято 15214 исправлений от 1879 разработчиков, размер патча - 44 Мб (изменения затронули 11694 файлов, добавлено 552510 строк кода, удалено 244696 строк). Около 43% всех представленных в 4.19 изменений связаны с драйверами устройств, примерно 17% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 14% связано с сетевым стеком, 5% - файловыми системами и 3% c внутренними подсистемами ядра. 9.5% всех исправлений подготовлено разработчиками компании Intel, 7.1% - Red Hat, 4.9% - IBM, 4.1% - Linaro, 4.1% - Mellanox, 4.0% - Google, 4.0% - AMD, 3.6% - SUSE, 2.9% - Huawei, 2.0% - ARM, 1.7% - Oracle и 1.6% - Canonical.
Основные новшества:
Сетевая подсистема
- Добавлена поддержка алгоритма управления сетевыми очередями CAKE (Common Applications Kept Enhanced), разработанного в рамках проекта Bufferbloat и уже используемого дистрибутиве в OpenWrt. Алгоритм спроектирован для замены и упрощения сложной иерархии дисциплин обработки очередей пакетов c целью снижения негативного влияния промежуточной буферизации пакетов на граничном сетевом оборудовании. CAKE подходит для применения на домашних и офисных маршрутизаторах и способен выжать максимально возможную пропускную способность и предоставить минимальный уровень задержек даже на самых медленных каналах связи с провайдером и при работе на маломощных устройствах. При этом, CAKE заметно компактнее HTB, в процессе работы потребляет примерно на 30% меньше ресурсов CPU и позволяет добиться более однородного потока;
- Добавлена начальная поддержка стандарта беспроводных сетей Wi-Fi 6 (802.11ax). Wi-Fi 6 работает в диапазонах 2.4 и 5 ГГц, но позволяет привлечь дополнительные полосы в диапазонах между 1 и 7 ГГц и использует схему модуляции OFDMA (множественный доступ с ортогональным частотным разделением) и модуляцию 1024-QAM. Хотя номинальная интенсивность передачи данных 802.11ax лишь на 37% выше, чем IEEE 802.11ac, ожидается, что 802.11ax позволит увеличить пропускную способность до 4 раз за счёт более эффективного использования спектра. Уже продемонстрированные прототипы устройств позволили добиться пропускной способности до 11 Gbit/s;
- В сокеты добавлена опция SO_TXTIME, позволяющая запланировать отправку пакета точно в определённый промежуток времени. SO_TXTIME необходим для некоторых приложений реального времени, таких как системы автоматизации, которым необходимо отправлять данные строго в необходимые моменты времени, не раньше и не позже;
- Добавлена дисциплина обработки сетевых очередей "skbprio" (SKB Priority Queue), позволяющая планировать отправку пакетов на основании указанного для пакета приоритета. При нехватке ресурсов начинают отбрасываться пакеты с низким приоритетом, что позволяет применять "skbprio" как простой механизм для противодействия DoS-атакам;
- В реализации протокола TLS на уровне ядра (KTLS) расширена поддержка аппаратного ускорения операций с использовнием специализированных чипов. При наличии необходимого оборудования ускорение теперь включается и на стороне получателя;
- В nftables добавлена легковесная поддержка туннелей, позволяющая разбирать специфичные для туннелей метаданные, имеющиеся в пакетах. В том числе можно верифицировать принадлежность пакета к определённому туннелю на основе указанного идентификатора туннеля. Кроме того, в nftables появилась встроенная поддержка перенаправления в прозрачный прокси (TPROXY) и добавлен модуль для пассивного определения типа ОС;
- Добавлена дополнительная защита для каталогов с битом sticky (например, /tmp), который в общедоступных на запись каталогах допускает удаление файла только его владельцем или пользователем root. В данной версии ядра предложены две sysctl-настройки protected_fifos и protected_regular, которые дополнительно в sticky-каталогах запрещают открытие чужих FIFO-каналов или файлов с флагом O_CREAT (т.е. только владелец может пересоздать свои FIFO и файлы). Изменение основано на патче "HARDEN_FIFO", подготовленном проектом Openwall, и позволяет блокировать атаки, в которых злоумышленник создаёт в /tmp подставной fifo или файл, используемый другим процессом;
- Продолжена интеграция компонентов для противодействия уязвимостям категории Spectre в механизме спекулятивного выполнения инструкций CPU:
- Обеспечена защита от уязвимостей L1TF (L1 Terminal Fault) и SpectreRSB.
- Добавлена поддержка расширенных инструкций IBRS (Enhanced Indirect Branch Restricted Speculation), которые появятся в будущих моделях CPU Intel и позволяют адаптивно разрешать и запрещать спекулятивное выполнение инструкций во время обработки прерываний, системных вызовов и переключений контекста. При наличии поддержки Enhanced IBRS данный метод будет применяться по умолчанию для защиты от атаки Spectre V2 вместо Retpoline, так как позволяет добиться более высокой производительности.
- Для архитектуры x86-32 адаптирован механизм защиты KPTI (Kernel Page Table Isolation), обеспечивающий блокирование уязвимости Meltdown (ранее KPTI был доступен только для 64-разрядных систем).
- В гипервизоре KVM проведена оптимизация производительности механизма теневых страниц (shadow paging) при использовании в ядре гостевой системы патчей KPTI.
- Для систем на базе CPU POWERPC добавлена защита от атак Spectre v2 через сброс счётчика кэша в процессе переключения контекста;
- Проведена чистка блоков кода, потенциально подходящих для использования в атаках Spectre,на которые указывали предупреждения компилятора.
- Реализован механизм для определения правил проверки компонентов ядра по цифровой подписи, который позволяет включить выборочную или полную проверку по цифровой подписи образов ядра, прошивок и модулей ядра;
- Добавлена сборочная опция RANDOM_TRUST_CPU, позволяющая на начальном этапе загрузки провести инициализацию пула энтропии для генератора псевдослучайных чисел полностью на основе данных из аппаратного генератора (RDRAND). Опция позволяет получить более качественные случайные числа в процессе загрузки, но ценой излишнего доверия к генератору, встроенному в CPU;
Дисковая подсистема, ввод/вывод и файловые системы
- В состав включена экспериментальная файловая система EROFS (Extendable Read-Only File System), разработанная компанией Huawei для использования на разделах, доступных в режиме только для чтения. Структура EROFS существенно упрощена за счёт отбрасывания при реализации некоторых областей метаданных, таких как битовая карта свободных блоков. EROFS поддерживает хранение данных в сжатом виде, но использует иной подход для хранения сжатых блоков, оптимизированный для достижения высокой производительности при случайном доступе к данным.
- Снижено потребление памяти в многослойной файловой системе Overlayfs. При изменении метаданных исходного файла, файловая система также создаёт копию кэша содержимого файла для всех вышележащих слоёв. Подобное поведение приводит к существенному увеличению потребления памяти при выполнении некоторых операций, например, при рекурсивном вызове chown для всего дерева ФС. В представленной версии ядра появилась возможность отложить копирование данных при обновлении метаданных для файлов в самом нижнем слое. Ядро выполнит копирование только метаданных, но продолжит использование данных из нижнего слоя ФС до тех пор, пока файл не будет открыт на запись. Таким образом после включения оптимизации вызов chown для всего дерева ФС теперь не приведёт к копированию всех файловых данных и контейнеры, в которых используется многослойная ФС, продолжат использование общего кэша страниц памяти. В Overlayfs также корректно реализованы некоторые файловые операции и данная ФС может работать как POSIX-совместимая ФС при включении флагов "redirect_dir=on" и "index=on";
- В файловой системе BTRFS разрешено выполнение операции дефрагментации (defrag) на лету для файлов, открытых в режиме только для чтения, даже если их права доступа допускают запись. В код проверки дерева ФС добавлена поддержка верификации групп блоков (block_group_item) и обнаружения недействительных и пустых основных деревьев. Удалена поддержка экстента V0;
- В файловой системе XFS удалена поддержка устаревших опций монтирования barrier/nobarrier;
- В EXT4 в поля суперблока добавлена поддержка 64-разрядных счётчиков времени, что позволит решить проблему с переполнением 32-разрядного счётчика в 2038 году;
- В NFS добавлена поддержка асинхронного выполнения операций COPY на стороне сервера;
- В модуль dm-integrity, который позволяет сохранять информацию для контроля целостности данных на уровне отдельных секторов, добавлена поддержка выноса метаданных с информацией о целостности на отдельное блочное устройство. Устройство для метаданных задаётся при помощи опции "meta_device:/dev/device";
Память и системные сервисы
- Для cgroup реализован контроллер задержек при вводе/выводе blk-iolatency (Block I/O latency controller), позволяющий гарантировать минимальный уровень задержек для ввода/вывода заданной группы задач. Пока выставленные требования к задержкам удовлетворяются, контроллер никак не проявляет себя. Как только в группе начинают всплывать превышения задержек, относительно целевых значений, контроллер попытается удержать средний уровень задержек в соответствии с заданными лимитами, урезая группы с более высокими значениями лимитов. Настройка лимитов производится через cgroup-файл io.latency;
- Добавлен API поллинга (определение готовности файлового дескриптора к вводу/выводу без блокировки), основанный на использовании системы асинхронного ввода/вывода (AIO);
- Для процессоров Intel добавлена возможность установки псевдо-блокировок на кэш (Cache Pseudo-Locking). Процессоры Intel с поддержкой механизма CAT (Cache Allocation Technology) позволяют пользователю определить определённый объём кэша, после чего изолировать данную область кэша CPU и привязать к ней блокировку. Выделенный блок кэша с блокировкой становится доступен для пространства пользователя и может быть отражён приложением в виртуальное адресное пространство, что позволяет получить эксклюзивно прокэшированную область со сниженными задержками на чтение;
- Повышены требования к версии GCC. В качестве минимального выпуска необходимого для сборки ядра отмечена ветка 4.6 (ранее в качестве минимального выпуска заявлялся GCC 3.2). Изменение обусловлено наличием проблем при сборке старыми версиями GCC ядра для некоторых архитектур.
Оборудование
- В драйвере amdgpu реализован режим энергосбережения stutter, позволяющий снизить потребление энергии в условиях низкой нагрузки на DRAM, которая наблюдается при решении таких задач как работа в офисном пакете, навигация через браузер или просмотр видео. Добавлена поддержка движка VCN (Video Core Next) для обработки JPEG. В sysfs добавлена переменная для оценки нагрузки на GPU. Добавлена поддержка режима YCbCr 4:2:0 для DisplayPort. Добавлены идентификаторы устройств Polaris;
- В драйвере amdkfd для dGPU (дискретные GPU, такие как Fiji, Tonga, Polaris) добавлена поддержка GPU Raven;
- В DRM-драйвере Intel добавлена начальная поддержка платформ Whiskey Lake и Amber Lake. Для чипов Icelake добавлена поддержка DSI и включены средства управления питанием;
- В драйвере Nouveau отмечаются только исправления.
- В драйвер Freedreno добавлена поддержка GPU Qualcomm Adreno A6xx;
- Добавлен KMS-драйвер VKMS (Virtual Kernel Mode-Setting), симулирующий простейшее виртуальное устройство вывода. Драйвер может применяться для тестирования или для организации работы X-сервера или другой графической подсистемы на компьютерах без монитора (headless), предоставляя при этом возможность использования имеющегося GPU[37];
Linux стала самой популярной ОС в Azure
В конце сентября 2018 года Microsoft сообщила о том, что Linux стала самой популярной операционной системой в инфраструктуре Azure. Подробнее здесь.
Релиз ядра Linux 4.17
4 июня 2018 года после двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 4.17.
Среди наиболее заметных изменений в ядре 4.17: удаление 8 устаревших процессорных архитектур, добавление в XFS опции lazytime, полная реализация протокола TLS на стороне ядра, защита от уязвимостей Spectre 3a/4, оптимизация планировщика задач для мобильных и встраиваемых систем, снижение энергопотребления в состоянии простоя, поддержка архитектуры Andes Technologies NDS32, поддержка GPU AMD Vega12 и Intel Cannonlake, реализация алгоритмов блочного шифрования SM4 и Speck, стабилизация протокола SMB 3.1.1, поддержка SELinux в SCTP.
В версию Linux 4.17 принято 14.7 тысяч исправлений от 1400 разработчиков, размер патча - 70 Мб (изменения затронули 14170 файлов, добавлено 648108 строк кода, удалено 827247 строк). Около 38% всех представленных в 4.17 изменений связаны с драйверами устройств, примерно 22% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 11% связано с сетевым стеком, 4% - файловыми системами и 4% c внутренними подсистемами ядра.
Основные изменения:
- Виртуализация и безопасность
- Доведена до полноценного состояния реализация протокола TLS на уровне ядра (KTLS), использование которой позволяет добиться существенного повышения производительности приложений, использующих HTTPS. Реализация выполнена в виде модуля ядра, предоставляющего тип сокетов AF_KTLS, которые можно использовать для передачи данных по протоколам TLS 1.2 для TCP и DTLS 1.2 для UDP с применением шифра AES GCM. Добавленный ранее вариант модуля KTLS ограничивался поддержкой передающей стороны, но в версии 4.17 в ядро включены и компоненты для согласования соединения на стороне получателя, т.е. в ядре имеются все компоненты для полноценной поддержки TLS;
- Добавлен код для защиты от уязвимостей Spectre 3a и Spectre 4 в механизме спекулятивного выполнения инструкций CPU (нераскрытыми остаются ещё 6 проблем из группы Spectre-NG). Кроме включения исправлений на стороне ядра для обеспечения защиты также обязательно требуется обновление микрокода - защита строится на применении MSR-бита SSBD (Speculative Store Bypass Disable). По предварительной оценке включение защиты приводит к снижению производительности на 2-8%. Так как применение защиты от Spectre 4 не всегда оправдано, для её отключения предусмотрена опция speculative_store_bypass_disable, в SECCOMP добавлен специальный флаг и код для автоматического отключения SSB для изолированных процессов, а для приложений предложен интерфейс prctl, при помощи которого программы могут определять наличие защиты и выборочно отключать её для отдельных процессов;
- В ядро встроена поддержка блочного шифра Speck, разработанного Агентством национальной безопасности США. Шифр примечателен высокой производительностью программной реализации, которая обгоняет AES на системах без наличия средств аппаратного ускорения AES;
- Добавлена поддержка шифрования AES в режиме CFM (Cipher Feedback Mode), наличие которого определено в спецификации TPM2 (Trusted Platform Module);
- Реализована поддержка алгоритма блочного шифрования SM4 (GB/T 32907-2016), стандартизированного для учреждений Китая и применяемого в китайском стандарте Wireless LAN WAPI;
- В протоколе SCTP обеспечена полноценная поддержка SELinux;
- Добавлена возможность управления модулями AppArmor через сокет;
- Дисковая подсистема, ввод/вывод и файловые системы
- Для файловой системы XFS реализована поддержка опции монтирования lazytime, которая даёт возможность отследить время обращения к файлам, но не приводит к возникновению большого числа паразитных операций записи в ФС. Основное отличие от "atime" состоит в том, что время доступа сохраняется в inode, хранящихся в оперативной памяти, и сбрасываемых на диск только при возникновении явных условий или истечения достаточно длительного таймаута (раз в 24 часа). Таким образом для работающих программ возвращается всегда точный atime, но на диске сведения сохраняются с большой задержкой;
- В файловой системе ext4 повышена надёжность работы в условиях обработки некорректных образов ФС, специально модифицированных для вредоносных целей. При этом мэйнтейнер Ext4 по-прежнему считает плохой идеей предоставление доступа к монтированию произвольных ext4-образов из изолированных контейнеров;
- В файловой системе Btrfs добавлена опция монтирования nossd_spread, отключающая режим оптимизации ssd_spread, при котором при размещении данных осуществляется поиск наибольшей неиспользуемой области на SSD-накопителе. Проведена работа по ускорению операции перестроения массива в режимах RAID5/RAID6. Удалены операции ioctl() с реализацией функциональности управляемых транзакций, которая оказалась невостребованной и не примется на практике;
- С реализации SMB 3.1.1 снят признак экспериментальной разработки. В CIFS добавлена поддержка представленной в спецификации SMB 3.1.1 возможности обеспечения целостности на стадии до прохождения аутентификации. Метод основан на использовании криптографических хэшей на этапе согласования сеанса связи и позволяет защититься от MITM-атак с подменой сообщений для отката на менее защищённые схемы аутентификации;
- В файловой системе F2FS добавлена поддержка помещения в каталог lost+found файлов, потерянных в результате сбоя, но выявленных утилитой fsck. Добавлена опция монтирования fsync_mode, позволяющая выбрать метод вызова fsync для сброса данных на накопитель (поддерживается два режима - posix и strict). Проведена оптимизация производительности для маломощных устройств;
- В файловой системе OverlayFS появилась опция монтирования "xino", обеспечивающая сохранения идентификатора ФС в составе номера inode, что позволяет зафиксировать имена inode и гарантировать, что они не будут меняться во времени. Предложенная опция предотвращает появление в разное время разных номеров inode для одного файла, что может приводить к проблемам в приложениях, манипулирующих данными на уровне inode;
- Память и системные сервисы
- Для более оптимальной работы в условиях нагрузок, свойственных для мобильных и встраиваемых систем, доработан код оценки нагрузки в планировщике задач, прогнозирующий сколько ресурсов CPU может израсходовать каждый работающий процесс для оптимизации выбора режимов работы CPU и распределения процессов по ядрам CPU;
- В системный вызов bpf() добавлена команда BPF_RAW_TRACEPOINT, позволяющая привязать BPF-обработчик к точке трассировки (tracepoint - вариант динамических printf(), выставляемых разработчиками программ для анализа поведения системы, к которым затем можно обращаться из LTTng, perf, SystemTap, ftrace). Работа осуществляется без предварительной обработки аргументов tracepoint на стадии до вызова BPF-программы, что позволяет минимизировать накладные расходы при трассировке, но усложняет написание BPF-программы;
- Переработан код для обработки состояний простоя процессора (idle loop), в котором сокращено число краткосрочных переходов на неглубокие уровни экономии энергии. Перевод процессора в состояние idle осуществляется только если планировщик прогнозирует нахождение в данном состоянии достаточно долгое время. В проведённых разработчиками тестах в состоянии простоя потребление энергии после внесения изменений снизилось на 10% и больше. Кроме того возросла производительность некоторых видов нагрузки, на которые негативно влиял переход в idle-режим;
- Проведена чистка кода подсистемы CPUFreq;
- В команде "perf script" добавлена поддержка скриптов на языке Python 3. В систему трассировки добавлен режим "histogram trigger", обеспечивающий формирование вывода данных трассировки в виде наглядных гистограмм;
- Для сборки ядра на системах x86 теперь необходим компилятор с поддержкой специфичного для GCC выражения "asm goto", которое присутствует начиная с GCC 4.5, но пока не поддерживается в Clang. Кроме того, сборка модулей lexer и parser теперь производится в рамках общего сборочного процесса и требует наличия flex и bison (раньше данные модули поставлялись в репозитории в готовом виде);
- Проведена массивная чистка кода от прямого обращения к реализациям системных вызовов внутри ядра. Чистка проведена с целью повышения гибкости интерфейса системных вызовов и упрощения дальнейшей работы по удалению вызовов set_fs(). Изменён и унифицирован механизм обращения к системным вызовам на оборудовании с архитектурой x86-64. Схема обращения к системным вызовам обеспечивает защиту от попадания в обработчик системного вызова неиспользуемых, но контролируемых атакующим, данных;
- В состав принята подсистема LKMM (Linux Kernel Memory Consistency Model), включающая набор утилит (размещены в каталоге tools/memory-model/) для формального описания модели связи разных областей памяти ядра. Инструментарий даёт возможность генерировать модули ядра с тестовыми проверками, позволяющими тестировать различные методы работы ядра с памятью и выявлять проблемы связанные с организацией работы блокировок при попытках одновременного доступа к памяти;
- Поведение таймера CLOCK_MONOTONIC приведено в соответствие с таймером CLOCK_BOOTTIME, т.е. таймер теперь учитывает время проведённое системой в спящем режиме без формирования разрыва. Потенциально унификация CLOCK_MONOTONIC и CLOCK_BOOTTIME может привести к нарушению поведения приложений, но проблемы, возникающие из-за пропуска времени, проведённого в спящем режиме, явно перевешивают. Для тех приложений которым действительно нужно учитывать только время в активном состоянии предложен таймер CLOCK_MONOTONIC_ACTIVE;
- Представлена ioctl-команда INOTIFY_IOC_SETNEXTWD, позволяющая задать номер дескриптора, который должен быть возвращён при создании следующего дескриптора (используется при заморозке состояния системы при выполнении checkpoint/restart);
- В системный вызов mmap() добавлена опция MAP_FIXED_NOREPLACE, которая пытается разместить новый регион памяти по адресу, заданному пользователем, но в отличие от MAP_FIXED без замены уже существующего маппинга по данному адресу (при пересечении будет выдана ошибка EEXIST);
- Сетевая подсистема
- Протокол RDS (Reliable Datagram Sockets), позволяющий создавать сокеты для надёжной передачи датаграмм поверх TCP-линков, расширен поддержкой режима zero-copy, позволяющего передавать данные без промежуточной буферизации;
- Реализована возможность применения BPF-скриптов для фильтрации трафика, отправленного через системные вызовы sendmsg() и sendfile();
- В системные вызовы bind() и connect() добавлен набор специфичных для cgroups точек подключения BPF-обработчиков. Присоединённые BPF-скрипты могут изменять поведение работы данных системных вызовов;
- С нарушением обратной совместимости изменено 32-разрядное ABI для RDMA. Решение о нарушении совместимости принято так как данный режим пока не используется в реальных приложениях;
- Поддержка архитектур
- Проведена одна из крупнейших чисток кодовой базы от устаревшего кода (удалено 467 тысяч строк кода), в ходе которой удалена поддержка архитектур blackfin, cris, frv, m32r, metag, mn10300, score и tile, а также специфичные для данных архитектур драйверы. Прошивки для ранее выпущенных чипов остаются на старых версиях ядра Linux и давно не обновлялись до новых веток;
- Добавлена поддержка архитектуры CPU NDS32, развиваемой компанией Andes Technologies, и реализованных на её основе процессорных ядер N13, N15, D15, N10 и D10. NDS32 продолжает развитие 16/32-разрядной RISC-подобной архитектуры AndeStar и воплощена в серии настраиваемых процессоров AndesCore, которые охватывают широкий диапазон применения во встраиваемой технике, от компактных решений для микроконтроллеров и DSP до специализированных процессоров для ускорения определённых приложений и высокопроизводительных (1GHz+) систем общего назначения с возможностью запуска Linux;
- Добавлена поддержка появившегося в процессорах SPARC M7 механизма обеспечения целостности данных приложения (ADI, Application Data Integrity). Данная возможность позволяет приложению установить метки на адреса виртуальной памяти (метки представляют собой четырёхбитовые значения, прикреплённые к адресу). В случае последующего обращения к указанной области по адресу без метки будет сгенерировано исключение;
- Для архитектуры ARM реализована поддержка интерфейса SCMI (System Control and Management Interface), представляющего набор возможностей для управления системой и питанием;
- Для 64-разрядных систем PowerPC реализована возможность адресации до 4 ПБ ОЗУ;
- Прекращена поддержка процессоров POWER4, код для которых находился в неработоспособном виде с 2016 года;
- Оборудование
- В DRM-драйвер AMD GPU добавлена полноценная поддержка GPU AMD Vega12. Для всех поддерживаемых GPU включена по умолчанию прослойка AMD DC (Display Core) с реализацией переработанного кода для управления отображением и поддержкой таких возможностей, как вывод звука через HDMI и DisplayPort, HDMI 2.0 и атомарное переключение видеорежимов. Проведена реструктуризация кода для использования технологии Powerplay. Прекращена поддержка менеджера управления видеопамятью TTM. Добавлены средства для контроля за энергопотреблением в стиле Radeon WattMan (позволяет управлять вольтажом, частотой движка и памяти, скоростью вращения кулера, получать сведения о температуре);
- В драйвере amdkfd для dGPU (дискретные GPU, такие как Fiji, Tonga, Polaris) добавлена поддержка GPUVM и обработки событий KFD, что позволяет запустить поверх ядра стек OpenCL без применения сторонних модулей;
- В DRM-драйвере Intel включен по умолчанию код для поддержки чипов Cannonlake (Gen 10). Добавлена поддержка технологии защиты HDCP (High-bandwidth Digital Content Protection) для шифрования видеосигнала, передаваемого через интерфейсы DVI, DisplayPort, HDMI, GVIF или UDI, с целью улучшения совместимости с существующим оборудованием (спецификация требует применения HDCP при передаче потоков звука в формате TrueHD). Добавлена поддержка портов AUX-F. Предоставлена возможность использования сжатого фреймбуфера для спрайтов. Реализован интерфейс Query uAPI. Обеспечено урезание кэша kmem во время простоя GPU;
- В драйвер Nouveau внесены только мелкие правки, более заметные исправления отложены до следующего выпуска из-за наличия нерешённых проблем;
- Добавлена поддержка панелей ARM Versatile, AUO G104SN02 V2, KEO TX31D200VM0BAA и Raydium RM68200 720x1280 DSI, HDMI-ресиверов NXP TDA1997x и SoundGraph iMON, тюнеров Sony CXD2880 DVB-T2/T;
- Добавлен драйвер для гигабитных ethernet-адаптеров Microchip LAN743x;
- Добавлена поддержка защищённых процессоров ARM TrustZone CryptoCell и аппаратных генераторов случайных чисел TI Keystone NETCP SA;
- Добавлена поддержка устройств вывода звука с интерфейсом USB, соответствующих спецификации USB Audio Class 3.0;
- Добавлена поддержка SoC Allwinner H6, ST STM32MPU, Nvidia Tegra Tegra194 ("Xavier"), Nvidia P2972. Добавлена поддержка плат Libre Computer Card ROC-RK3328-CC, Orange Pi Zero+, Teres-I, Olimex som204, Banana Pi M2 Zero, а также плат на базе Nuvoton NPCM и смартфонов Samsung Galaxy S3 и Galaxy S5 на базе SoC Exynos4 и MSM8974.
Одновременно Латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 4.17 - Linux-libre 4.17-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В данном выпуске прекращена чистка блобов для чипа обработки звука Dreamcast Yamaha AICA, прошивка для которого переведена в разряд СПО. Также прекращена чистка кода USB IrDA из-за удаления данной подсистемы из ядра. Проведена реорганизация кода загрузчика прошивок и скрипта builddeb. Обновлён код чистки блобов в драйверах i915, amdgpu, coda, s5p-mfc, wl1251 и brcmfmac.[38]
2017
Обнаружена уязвимость
27 сентября 2017 года стало известно о выявлении уязвимости (CVE-2017-1000253) в реализации метода загрузки исполняемых файлов ELF в ядре Linux. Она позволяет добиться получения root-полномочий в системе. Уязвимость обнаружила компания Qualys.
Суть уязвимости в том, что исполняемый файл приложения, скомпилированного в режиме PIE (Position Independent Executable), может загружаться так, что часть информации из сегмента данных отразится на области памяти, выделенной под стек. Т.е. через манипуляции с неисполняемыми данными можно переписать часть содержимого стека. Атакующий может воспользоваться этой проблемой для повышения своих привилегий через манипуляции с находящимися в системе исполняемыми файлами с флагом SUID, собранными в режиме PIE[39].
Эксплуатация сводится к передаче в качестве аргумента в execve() строки, размером около 1.5 Гб, в результате чего PIE отражается в область памяти непосредственно ниже стека и становится применим метод атаки Stack Сlash. Вероятность такой раскладки оценивается в 1 из 17331, что позволяет добиться успешного стечения обстоятельств в среднем за пять часов, при интенсивности пробных запусков раз в секунду. Код для атаки очень близок к эксплоиту Linux_ldso_dynamic.c, опубликованному при анонсе Stack Сlash. При помощи вызова строковых операций, использующих стек, достигается пересечение со стеком PIE секции ".dynamic", после чего в ld.so инициируется загрузка собственной разделяемой библиотеки.
В ядре Linux проблема исправлена в апреле 2015 года без акцентирования на связь исправления с проблемами безопасности. Поэтому в LTS-ядра и пакеты с ядром некоторых дистрибутивов данное исправление не было перенесено. Уязвимости оказались подвержены все ветки RHEL/CentOS, но обновления уже включены в RHEL 7.4 и CentOS 1708, выпущены для прошлых веток RHEL 5.x, 6.x и 7.x.
Проблема устранена в Debian. В SUSE Linux Enterprise 12 GA, SP1, SP2 и SP3 проблема не проявляется. Подверженность уязвимости Ubuntu и ветки SUSE Linux Enterprise 11 уточняется. В качестве обходного пути блокирования уязвимости можно установить "sysctl vm.legacy_va_layout=1" для активации устаревшей раскладки mmap.
Вышел релиз 4.13
4 сентября 2017 года Линус Торвальдс представил релиз ядра Linux 4.13.
Среди заметных изменений:
- встроенная реализация протокола TLS,
- плагин для рандомизации порядка полей в структурах данных,
- функциональность "lifetime hints" в VFS,
- поддержка буферизованного ввода/вывода в неблокирующем режиме,
- модуль для зонированных блочных устройств,
- расширение лимита на число файлов в директории ext4,
- поддержка привязки BPF-программ к сокетам,
- средства оптимизации энергопотребления через прогнозирование следующего прерывания.
В версию принято более 14 тысяч исправлений от 1400 разработчиков, размер патча - 68 Мб (изменения затронули 10647 файлов, добавлено 824508 строк кода, удалено 228197 строк). Около 45% всех представленных в 4.13 изменений связаны с драйверами устройств, примерно 18% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 15% связано с сетевым стеком, 4% - файловыми системами и 3% c внутренними подсистемами ядра[40].
Основные изменения
- Дисковая подсистема, ввод/вывод и файловые системы
- В виртуальную файловую систему и уровень блочных устройств добавлены признаки со сведениями о времени жизни данных ("lifetime hints"), которые могут быть привязаны к открытому файлу при помощи системного вызова fcntl(). Например, признак RWH_WRITE_LIFE_SHORT сигнализирует, что данные предназначены для хранения короткое время, а признак RWH_WRITE_LIFE_EXTREME указывает на то, что данные останутся навсегда. Устройство хранения может использовать данные признаки для оптимизации размещения данных с учётом ожидаемого времени их хранения. В настоящее время только драйвер NVMe учитывает эти сведения;
- Поддержка буферизированного ввода/вывода на блочном уровне в неблокирующем режиме. Новая возможность позволяет улучшить поддержку асинхронного доступа в условиях, когда используется буферизированный ввод/вывод, и снижает риск возникновения задержки возврата управления из ядра при выполнении асинхронных операций (AIO) при помощи интерфейса Direct I/O;
- Для Device Mapper реализован новый модуль dm-zoned, позволяющий создавать зонированные блочные устройства в которых применяются разные правила записи в различные части устройства. Например, зонирование записи применяется в устройствах c черепичной магнитной записью (Shingled Magnetic Recording, SMR), в которых запись производится с частичным перекрытием соседней дорожки и, как следствие, в рамках группы допускается лишь последовательное добавление данных, а любая перезапись приводит к необходимости перезаписи всей группы дорожек. Модуль dm-zoned даёт возможность представить подобное зонированное устройство как обычное блочное устройство, скрывая применяемые в процессе работы ограничения записи;
- В файловой системе ext4 реализована опция "largedir", при указании которой увеличивается число файлов, которое может размещаться в одной директории. Без данной опции действует лимит на 10 млн файлов в одной директории, а при указании опции "largedir" лимит увеличивается до 2 миллиардов файлов. Опция подготовлена разработчиками кластерной файловой системы Lustre;
- В ext4 добавлена возможность хранения расширенных атрибутов файлов (Xattr) в отдельных inode, что позволяет добиться хранения большего числа атрибутов для одного файла. Каждый атрибут теперь может содержать до 64 Кб информации. При выносе Xattr в отдельный inode также наблюдается увеличение эффективности кэширования. Дополнительно, в ext4 добавлена поддержка дедупликации расширенных атрибутов, позволяющая фактически хранить только одну копию атрибута, применённого к нескольким файлам;
- В ext4 обеспечена возможность параллельного выполнения операций discard при монтировании с опцией '-o discard';
- Добавлен механизм для более надёжного информирования приложений в пространстве пользователя об ошибках, возникающих в процессе выполнения операций отложенной записи (writeback);
- В F2FS, развиваемой компанией Samsung высокопроизводительной файловой системе для Flash-накопителей, обеспечена поддержка дисковых квот;
- В F2FS, UBIFS и Btrfs добавлена поддержка системного вызова statx() с реализацией более эффективного и функционального варианта stat(), возвращающего расширенную информацию о файле, включая время создания файла и специфичные для файловых систем флаги;
- В XFS добавлена поддержка опций SEEK_HOLE и SEEK_DATA системного вызова lseek() для выявления пустых областей и блоков данных внутри файла;
- В файловой системе OverlayFS добавлена поддержка индекса директории, позволяющая выполнять операции копирования между слоями без повреждения жестких ссылок. Подготовлена инфраструктура для экспорта OverlayFS через NFS;
- Добавлена возможность повторного экспорта NFS-раздела поверх NFS;
- Обеспечено использование по умолчанию протокола SMB 3 (Server Message Block) при обращении к файлам на серверах Samba и Windows при помощи CIFS;
- Виртуализация и безопасность
- Добавлена реализация протокола TLS на уровне ядра (KTLS), использование которой позволяет добиться существенного повышения производительности приложений, использующих HTTPS. Реализация выполнена в виде модуля ядра, предоставляющего новый тип сокетов AF_KTLS, которые можно использовать для передачи данных по протоколам TLS 1.2 для TCP и DTLS 1.2 для UDP с применением шифра AES GCM. Поддерживается прямая отправка файлов через установленное TLS-соединение при помощи вызова sendfile(). На графике ниже отражено проведённое инженерами Facebook сравнение задержек при использовании обработчика HTTPS на базе KTLS в ядре и библиотеки OpenSSL:
- В состав системы сборки включен плагин к GCC для рандомизации раскладки структур данных, который на этапе сборки делает непредсказуемым следование полей в структурах и затрудняет проведение атак, базирующихся на знании раскладки структур в ядре. Плагин портирован из патчей проекта grsecurity;
- В состав модуля AppArmor включен код обработки меток на процессы ("domain labeling"), разработанный и применяемый в Ubuntu. В будущих выпусках ожидается продолжение интеграции улучшений, разработанных командой Ubuntu для AppArmor и применяемых в проекте Snapd;
- В подсистему SCSI добавлена поддержка cамошифруемых накопителей SSD (Self-Encrypting SSD), в которых устройство аппаратного шифрования встроено непосредственно в контроллер в соответствии со спецификацией Opal;
- Добавлены дополнительные меры для определения во время компиляции и перехвата во время работы возможных переполнений буфера при выполнении строковых функций, определённых в заголовочном файле string.h. ** Реализация идентична режиму FORTIFY_SOURCE=1 в glibc, но также предоставляет средства и для контроля за размером буфера при операциях чтения, а не только при записи;
- Реализована поддержка уровней безопасности хост-контроллера Thunderbolt, позволяющих задавать права доступа для подключаемых через данный интерфейс устройств (например, можно запретить прямой доступ к памяти через DMA или ограничить доступ только работой через Display Port и туннель USB);
- Добавлены вызовы wait_for_random_bytes() и get_random_*_wait(), позволяющие убедиться, что генератор псевдослучайных чисел корректно инициализирован и получил достаточный объём энтропии;
- В fscrypt добавлена поддержка алгоритма AES-128-CBC для шифрования содержимого файлов и AES-128-CBC-CTS для имён файлов (ранее поддерживались только AES-256-XTS и AES-256-CBC-CTS);
- На 64-разрядных системах изменён метод генерации "канареечного слова" - технология защиты от переполнения стека, основанной на применении случайной последовательности, устанавливаемой в стек непосредственно перед адресом возврата. Младшие 8 бит канареечного слова теперь обнуляются. С одной стороны это на 8 бит снижает случайную энтропию, но с другой стороны позволяет защититься от получения значения канареечного слова, манипулируя переполнением Си-строк, для ограничения которых используется нулевой символ;
- Сетевая подсистема
- Обеспечена раздельная обработка sysctl tcp_sack, tcp_window_scaling и tcp_timestamps для каждого пространства имён сетевой подсистемы (network namespace);
- В getsockopt() добавлена поддержка новой команды SO_PEERGROUPS, возвращающей список всех групп, в которые входит сокет;
- Представлен тип BPF-программ - BPF_PROG_TYPE_SOCK_OPS, который позволяет организовать вызов BPF-программы на различных стадиях обработки сокетов и может применяться для корректировки параметров соединения, таких как размер буферов, начального окна, SYN/SYN-ACK RTO и т.п.
- Память и системные сервисы
- Добавлены средства прогнозирования следующего прерывания, которые позволяют повысить эффективность принятия решений, связанных с управлением питанием;
- В утилиту perf добавлена опция "--smi-cost", позволяющая оценить затраты на обработку прерываний системного управления (SMI - System Management Interrupt, для выполнения кода в режиме SMM);
- Инициатива по оформлению документации к ядру с использованием разметки reStructuredText (RST) и пакета Sphinx достигла важного рубежа - все ранее доступные шаблоны DocBook преобразованы в reStructuredText. Компоненты для поддержки DocBook удалены;
- Для каждой BPF-программы теперь генерируется и назначается уникальный идентификатор, который может использоваться для получения файловых дескрипторов к объектам BPF из пространства пользователя;
- Реализована первая стадия оптимизации процесса вытеснения в раздел подкачки больших страниц памяти (Transparent Huge-Pages). Если до сих пор первым этапом вытеснения в раздел подкачки было разбиение больших страниц на маленькие, то в ядре 4.13 подобное разбиение откладывается до момента распределения места в разделе подкачки и обработки кэша подкачки. Подобное изменение уменьшает конфликт блокировок и приводит к росту производительности примерно на 15%. В будущих ядрах разбиение больших страниц планируется отложить до момента фактической записи в раздел подкачки или чтения из него;
- В файле /proc/cpuinfo в строке "cpu MHz" теперь выводится номинальная частота процессора, а не вычисленная текущая частота, которая может меняться при каждом запросе. Для оценки изменения текущей частоты рекомендуется использовать программы turbostat и cpupower, поставляемые в составе исходных текстов ядра;
- Оборудование
- Представлена подсистема драйверов "mux", позволяющая обеспечить поддержку контроллеров с мультиплексированием, управляющих работой сразу нескольких устройств;
- Для архитектуры s390 реализованы пятиуровневые таблицы страниц памяти, которые позволяют адресовать до 16 эксабайт ОЗУ;
- В DRM-драйвере (Direct Rendering Manager) Nouveau обеспечена поддержка средств стереоскопического и 3D вывода через HDMI и DisplayPort для карт NV50+ (G80+);
- В DRM-драйвере AMDGPU добавлена ограниченная начальная поддержка GPU AMD Raven Ridge и внесена большая порция исправлений для поддержки GPU Radeon RX Vega. При этом, для указанных GPU пока не реализована поддержка DC (Display Core), т.е. отсутствуют компоненты для вывода на экран;
- В DRM-драйвер для GPU Intel добавлена начальная поддержка грядущих процессоров на базе микроархитектур Intel Cannonlake и Intel Coffeelake. Улучшен процесс сброса GPU g4x и g33;
- Добавлен драйвер vboxvideo для виртуального GPU VirtualBox, драйвер для которого раньше поставлялся в наборе VirtualBox Guest Additions, а теперь перенесён в основное ядро;
- Добавлена поддержка звуковых кодеков Realtek ALC215, ALC285 и ALC289, Everest Semi ES8316, ZTE ZX AUD96P22;
- Добавлена поддержка ARM-плат и SoC, включая Orange Pi Win, Orange Pi Zero Plus 2, Nano Pi NEO2, Orange Pi Prime, BeagleBone Blue, LeMaker Guitar Board, Linksys WRT3200ACM, Action Semi S500, Rockchip RV1108 и Bubblegum 96.
Вышла версия ядра Linux 4.12
3 июля 2017 года Линус Торвальдс объявил о выходе версии ядра Linux 4.12.
Это крупный апдейт ядра - добавлено более 1 млн строк кода. Большую часть его занимает поддержка видеокарт AMD Radeon RX Vega, драйвер для Intel Atom IPU и другие драйверы. Размер патча 89 МБ. В нем ~13 тыс. правок от 1,5 тыс. разработчиков[41].
Версия 4.12 получилась большой по нескольким причинам:
- часть кода занимает поддержка видеокарт Radeon RX Vega от компании AMD.
- дополнение - драйвер для Intel Atom IPU.
Добавлена модернизация для чипов POWER9, ARM и Nvidia, менеджер порта USB Type-C. Вдобавок разработчики провели стабилизацию ядра в форме рандомизации размещения адресного пространства ядра (KASLR), которая по умолчанию используется для систем x86.
Разработка версии 4.12 начата мая 2017 года. В этом релизе появились планировщики ввода/вывода Budget Fair Queueing (BFQ) и Kyber. Их задача – обеспечить доступ к данным в несколько потоков для многоядерных систем. Так завершено создание многоуровневой системы очередей.
В структуру API LivePatch, которая накладывает патчи на работающее ядро, добавлена гибридная модель обеспечения непротиворечивости. В этой модели мониторинга непротиворечивости анализ стека kPatch совмещен с механизмом оценки отдельных задач kGraft. Теперь в ядро без задержек можно вносить более сложные, чем раньше, патчи, даже если они касаются изменения функций или семантики данных.
Для Device Mapper создан модуль dm-integrity, он отвечает за эмуляцию блочного устройства. Создан фреймворк Trusted Execution Environment (TEE). С ним возможно создавать защищенное окружение на чипах ARM TrustZone.
Эксперт Positive Technologies обнаружил уязвимость в ядре
16 марта 2017 года Positive Technologies сообщила об устранении экспертом компании опасной уязвимости в ядре Linux.
Александр Попов, эксперт компании Positive Technologies, выявил уязвимость (CVE-2017-2636) в ядре Linux, которая позволяет локальному пользователю повысить привилегии в атакуемой системе или вызвать сбой в ее работе («отказ в обслуживании»). Эта проблема актуальна для большинства популярных дистрибутивов Linux, в том числе RHEL 6/7, Fedora, SUSE, Debian и Ubuntu.
Исследователь выявил ошибку типа «состояние гонки» (race condition) в драйвере n_hdlc, приводящую к двойному освобождению памяти ядра, что может быть использовано для повышения привилегий в операционной системе. Уязвимость оценена в 7.8 баллов по шкале CVSS v3.
![]() | Для автоматической загрузки модуля n_hdlc злоумышленнику достаточно прав непривилегированного пользователя. Кроме того, для атаки не нужно специализированного аппаратного обеспечения. Уязвимость давняя, поэтому она широко распространена на рабочих станциях и серверах под управлением Linux. | ![]() |
Обнаруженная ошибка присутствует в ядре с 22 июня 2009 года и выявлена посредством тестирования системных вызовов Linux фаззером syzkaller. 28 февраля 2017 года исследователь сообщил об уязвимости на kernel.org, приложил прототип эксплойта и патч, который ее устраняет. 7 марта 2017 года состоялось публичное разглашение информации о CVE-2017-2636, после чего выпущены обновления безопасности. Защититься также можно с помощью специальных правил блокировки загрузки модулей ядра.
Пользователям необходимо установить последние обновления безопасности или вручную заблокировать уязвимый модуль.
2016
Ядро Linux подверглось опасности
5 октября 2016 Линус Торвальдс сообщил о создании в коде ядра Linux версии 4.8 программной возможности, «способной убить все ядро». Код попал в версию 4.8, поскольку сам Торвальдс не проверил работу сотрудника.
По этому поводу Торвальдс подверг жесткой критике версию ядра Linux 4.8, представленную им 2 октября 2016 года. Вредоносный код попал в ядро по вине разработчика Эндрю Мортона (Andrew Morton) - он неудачно исправил ошибку, действующую во версиях ядра от 3.15 и выше. Торвальдс высказал все, что думает о коллеге и сделал это весьма бесцеремонно[42].
По словам создателя Linux, Мортон некорректно использовал механизм отладки BUG_ON(), который использовал при работе с предрелизной версией ядра версии 4.8. Торвальдс принял ряд исправлений от Мортона непосредственно перед релизом версии 4.8 и признал часть собственной вины за ошибку, поскольку ему следовало обратить внимание на добавленные строки BUG_ON(). Он отметил, что разработки Мортона пользуются доверием, однако в этом случае код явно не подвергся тестированию, прежде чем его направили к Торвальдсу.
В резких выражениях Торвальдс пообещал изъять саму идею «идиотского» BUG_ON() из практики отладки и напомнил, что в 2002 году лично опубликовал руководство по использованию этого механизма, где пояснил, когда его не следует применять. Торвальдс заявил, что прежняя ошибка в ядре, кочевавшая из версии в версию, несравнимо менее ужасна, чем «убийство всего ядра».
Релиз ядра Linux 4.8
3 октября 2016 года Линус Торвальдс представил релиз ядра Linux 4.8. Среди заметных изменений: поддержка плагинов GCC в системе сборки, возможность запуска в контейнерах кода для других архитектур, интеграция механизма защиты PAX_USERCOPY, поддержка алгоритма контроля перегрузки TCP "New Vegas", увеличение производительности беспроводного стека, генератор псевдослучайных чисел.
В эту версию принято более 13 тыс. исправлений от почти 1,5 тыс. разработчиков, размер патча - 41 Мб (изменения затронули 11303 файлов, добавлено 627751 строк кода, удалено 278958 строк). Около 39% всех представленных в 4.8 изменений связаны с драйверами устройств, примерно 21% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 5% - файловыми системами и 4% c внутренними подсистемами ядра[43].
Основные изменения
Дисковая подсистема, ввод/вывод и файловые системы
- В файловую систему XFS добавлена поддержка механизма обратного маппинга (rmap, reverse-mapping), позволяющего файловой системе определить владельца любого блока на устройстве хранения. В настоящее время практическая польза от reverse-mapping не видна, но в будущем данный механизм послужит основой для реализации таких возможностей, как reflink(), режим copy-on-write для данных, дедупликация, расширенные средства информирования о bad-блоках и дополнительные возможности для восстановления повреждений;
- В Ext4 проведена работа по переводу средств шифрования разделов на криптографические функции штатной подсистемы ядра crypt;
- В Btrfs кроме чистки кода и устранения ошибок добавлена переработанная реализация механизма отслеживания исчерпания свободного места на диске (ENOSPC, Error NO SPace), в которой заметно повышена отзывчивость и производительность;
- В F2FS добавлены изменения, увеличивающие масштабируемость и снижающие нагрузку на CPU при выполнении операций обновления таблицы резервных inode при операциях записи. Добавлен ioctl для перемещения блоков данных между файлами;
- В dm-raid появилась поддержка добавления дополнительных накопителей в RAID-массив (reshaping) и изменения уровня RAID;
- Реализована возможность экспортирования по сети устройств хранения с интерфейсом NVM Express, используя протоколы, подобные RDMA;
- В подсистему device-mapper добавлена поддержка применения механизма DAX для прямого доступа к низкоуровневым устройствам постоянной памяти;
- В распределённую файловую систему OrangeFS (продолжение развития PVFS) добавлена возможность задействования кэша на базе dcache и кэша атрибутов на стороне ядра, что заметно ускоряет выполнение операций с мелкими файлами. Например, сборка coreutils без кэширования занимает 17 минут, а с кэшем - 6 минут 20 секунд;
- В ФС Ceph добавлена полная поддержка пространств имён RADOS (Reliable Autonomic Distributed Object Store).
- Поддержка технологии "transparent huge pages" в tmpfs, позволяющая оперировать страницами памяти большого размера;
- В многослойной ФС Overlayfs проведена работа по обеспечению поддержки SELinux;
- В ядро добавлена реализация простейшего сервера pNFS (Parallel NFS). Внесены оптимизации производительности в код NFS-клиента;
Сетевая подсистема
- В TCP-стек добавлена поддержка алгоритма контроля перегрузки "New Vegas", который является модернизированным вариантом алгоритма Vegas и также оперирует задержками в доставке пакетов вместо информации о потере пакетов. Новый алгоритм оптимизирован для использования в крупных высокоскоростных сетях и ЦОД с каналами связи в 10 гигабит и выше;
- В подсистеме mac80211 ("WiFi") вместо предоставляемых сетевым стеком дисциплин обработки очередей ожидающих отправки пакетов задействован алгоритм CoDel (Сontrolled Delay - управляемая задержка), который позволил существенно поднять производительность работы в беспроводных сетях;
- Протокол RDS (Reliable Datagram Sockets), позволяющий создавать сокеты для надёжной передачи датаграмм поверх TCP-линков, расширен возможностью передачи сразу через несколько соединений TCP, что позволило добиться существенного увеличения максимальной производительности;
- Сетевым драйверам предоставлена возможность загрузки BPF-программ для предварительной обработки входящих пакетов, до их помещения во внутренние структуры данных. Указанную возможность можно применять, например, для отбрасывания, изменения или перенаправления пакетов на ранней стадии их обработки, что позволяет увеличить производительность данных операций за счёт обхода вызова обработчиков ядра;
- Добавлен драйвер с программной реализаций RDMA поверх Ethernet, позволяющий использовать протоколы InfiniBand Remote DMA с обычным сетевым стеком ядра;
Память и системные сервисы
- Представлен механизм обновления таблиц ACPI из прошивок или через configfs;
- Для подсистемы GPIO представлен новый ABI пространства пользователя для управления линиями ввода/вывода общего назначения. ABI основан на применении символьного устройства и заменяет собой давно устаревший интерфейс на базе sysfs;
- Для архитектуры ARM64 добавлена возможность использования механизма kexec, позволяющего загрузить новый экземпляр ядра из уже работающего ядра Linux;
- Представлен новый параметр командной строки printk.devkmsg, который может быть использован для управления отправкой данных в лог ядра из пространства пользователя через /dev/kmsg. Значение off отключает отправку из пространства пользователя, а числовое значение устанавливает лимит на интенсивность отправки данных;
- Новая внутренняя подсистема обработки таймаутов, появление которой направлено на решение проблем с отзывчивостью (latency);
- Добавлен фреймворк HDMI CEC (Consumer Electronics Control) позволяющий унифицировать управление устройствами, подключенными через HDMI, и управлять ими с одного пульта;
- В систему сборки добавлена возможность использования плагинов GCC, которые могут применяться для дополнительного анализа или изменения кода во время компиляции. Например, уже реализована поддержка плагинов для тестирования покрытия кода (coverage testing) и вычисления цикломатической сложности;
- Представлена новая система для форматирования документации к ядру, основанная на использовании в текстовых файлах разметки reStructuredText (RST) и пакета Sphinx. Новая система позволяет генерировать корректно оформленную документацию к ядру в форматах HTML, LaTeX, ePub и PDF. Документация к мультимедийным подсистемам и DRM уже переведена с DocBook на RST;
Виртуализация и безопасность
- Усиление защиты операций копирования данных между ядром и пространством пользователя. В ядро включён вариант технологии PAX_USERCOPY, разработанной проектом grsecurity, добавляющий дополнительные проверки используемых при копировании диапазонов адресов для предотвращения обращения к областям памяти ядра вне границ буфера, выделенного для копирования;
- Поддержка контейнеров с эмуляцией архитектуры, позволяющих запускать в изолированном контейнере код, собранный для аппаратных архитектур, отличных от архитектуры хост-системы. Например, на системах с архитектурой x86_64 теперь можно запустить контейнер с окружением для ARM64.
- Генератор псевдослучайных чисел (/dev/random, /dev/urandom) заменён на новую, более высокопроизводительную, реализацию, основанную на использовании потокового шифра ChaCha20 и включающую наработку по решению проблем с масштабируемостью в условиях когда программам в пространстве пользователя требуются большие объёмы случайных чисел;
- Для архитектуры x86_64 включена поддержка рандомизации адресного пространства ядра (KASLR, Kernel Address Space Layout Randomization). Расширено число типов регионов памяти ядра для которых применяется рандомизация. В SLUB memory allocator добавлена рандомизация списков свободных областей;
- В подсистему crypto добавлен новый механизм согласования ключей (Key-agreement Protocol Primitives API - KPP), который может быть использован для реализации протоколов обмена ключами, таких как DH и ECDH;
- Для IPv6 добавлена поддержка стандарта CALIPSO (Common Architecture Label IPv6 Security Option), который может быть использован для прикрепления связанных с безопасностью меток к пакетам, которые затем могут быть связаны с политиками SELinux и Smack;
- В загружаемых модулях ядра обеспечена возможность использования портированного из grsecurity механизма защиты __ro_after_init (post-init read-only memory), позволяющего создавать доступные на чтение и запись области памяти, используемые только во время инициализации и переводимые в режим только для чтения после инициализации;
- В состав включена инфраструктура Virtio vsock, позволяющая упростить обмен данными между хост-системой и работающими виртуальными машинами, благодаря применению обычных сокетов POSIX;
Оборудование
- В драйвер AMDGPU добавлена поддержка технологии OverDrive для повышения производительности через разгон частоты GPU и памяти (допускается разгон до 20%). Также улучшена энергоэффективность для чипов Polaris и внесены улучшения, связанные с поддержкой технологий PowerPlay для снижения энергопотребления;
- В DRM-драйвер (Direct Rendering Manager) Nouveau добавлена начальная поддержка видеокарт NVIDIA на базе GPU Pascal. Аппаратное ускорение пока поддерживаются только для чипов GP100 (GeForce GTX Titan). Для более новых карт (GP104/GeForce GTX 1000 и новее) предоставляются только базовые средства управления видеорежимами, так как для включения ускорения требуется верификация прошивки по цифровой подписи. Улучшено управление питанием для чипов GK20A и GM20B;
- В DRM-драйвере Intel добавлена поддержка виртуального GPU GVT-g на системах с процессорами Broadwell и новее. По умолчанию включена поддержка компонентов BXT (Balanced Technology Extended).
- В состав включен новый драйвер для GPU ARM Mali, в котором пока поддерживаются только GPU DP500, DP550 и DP650 и отсутствуют средства для задействования аппаратного ускорения 3D-операций;
- Обеспечена поддержка 64-разрядного SoC BCM2837, используемого в Raspberry Pi 3. Также добавлена поддержка SoC Freescale i.MX7Solo, Qualcomm MDM9615, Renesas r8a7792 и Renesas r8a7796;
- Добавлена поддержка свободного процессора "J-Core J2", VHDL (VHSIC Hardware Description Language) спецификации которого доступны под лицензией BSD.
- По сравнению с прошлым выпуском обеспечена поддержка около 500 новых аппаратных компонентов, из которых 175 имеют интерфейсы PCIe/PCI или USB. В том числе:
- В драйвере Ath10k появилась поддержка чипов Atheros QCA9888.
- Добавлен драйвер intel-vbtn (Intel Virtual Button), который, например, необходим для работы кнопки включения питания на ноутбуке Dell XPS 13.
- Появилась поддержка тачпадов Alps.
- Добавлена поддержка DVB-тюнеров Sony HELENE и Hauppauge WinTV.
- Добавлен драйвер для задействования EDAC (Error Detection and Correction) в процессорах Intel Core i 6000 (Skylake).
Релиз ядра Linux 4.7
25 июля 2016 года Линус Торвальдс представил релиз ядра Linux 4.7.
Среди наиболее заметных изменений:
- распараллеливание проверок содержимого директорий,
- более быстрый и точный механизм управления частотой CPU,
- поддержка технологии UEFI Capsule для организации обновления прошивок,
- серия улучшений в средствах трассировки и отладки,
- поддержка виртуальных контроллеров USB-устройств в стеке USB/IP,
- возможность привязки загрузки модулей ядра только из одной ФС,
- поддержка разработанного для Android механизма sync_file.
В версию принято около 12 тыс. исправлений от примерно 1,5 тыс. разработчиков, размер патча - 34 МБ (изменения затронули 9744 файлов, добавлено 493490 строк кода, удалено 194974 строк). Около 47% всех представленных в 4.7 изменений связаны с драйверами устройств, примерно 19% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 15% связано с сетевым стеком, 5% - файловыми системами и 4% c внутренними подсистемами ядра[44].
Наиболее приметные изменения в ядре Linux 4.7
- Дисковая подсистема, ввод/вывод и файловые системы
- В системе кэширования информации о путях в директориях, предназначенной для ускорения выполнения различных типовых проверок (например, можно проверить наличие файлов в директории без обращения к диску), реализована возможность выполнения нескольких параллельных проверок в одной директории. Поскольку кэш сам по себе работает достаточно быстро, поддержка распараллеливания не оказывает большого влияния на производительность для типовых нагрузок, но может привести к ускорению для сценариев работы, в которых имеет место большое число операций с одной директорией;
- Разработанный для платформы Android механизм sync_file перемещён из экспериментальной секции staging в основное ядро. В отличие от традиционных барьеров на память (fences), напрямую привязываемых ядром к буферам и неподконтрольных из пространства пользователя, sync_file предоставляет API для обработки барьеров в пространстве пользователя, что значительно упрощает создание графических драйверов с компонентами в пространстве пользователя;
- В XFS добавлена возможность настраиваемой обработки ошибок для проблем, связанных с метаданными. Режим обработки ошибок по умолчанию изменён с "повторять попытки вечно" на "повторять попытки до отмонтирования при сбое";
- В BTRFS для функции renameat2 представлены операции RENAME_EXCHANGE для атомарного обмена путей и RENAME_WHITEOUT для использования в overlayfs. Добавлен новый ioctl для удаления устройства по его идентификатору (devid);
- В CEPH добавлена поддержка использования нескольких файловых систем (нескольких пространств имён в одном кластере);
- В EXT4 добавлена возможность прерывания операции readdir() для больших пустых директорий (директорий с большим числом очищенных блоков, в которых раньше было много файлов);
- В NFS добавлена поддержка операции COPY, определённой в спецификации NFS v4.2, которая реализована через появившийся в ядре 4.5 системный вызов copy_file_range и позволят выполнить копирование без перемещения данных по сети от сервера к клиенту и возвращения от клиента на сервер;
- Сетевая подсистема
- В стек USB/IP, позволяющий организовать доступ к удалённым USB-устройствам поверх сети TCP/IP, добавлена поддержка создания виртуальных контроллеров USB-устройств. Новая возможность позволяет не только работать с реальными физическими USB-устройствами, но и пробрасывать виртуальные устройства. Например, можно реализовать эмулятор смартфона, который будет выглядеть для рабочего окружения разработчика как обычный смартфон, подключенный по USB;
- В состав принят предложенный компанией Airbus патч, добавляющий в сетевой стек поддержку первой версии протокола HSR (High-availability Seamless Redundancy), предназначенного для создания отказоустойчивых сетей Ethernet;
- Проведена работа по оптимизации TCP-стека для сокращения задержек в процессе обработки очень большого числа пакетов;
- Повышена стойкость TCP-стека к syn-флуду. При тестировании изменения позволили увеличить производительность в условиях syn-флуда с 3.2 до 6 миллионов пакетов в секунду. Добавлена возможность ограничения интенсивности отправки ACK-пакетов в условия syn-флуда c указанием в пакетах случайных номеров последовательности;
- Добавлена поддержка протокола GTP-U для туннелирования GPRS;
- Память и системные сервисы
- В систему динамического управления частотой процессора (cpufreq) добавлен новый механизм регулирования частоты - schedutil, в котором удалось добиться слаженной работы планировщика задач и средств управления питанием CPU. Schedutil отличается от ранее доступных регуляторов тем, что для принятия решения об изменении частоты он напрямую использует информацию от планировщика задач и может сразу обращаться к драйверам cpufreq для оперативного изменения частоты, мгновенно подгоняя параметры работы CPU к текущей нагрузке. Подобный подход позволяет избавиться от задержек при изменении частоты и сразу реагировать на изменение нагрузки. В ядро пока принята простейшая реализация schedutil, которую планируется расширить в следующих выпусках;
- Поддержка механизма UEFI Capsule, предоставляющего средства для передачи бинарных наборов данных в прошивки EFI. После получения этих данных прошивка разбирает их и принимает решение по их дальнейшему использованию в зависимости от контекста. Наиболее частым применением UEFI Capsule является передача нового образа прошивки для обновления до новой версии при следующей загрузке. Запись данных осуществляется через устройство /dev/efi_capsule_loader;
- В ftrace, фреймворк для отслеживания вызова функций, добавлена команда "hist", предоставляющая средства для построения гистограмм событий путём агрегирования информации о наступающих событиях в форме ключ-значение. При помощи новой возможности можно формировать произвольные сводные отчёты, например, узнать раскладку частоты выполнения системных вызовов или интенсивности чтения из файлов в разрезе выполняемых процессов;
- В команду "perf trace" добавлена возможность вывода цепочек исполнения системных вызовов из пространства пользователя. Например, командой "trace --call-graph dwarf --filter-pids {pid}" можно отследить обращения к системному вызову recvmsg(), произведённые из процесса gnome-shell;
- Добавлен новый тип программ BPF - BPF_PROG_TYPE_TRACEPOINT, которые можно прикреплять к точкам трассировки (tracepoint - вариант динамических printf(), выставляемых разработчиками программ для анализа поведения системы, к которым затем можно обращаться из LTTng, perf, SystemTap, ftrace). Таким образом, теперь можно собирать данные из точек трассировки и обрабатывать их в программе BPF, что является более быстрой альтернативой доступа к точкам трассировки через kprobes;
- Программы BPF, использующие модули cls_bpf и act_bpf для управления трафиком, теперь могут напрямую получить доступ к содержимому сетевых пакетов, без применения специальных функций-загрузчиков. Подобный подход позволяет добиться существенного повышения производительности, но ценой возможной утечки данных ядра в пространство пользователя, что не воспринимается как проблема в силу того, что такие BPF-программы могут загружаться только привилегированным пользователем;
- В /proc/PID/status добавлено новое поле, позволяющее узнать текущий umask процесса;
- В состав ядра добавлена улучшенная реализация системы для определения состояния нехватки памяти в системе (OOM);
- В системные вызовы preadv2() и pwritev2() добавлена поддержка флагов RWF_SYNC (сброс данных и метаданных из кэша на носитель после выполнения операции) и RWF_DSYNC (принудительный сброс на носитель только данных);
- Добавлен механизм "device DAX", позволяющий организовать доступ к постоянной памяти через символьное устройство /dev/dax.X.Y, вместо привязки к системной памяти, что даёт возможность напрямую обращаться к постоянной памяти без необходимости размещения на ней файловой системы;
- Добавлена новая библиотека хэширования (linux/stringhash.h), в которой устранены проблемы, наблюдаемые в ранее доступном коде хэширования строк;
- Виртуализация и безопасность
- Добавлен новый LSM-модуль LoadPin, который позволяет гарантировать, что все загруженные ядром файлы (модули ядра, прошивки, образы kexec и т.п.) получены из одной файловой системы. Модуль изначально был создан для Chrome OS и предназначен для обеспечения загрузки компонентов ядра только с криптографически верифицированного носителя (dm-verity), при этом верификация осуществляется сразу для всего раздела (доступен только на чтение), без необходимости проверки цифровых подписей для отдельных файлов;
- Для архитектуры MIPS добавлена поддержка рандомизации адресного пространства (ASLR);
- Добавлена новая опция для рандомизации списков освобождения памяти в slab memory allocator, что делает работу данной системы менее предсказуемой для атакующих;
- В JIT-компиляторе BPF реализована техника "constant blinding", добавляющая дополнительный эшелон защиты от загрузки произвольных инструкций в адресной пространство ядра. Суть метода в применении к константам дополнительной операции XOR с непостоянным ключом, что не позволяет атакующему предсказать, какие именно фактические значения окажутся в памяти;
- В SELinux добавлена возможность ограничения загрузки модулей ядра;
- Оборудование
- В драйвер AMDGPU добавлена поддержка GPU Radeon RX480, основанного на новой архитектуре Polaris;
- Проведён рефакторинг DRM-драйвера (Direct Rendering Manager) для видеокарт Intel, добавлена поддержка управления цветом, решены проблемы с зависанием на Skylake GT3 и GT4;
- Добавлены DRM-драйверы для графических подсистем SoC Allwinner A13, Mediatek MT8173 и Hisilicon Kirin;
- В DRM-драйвер для видеокарт NVIDIA (Nouveau) добавлена поддержка GPU GM108 Maxwell и улучшена работа с датчиками температуры;
- Для систем ARM64 добавлена поддержка архитектуры NUMA и возможности перехода в спящий режим (suspend-to-disk).
- Добавлена поддержка расширения PCI Express DPC (Downstream Port Containment), предназначенного для локализации невосстановимых ошибок в оборудовании, прикреплённом через определённый порт;
- По сравнению с прошлым выпуском обеспечена поддержка около 500 новых аппаратных компонентов, из которых 180 имеют интерфейсы PCIe/PCI или USB. Добавлены драйверы для игрового пульта Microsoft Xbox One Elite Controller, беспроводных чипов Intel 9260, Chelsio iSCSI Target Offload Controller. Представлены аудиокодеки Realteks ALC234, ALC274, ALC294, ALC700, ALC701 и ALC703, используемые в новых материнских платах для ноутбуков. Общее число поддерживаемых ядром драйверов составило 26300.
- Латиноамериканский Фонд свободного ПО оперативно сформировал вариант полностью свободного ядра 4.7 - Linux-libre 4.7-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске проведены операции по чистке блобов в драйверах radeon, i915 csr, mwifiex, brcmfmac, iwlwifi, ath10k testmode, rtl8xxxu wifi, hfi1 Infiniband и skylake audio. Из новых драйверов, содержащих блобы, отмечается только xhci-tegra.
АНБ США считает пользователей Linux «экстремистами»
В июле 2016 года стало известно, что Агентство национальной безопасности (АНБ) США называет «экстремистами» читателей журнала Linux Journal, а также пользователей Tor и Tails Linux, следует из файлов программного обеспечения XKeyscore, которое агенты используют для слежки за людьми, сообщает Techspot[45].
Релиз ядра Linux 4.5
14 марта 2016 года Линус Торвальдс представил релиз ядра Linux 4.5[46].
Среди наиболее заметных изменений:
- системный вызов copy_file_range для ускорения копирования данных между файлами,
- поддержка технологии управления питанием Powerplay для GPU Radeon,
- улучшение распределения свободного пространства в Btrfs,
- реализация квот проектов в ext4,
- поддержка сборки с включением детектора неопределённого поведения, поддержка прямой коррекции ошибок в dm-verity,
- стабилизация новой унифицированной иерархии cgroup,
- подключение BPF-балансировщиков для UDP-сокетов в режиме SO_REUSEPORT,
- увеличение масштабируемости epoll для многопоточных приложений.
В эту версию принято около 13 тыс. исправлений от почти 1500 разработчиков, размер патча - 70 Мб (изменения затронули 11589 файлов, добавлено 1146727 строк кода, удалено 854589 строк). Около 45% всех представленных в 4.5 изменений связаны с драйверами устройств, примерно 17% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 14% связано с сетевым стеком, 4% - файловыми системами и 3% c внутренними подсистемами ядра.
Наиболее интересные, для пользователей, изменения в ядре Linux 4.5:
- Дисковая подсистема, ввод/вывод и файловые системы
- Новый системный вызов copy_file_range, позволяющий ускорить выполнение операций копирования данных из одного файла в другой файл с выполнением операции только на стороне ядра, без предварительного чтения данных в память процесса в пространстве пользователя, что избавляет от частого переключения контекста между ядром и пространством пользователя. Тем не менее, в обычных условиях использование copy_file_range лишь немного быстрее обычной команды "cp", так как основное время уходит на ввод/вывод с накопителя.
Совсем иная ситуация с применением copy_file_range для файлов на разделах NFS. Так как копирование в NFS приводит к необходимости перемещения данных по сети с сервера к клиенту и возвращения от клиента на сервер, исключение из этой цепочки клиента позволяет существенно ускорить процесс. Поддержка copy_file_range уже доступна для NFSv4.2. В будущих выпусках поддержка ускорения копирования будет реализована для Btrfs и специализированных устройств хранения, также будут преодолены текущие ограничение, такие как действия только в рамках одной точки монтирования и одного суперблока, а также невозможность ускорения копирования данных внутри одного файла.
- В Btrfs решены проблемы с масштабируемостью обработки свободного дискового пространства. Вместо использования кэша свободных блоков, становящегося узким местом на больших и нагруженных файловых системах (более 30 Тб), реализован новый экспериментальный метод представления кэша свободного дискового пространства, который лишен ограничений с масштабируемостью и не требует обновления после каждого изменения в ФС. Для включения новой реализации при монтировании следует указать опцию "-o space_cache=v2", после первого монтирования с которой файловая система будет переведена на новую реализацию кэша (старые ядра смогут только читать данные, для возвращения для них возможности записи следует вернуть старый вариант кэша через монтирование с опцией "-o clear_cache,space_cache=v1");
- В модуль dm-verity (device-mapper verity), предназначенный для проверки целостности хранимых блоков данных по криптографическим хэшам (например, используется для верификации загрузки в платформе Android), добавлена поддержка кодов прямой коррекции ошибок (FEC, Forwarded Error Correction, помехоустойчивое кодирование), которые позволяют не только выявить повреждения, но и восстановить исходное состояние блоков данных;
- В файловой системе ext4 реализована поддержка квот проектов ("project quota"). Файлы могут быть привязаны к отдельным "проектам" для которых применяются иные квоты, отличающиеся от общих системных квот.
- В XFS добавлена проверка корректности всех записей в логе по контрольным суммам, выполняемая в процессе восстановления информации по логу. Реализация ioctl-команд XFS XFS_IOC_FSSETXATTR и XFS_IOC_FSGETXATTR, позволяющих запрашивать и устанавливать различные дополнительные атрибуты файлов (только синхронная запись, запрет изменения, только дополнение, запрет создание символических ссылок на файл, не включение в бэкапы, запрет дефрагментации и т.п.), перемещена на уровень VFS и унифицирована для использования в других ФС (например, уже существует реализация для ext4).
- В файловой системе Ceph появилась поддержка асинхронного ввода/вывода и формата размещения файлов CEPH_FEATURE_FS_FILE_LAYOUT_V2 ;
- В подсистему FUSE добавлена поддержка опций SEEK_HOLE и SEEK_DATA системного вызова lseek() для выявления пустых областей и блоков данных внутри файла;
- В подсистему libnvdimm (работа с NVM-памятью) добавлен слой для управления сбойными блоками, адаптированный из кода MD RAID;
- В VFAT добавлена поддержка управления резервированием пустых областей через вызов fallocate();
- В F2FS, развиваемую компанией Samsung высокопроизводительную файловую систему для Flash-накопителей, добавлен ioctl F2FS_IOC_DEFRAGMENT для выборочной дефрагментации файлов и опция монтирования data_flush для сброса буферов перед фиксацией изменений;
- В MD RAID5 добавлена возможность горячего подключения и отключения дисков для хранения журнала;
- Сетевая подсистема
- Произведена оптимизация производительности работы режима SO_REUSEPORT для UDP-сокетов. Опция SO_REUSEPORT позволяет сразу нескольким слушающим сокетам подключиться к одному порту для приёма соединений с распределением поступающих запросов одновременно по всем подключенным через SO_REUSEPORT сокетам, что упрощает создание многопоточных серверных приложений. В новой версии ядра для UDP добавлены две дополнительные опции: SO_ATTACH_REUSEPORT_CBPF и SO_ATTACH_REUSEPORT_EBPF, позволяющие определить BPF-программу (классическую или расширенную), выполняющую функции диспетчера, принимающего решения какому сокету из группы REUSEPORT передать обработку пакета. Кроме того, увеличена скорость выбора сокета SO_REUSEPORT для входящих пакетов. При выполнении теста на сервере с 48 ядрами CPU с 10 гигабитным линком, скорость распределения между 10 сокетами возросла на 18%, 20 - на 14% и 40 - на 13%;
- В cgroup memory controller добавлена возможность учёта в едином пуле потребления памяти структурами данных, связанными с работой сокетов, анонимной памятью и кэше страниц памяти, позволяя учитывать состояние потребителей памяти в процессе распределения и лимитирования памяти в группе. Например, при нехватке памяти, может быть приостановлено выделение памяти на сетевые структуры. При желании можно вывести связанною с сокетами память из под действия общей системы лимитирования памяти (cgroup.memory=nosocket).
- Добавлена поддержка опции SOCK_DESTROY, позволяющей системному администратору принудительно закрыть TCP-соединение через интерфейс "netlink socket diag", инициируя операцию TCP ABORT с отправкой другой стороне RST-уведомления о завершении соединения;
- В nftables добавлена поддержка перенаправления и дублирования пакетов netdev, например, для быстрого проброса пакетов с одного интерфейса на другой или между входным/выходным буфером одного интерфейса. Также добавлена поддержка изменения данных в пакете (mangling packet payload) с автоматической корректировкой контрольной суммы и возможность учёта в правилах счётчика байт или пакетов;
- Добавлен модуль "clsact" с реализацией обобщённого метода построения очереди сетевых пакетов;
- Память и системные сервисы
- Обеспечена возможность сборки ядра в GCC 4.9+ с включённой опцией "-fsanitize=undefined", активирующей отладочный режим UBSAN (Undefined Behavior Sanitizer) с реализацией детектора неопределенного поведения, добавляющего в скомпилированный код дополнительные проверки для выявления во время выполнения программы ситуаций, когда поведение программы становится неопределенным (зависит от реализации компилятора) из-за ошибки программиста. Например, к неопределённому поведению относится использование нестатических переменных до их инициализации, деление целых чисел на ноль, переполнения целочисленных знаковых типов, разыменование указателей NULL, проблемы с выравниванием указателей и т.п.
- В системный вызов madvise, предоставляющий средства для оптимизации управления памятью процесса, добавлена поддержка флага MADV_FREE, который дополняет уже имеющийся флаг MADV_DONTNEED, через который ядру можно загодя сообщить о готовящемся освобождении блока памяти, т.е. о том, что этот блок уже не нужен и может использоваться ядром. В случае использования MADV_DONTNEED последующее обращении к блоку приведёт к генерации "page fault", выделению и обнулению страниц памяти или к повторному маппингу файла в память. MADV_FREE отличается тем, что только помечает блок доступным для освобождения, но не освобождает сразу, что позволяет вернуть его без генерации "page fault", если обращение произошло до его фактического использования ядром;
- В вызов epoll добавлена поддержка флага EPOLLEXCLUSIVE, решающего проблемы с масштабируемостью в многопоточных приложениях. В обычных условиях при создании нескольких файловых дескрипторов epoll (epfds) для совместно обрабатываемых событий генерация события приведёт к информированию всех epfds. Флаг EPOLLEXCLUSIVE позволят привязать событие к отдельному файловому дескриптору и информировать только связанный с ним поток, что значительно повышает эффективность в программах с большим числом epfds. Например, перевод платформы Enduro/X на EPOLLEXCLUSIVE уменьшил время прохождения тестового задания с 860 до 24 секунд;
- Интерфейс cgroup v2 переведён в разряд официально поддерживаемых и более не скрыт в категории экспериментальных разработок. В рамках cgroup v2 предлагается единая унифицированная иерархия cgroup (Cgroup unified hierarchy), пришедшая на смену гибкой, но не получившей практического применения, поддержке произвольного числа иерархий cgroup, определяющих применение правил к группам процессов (например, одна иерархия для распределения ресурсов CPU, а другая для регулирования потребления памяти). Изначально применяемый подход приводил к трудностям организации взаимодействия между обработчиками разных иерархий и к дополнительным затратам ресурсов ядра при применении правил для процесса, упоминаемого в разных иерархиях. Унифицированная иерархия cgroup теперь может монтироваться при указании типа файловой системы "cgroup2". К сожалению контроллер CPU пока не вошёл в релиз, поддержка ограничивается контроллерами памяти и ввода/вывода;
- Поддержка принудительной блокировки файлов (Mandatory file locking) переведена в разряд опциональных возможностей и требует явного включения в файле конфигурации. В будущем реализацию принудительной блокировки файлов планируется удалить из ядра. Суть принудительной блокировки файлов в том, что ядро автоматически запрещает запись в файл, если этот файл уже отрыт другим процессом на чтение, и запрещает чтение и запись, если файл открыт на запись. В отличие от повсеместно применяемой совместной схемы установки блокировок на файлы, принудительная блокировка почти не используется, а реализация имеет ряд нерешённых проблем;
- Многочисленные улучшения в утилите perf.
- Виртуализация и безопасность
- Добавлена защита от приведения устройств с проблемными прошивками в нерабочее состояние после очистки конфигурации UEFI в результате удаления содержимого директории /sys/firmware/efi/efivars, например, после запуска "rm -rf /" под пользователем root. В новой версии ряд переменных в /sys/firmware/efi/efivars защищён от удаления;
- В User-Mode Linux добавлена поддержка системного вызова seccomp();
- В файл конфигурации ядра добавлена новая опция CONFIG_IO_STRICT_DEVMEM (отключена по умолчанию), позволяющая блокировать доступ к областям памяти /dev/mem, связанных с работой драйверов устройств;
- Внесены улучшения в реализацию TPM/TPM2 (Trusted Platform Module);
- В Smack добавлена проверка 'file receive', позволяющая определить права доступа к сокету в привязке к процессу, а не к i-node;
- Возможность увеличения диапазона случайных значений, используемых при работе системы рандомизации адресного пространства (ASLR). Вместо заданных в коде значений параметры рандомизации теперь можно менять через /proc/sys/vm/mmap_rnd_bits и /proc/sys/vm/mmap_rnd_compat_bits, что может использоваться для усиления безопасности, но чревато проблемами с распределением больших блоков памяти;
- Возможность лимитирования числа неименованных каналов (pipe), которые может создать один пользователь. Указанная возможность позволяет защититься от атак, в результате которых пользователь может израсходовать всю доступную память через открытие большого числа неименованных каналов, данные в которых остаются никогда не прочитаны;
- Оборудование
- В драйвер AMDGPU добавлена экспериментальная поддержка технологии динамического управления питанием Powerplay. Powerplay позволяет решить проблему с посредственной производительностью GPU Radeon в Linux, вызванную тем, что по умолчанию GPU запускается в режиме низкого энергопотребления, не позволяющего добиться максимальной производительности. Powerplay динамически отслеживает нагрузку на графическую подсистему и при необходимости повышает тактовую частоту GPU, переводя его в режим максимальной производительности. В настоящее время поддержка Powerplay реализована для GPU Tonga и Fiji, а также для интегрированных APU Carrizo и Stoney, использование нового драйвера AMDGPU с которыми демонстрирует существенное увеличение производительности. Из-за необходимости дополнительной стабилизации и тестирования кода режим Powerplay пока отключен по умолчанию, для включения следует передать ядру параметр "amdgpu.powerplay=1";
- Из драйвера Radeon полностью удалена поддержка переключения видеорежимов в пространстве пользователя (UMS), для управления видеорежимами теперь можно использовать только KMS;
- Расширены возможности DRM-драйвера для видеокарт Intel: добавлена поддержка будущего поколения чипов Kabylake, идущего на смену Skylake;
- Расширены возможности DRM-драйвера для видеокарт NVIDIA (Nouveau): представлена возможность изменения скорости для шины PCI Express;
- Включена новая версия Media controller API, позволяющая улучшить поддержку расширенных устройств Video4Linux (например, радио и TV) и дающая возможность использовать функциональность мультимедиа контроллера в других подсистемах, таких как DVB, ALSA и IIO;
- Обновлена реализация проекта по обеспечению создания универсальных многоплатформенных ARM-сборок, позволяющих использовать одну сборку ядра для загрузки на различных ARM-процессорах ARMv6 и ARMv7. В новой версии отмечается включение наработок по рефакторингу ARM-сборок и добавление новых подсистем для улучшения абстрагирования от особенностей каждой платформы.
- Поддержка новых ARM-плат: Sigma Designs Tango4, Raspberry Pi 2 (BCM2836), Rockchip RK3228, Freescale LS1043a, LogicPD DM3730, Cosmic+ M4 (Freescale Vybrid);
- Поддержка USB-контроллеров Mediatek MT65xx, Renesas USB3.0, Renesas R-Car 3 USB 2.0 PHYs, Hisilicon hi6220 USB PHYs;
- Поддержка криптографических ускорителей Rockchip и Intel C3xxx, C3xxxvf, C62x, C62xvf;
- Поддержка звуковых карт Imagination Technologies, звуковых сопроцессоров AMD и кодеков Cirrus Logic CS47L24, Rockchip rk3036 Inno, Dialog Semiconductor DA7217/DA7218, Texas Instruments pcm3168a, Realtec RT5616/5659;
Релиз ядра Linux 4.4
11 января 2016 года Линус Торвальдс анонсировал релиз ядра Linux 4.4[47].
Наиболее заметные изменения:
- использование Direct I/O и AIO для смонтированных в loop-режиме ФС,
- устойчивый к сбоям RAID5 с дополнительным журналированием,
- поддержка поллинга для блочных устройств,
- драйвер для SSD-накопителей Open-Channel на основе памяти NVM,
- работа слушающих TCP-сокетов в неблокирующем режиме,
- модернизированный системный вызов mlock2(),
- поддержка 3D в виртуальном GPU virtio-gpu,
- возможность запуска программ eBPF непривилегированными пользователями,
- поддержка постоянно работающих eBPF-программ,
- механизм определения потери TCP-пакетов RACK,
- KMS-драйвер для Raspberry Pi,
- xconfig переведён на Qt5.
В эту версию принято около 13 тыс. исправлений от 1548 разработчиков, размер патча - 49 МБ (изменения затронули 10606 файлов, добавлено 714106 строк кода, удалено 471010 строк). Около 44% всех изменений, представленных в 4.4, связаны с драйверами устройств. Примерно 16% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 15% связано с сетевым стеком, 4% - файловыми системами и 3% внутренними подсистемами ядра.
12.9% изменений внесли сотрудники компании Intel, 5.2% - Samsung, 5.1% - Red Hat, 3.5% - Atmel, 3.5% - Linaro, 2.3% - IBM, 2.1% - Google, 2.0% - SUSE, 1.8% - ARM, 1.6% - Texas Instruments, 1.6% - Freescale, 1.4% - AMD, 1.3% - Oracle.
Латиноамериканский Фонд свободного ПО опубликовал полностью свободный вариант ядра 4.4 - Linux-libre 4.4-gnu, очищенный от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В этом выпуске проведены операции по чистке блобов в драйверах qed, fdp, nfcmrvl, rtl8xxxu и rohm_bu21023, улучшен код чистки блобов в загрузчике микрокода, удалён драйвер ft1000.
Наиболее интересные, по мнению экспертов, модификации в ядре Linux 4.4:
- Дисковая подсистема, ввод/вывод и файловые системы
- Для файловых систем, примонтированных в режиме "loopback" (монтирование из файла с использованием блочного устройства loop), реализована возможность использования прямых (Direct I/O) и асинхронных (AIO) операций ввода/вывода при чтении и записи в файл, связанный с loop-устройством. Использование Direct I/O при обращении к файлу с образом ФС позволяет избежать двойного кэширования, существенно сокращает потребление памяти и уменьшает число переключений контекста;
- В подсистему MD интегрированы наработки компании Facebook по увеличению живучести программного RAID5 в случае краха системы. В частности, реализован режим журналирования RAID5, при котором на отдельном носителе (SSD или NVRAM) создаётся специальный журнал. Записываемые в RAID данные вначале сохраняются в журнале, а затем разносятся по входящим в RAID-массив дискам. Журнал позволяет гарантировать целостное состояние RAID в ситуациях неожиданного отключения питания, даже если RAID находился в деградированном состоянии. Если питание будет прервано на стадии когда составляющие транзакцию данные были записаны лишь на часть дисков, повреждения данных можно избежать так как вся информация о транзакции отражена в журнале. Журнал также позволяет повысить производительность некоторых операций и сократить задержки, но данные оптимизации пока не включены в состав ядра;
- Поддержка поллинга ввода/вывода для блочных устройств (I/O polling). Поллинг позволяет уменьшить нагрузку на систему при использовании высокопроизводительных устройств за счёт периодического опроса состояния вместо генерации прерываний. Как следствие, в определённых ситуациях включение поллинга позволяет существенно повысить пропускную способность и сократить задержки ввода/вывода. Включение производится через запись 1 в /sys/block/DEV/queue/io_poll. В настоящее время поддерживается только режим O_DIRECT, а реализация помечена как экспериментальная и предназначенная для тестирования;
- Реализована спецификация LightNVM, расширяющая драйвер NVM поддержкой SSD-накопителей, допускающих низкоуровневый прямой доступ к физическому носителю (например, первое поколение Open-Channel SSD-накопителей на основе памяти NVM). Для таких устройств ядро берёт на себя функции низкоуровневого управления хранилищем, которые в обычном Flash выполняются на уровне контроллера (FTL, Flash Translation Layer). LightNVM обеспечивает такие операции как управление размещением данных, сборка мусора и организация параллельного доступа. Функции управления сбойными блоками, атомарность ввода/вывода и размещение метаданных по-прежнему выполняются чипом накопителя;
- В клиент NFS добавлена поддержка операции CLONE, определённой в спецификации NFSv4.2 и позволяющей организовать быстрое копирование файлов, используя ioctl NFS_IOC_CLONE, реализованный по аналогии с BTRFS_IOC_CLONE;
- В Btrfs добавлена отладочная опция монтирования "fragment", установка которой приводит к излишней фрагментации данных и метаданных. Для RAID0/10/5/6 реализован фильтр балансировки разнесения групп блоков по дискам, позволяющий выборочно ребалансировать только блоки, не разнесённые на достаточное число устройств;
- В XFS добавлено отдельное накопление статистики для каждой файловой системы (/sys/fs/xfs/BLOCK/stats/stats) и реализован специальный файл /sys/fs/xfs/BLOCK/stats/stats_clear для очистки статистики. Глобальная статистика доступа в /proc и продублирована в /sys/fs/xfs/stats/stats;
- В CIFS реализована возможность выполнения операции копирования на стороне сервера (copy offload, CopyChunk) при копировании данных между разными разделами (share), размещёнными на одном сервере (ранее CopyChunk применялся только при копировании внутри одного раздела). Операция копирования на стороне сервера не требует перемещения данных по сети и производится до ста раз быстрее;
- В CIFS добавлены опции монтирования "nopersistenthandles" и "persistenthandles", управляющие включением расширений "persistent handles", предоставляющих средства для повышения доступности открытых файловых дескрипторов в кластерных конфигурациях. Также добавлена опция "resilienthandles", позволяющая снизить вероятность потери данных в случае сбоя при подключении к серверам без поддержки "persistent handles";
- Для блочных устройств представлен интерфейс Persistent Reservations, позволяющий зарезервировать за определённой системой область в совместно используемых хранилищах;
- Сетевая подсистема
- Обработка слушающих TCP-сокетов (listen) полностью избавлена от установки блокировок (lockless). Тесты показывают, что после задействования неблокирующего режима производительность слушающих сокетов увеличилась на 2-3 порядка (!), например, один слушающий сокет теперь способен обработать 3.5 млн SYN-пакетов в секунду;
- В setsockopt() добавлена поддержка флага SO_INCOMING_CPU и расширена логика выбора CPU при использовании SO_REUSEPORT. SO_INCOMING_CPU позволяет организовать обработку в текущем процессе только тех пакетов, которые до этого были обработаны сетевым стеком на том же CPU. Закрепление привязанных к одному CPU RX-очередей и обработчиков слушающих сокетов позволяет более эффективно использовать процессорный кэш;
- Добавлен RACK - новый механизм определения потери TCP-пакетов, который в отличие от штатного метода определения факта потери пакета, отталкивается от времени передачи, а не последовательности прихода пакетов. Суть работы RACK в том, что при получении ACK-подтверждения для пакета, любые неподтверждённые пакеты, отправленные как минимум на RTT (round-trip time) раньше подтверждённого пакета, считаются потерянными и потребуют повторной отправки. Новый алгоритм уже протестирован в инфраструктуре Google и будет предложен для утверждения в качестве стандарта IETF;
- Память и системные сервисы
- Возможность загрузки программ eBPF непривилегированными пользователями для их использования в качестве фильтров для сокетов. Ранее из соображений безопасности доступ к системному вызову ebpf() был открыт только пользователю root. В текущей версии ядра код проверки корректности загружаемых программ был значительно улучшен и непривилегированным пользователям дана возможность запуска ограниченных по функциональности программ eBPF, которые могут использоваться для создания простых сетевых фильтров. Возможности eBPF по трассировке, классификации трафика и манипуляциям с данными ядра по-прежнему доступны только для root. Для запрета обращения к системному вызову ebpf() из непривилегированных процессов добавлен sysctl kernel.unprivileged_bpf_disabled;
- Возможность постоянного выполнения eBPF-программ и сопоставлений (Persistent eBPF maps/progs), продолжающих работу и после завершения процесса, инициировавшего их выполнение. Объекты выполняемого eBPF размещаются в области /sys/fs/bpf/ и могут совместно использоваться несколькими процессами. Например, таким способом удобно создавать классификаторы и обработчики трафика;
- Добавлен фреймворк "devfreq cooling" для управления температурным режимом устройств, позволяющий при наличии соответствующей аппаратной поддержки перевести перегревающееся устройство в режим пониженного энергопотребления для удержания температуры в заданных границах;
- Добавлен системный вызов mlock2(), расширяющий возможности системного вызова mlock() поддержкой дополнительного аргумента, позволяющего задействовать новый режим блокировки VM_LOCKONFAULT, при котором страницы памяти в указанном диапазоне будут закреплены в ОЗУ не сразу, а только после возникновения page fault (обращение к невыделенным страницам памяти);
- Изменено содержимое файлов "stat", размещённых в поддиректории каждого процесса в /proc (например, /proc/123/stat). Поле wchan (30 столбец), которое содержало абсолютный адрес, по которому был заблокирован процесс, могло использоваться злоумышленниками для получения важной информации о ядре. Отныне данное поле переведено в разряд флагов: содержит ноль для выполняемых процессов и единицу для заблокированных;
- Многочисленные улучшения в утилите perf. Например, perf теперь может собирать и загружать программы eBPF для решения задач мониторинга производительности и трассировки событий;
- Добавлен модуль userio с реализацией протокола, позволяющего в пространстве пользователя эмулировать устройства с последовательным портом ввода/вывода, такие как тачпады;
- Для систем x86 добавлен параметр конфигурации CONFIG_DEBUG_WX, при включении которого ядро будет выдавать предупреждения о маппинге секций памяти, одновременно помеченных доступными на запись и выполнение;
- Графический конфигуратор xconfig портирован на Qt5. Поддержка сборки xconfig с Qt3 прекращена;
- Виртуализация и безопасность
- В KVM и VFIO добавлена возможность обработки аппаратных прерываний в гостевой системе без проброса через прослойку, работающую на стороне хоста - прерывания от устройств PCI передаются напрямую в vCPU;
- Вложенная виртуализация в KVM теперь поддерживает VPID по аналогии с PCID, но для vCPU;
В KVM добавлена поддержка разбиения кода контролера прерываний, при которой LAPIC реализуется в ядре, а IOAPIC/PIC/PIT в пространстве пользователя, что уменьшает подверженность гипервизора некоторым типам атак;
- В драйвер VMware balloon, позволяющий исключить дублирование идентичных областей памяти в разных виртуальных окружениях, добавлена возможность манипулирования страницами памяти размером 2 Мб, что значительно уменьшает накладные расходы на стороне гипервизора и гостевой системы при выполнении операций связывания (ballooning) и разделения (unballooning) общей памяти;
- Поддержка аппаратных генераторов случайных чисел ST Microelectronics;
- В ptrace добавлена поддержка формирования дампа задействованных для процесса фильтров seccomp (PTRACE_SECCOMP_GET_FILTER);
- Оборудование
- Устройство virtio-gpu (виртуальный GPU), развиваемое в рамках проекта Virgil, расширено поддержкой 3D-операций, что позволит задействовать OpenGL и средства 3D-ускорения в виртуальных окружениях на базе QEMU и KVM без эксклюзивного проброса видеокарты в гостевую систему. Virtio-gpu позволяет организовать 3D-рендеринг внутри гостевых систем с задействованием GPU хост-системы, но при этом виртуальный GPU работает независимо от физического GPU хост-системы;
- Добавлена подсистема для поддержки устройств широтно-импульсной модуляции (PWM, Pulse-width modulator) и реализована поддержка PWM-контроллеров Renesas R-Car, Marvell Berlin, Broadcom BCM7038 и MediaTek PWM;
Добавлен KMS-драйвер vc4 с поддержкой GPU Broadcom VideoCore 4, используемых в Raspberry Pi. Драйвер ограничен переключением видеорежимов на уровне ядра и управлении курсором, но пока не поддерживает 3D и управление питанием;
- Расширены возможности DRM-драйвера для видеокарт Intel: поддержка HPD (Hot Plug Detect) и загрузчик прошивок, специфичных для движков GuC;
- Расширены возможности DRM-драйвера для видеокарт NVIDIA (Nouveau): улучшены средства управления частотой GPU, расширена поддержка GPU GK20A (Kepler) и GK107 (GeForce 600);
- Расширены возможности DRM-драйвера для видеокарт AMD (Radeon и amdgpu): поддержка платформы AMD Stoney Ridge. В amdgpu по умолчаннию включён планировщик GPU, улучшена поддержка GPU AMD Carrizo, Tonga и Fiji, реализованы новые опкоды AtomBIOS;
- Поддержка SoC Broadcom Northstar Plus;
- Поддержка сетевых адаптеров: Texas Instruments DP83848, Hisilicon Network, Allwinner A10 CAN, Broadcom Cygnus, Broadcom NetXtreme-C/E 10/25/40/50 gigabit Ethernet, Microchip ENC424J600 ethernet, Mellanox Technologies Spectrum Ethernet, QLogic QED 25/40/100Gb Ethernet, Realtek RTL8XXXU, Intel Fields Peak NFC и Marvell NFC-over-I2C/SPI.
2015
Так просто взломать Linux?
17 декабря 2015 издание Lifehacker сообщило [48] об уязвимости Linux.
Двое исследователей из политехнического университета Валенсии обнаружили уязвимость в ОС. Они выявили критическую уязвимость в загрузчике GRUB для Linux. Она позволяет обойти блокировку загрузки системы паролем и получить полный доступ к консоли[49].
Для этого необходимо физически находиться за компьютером и 28 раз нажать клавишу Backspace в поле имени или пароля. После этого компьютер перезагрузится и запустит Grub rescue shell. Отсюда можно получить доступ к файловой системе Linux, скопировать файлы на флэш-носитель или с нее внести вирус в систему.
Патч исправления этой ошибки уже создан. Выпустили его сами исследователи. Его можно установить для Ubuntu, Red Hat и Debian. Издание рекомендовало пользователям: посмотреть на проблему безопасности Linux с точки зрения "физического" вторжения в систему, т.е. если сетевую безопасность и защиту кода разработчики Linux обеспечили так или иначе, то ограничить доступ к машинам людей, мыслящих неординарно, у них пока не получилось.
Релиз ядра Linux 4.3
2 ноября 2105 года Линус Торвальдс анонсировал релиз ядра Linux 4.3[50].
Среди наиболее заметных изменений:
- удаление обособленного драйвера ФС ext3,
- отключение поддержки режима VM86,
- средства для наследования capabilities,
- включение по умолчанию сборки с IPv6,
- реализация виртуальных таблиц маршрутизации, сетевой планировщик "overflow",
- возможность обработки page fault в пространстве пользователя,
- дополнительная защита от fork-бомб,
- фреймворки для разработки драйверов NVMEM и MOST,
- зависимость от openssl-devel при сборке с поддержкой верификации модулей по цифровым подписям.
В эту версию принято около 11 тысяч исправлений от полутора тысяч разработчиков, размер патча - 42 Мб (изменения затронули 10388 файлов, добавлено 643628 строк кода, удалено -333888 строк). Около 48% всех представленных в 4.3 изменений связаны с драйверами устройств, примерно 18% изменений имеют отношение к обновлению кода специфичного для аппаратной архитектуры, 11% связано с сетевым стеком, 3% - файловыми системами и 4% - внутренними подсистемами ядра.
Модификации:
- Дисковая подсистема, ввод/вывод и файловые системы
- Из состава ядра исключён драйвер ext3, так как он является дублирующим - функции работы с разделами ext3 имеются в драйвере ext4, который полностью обратно совместим с прошлым поколением ФС и может использоваться в качестве прозрачной замены драйвера ext3;
- Параметр discard_max_bytes теперь доступен на запись, что позволяет ограничивать максимальный размер операций discard для блочного устройства. Опция даёт возможность увеличить отзывчивость в условиях обилия крупных discard-операций за счёт их разбиения на более мелкие;
- Для файловой системы F2FS реализован ioctl F2FS_GARBAGE_COLLECT для внепланового вызова операции сборки мусора из пространства пользователя;
- Большая порция незначительных исправлений для файловых систем Btrfs, ext4 и XFS; Из улучшений Btrfs можно выделить реализацию флага BTRFS_RBIO_REBUILD_MISSING для RAID 5/6 и поддержку контроллеров blkio. В ext4 и xfs отмечены только исправления.
- Память и системные сервисы
- Осуществлено блокирование поддержки устаревшего 16-разрядного виртуального режима адресации VM86, в условиях, когда значение vm.mmap_min_addr не равно нулю. Разработчики столкнулись с дилеммой: с одной стороны режим VM86 может быть использован для совершения атак и его сохранение негативно повлияет на безопасность, но с другой стороны VM86 востребован для работы DOS-эмуляторов, т.е. подпадает под один из главных принципов разработки ядра - сохранение неизменности программных интерфейсов для приложений пространства пользователя. В итоге, было достигнуто компромиссное решение: блокировать работу VM86 только при установке ненулевых значений нижнего лимита маппинга памяти (vm.mmap_min_addr), при которых DOS-эмуляторы заведомо неработоспособны. Так как vm.mmap_min_addr по умолчанию установлен в 4096, то для большинства конфигураций VM86 будет отключен. При необходимости запуска DOS-эмулятора, пользователи должны установить vm.mmap_min_addr в ноль и тогда VM86 будет автоматически активирован.
- В состав ядра принят API userfaultfd для реализации обработчиков обращений к невыделенным страницам памяти (page faults) в пространстве пользователя. Обработка "page faults" в пространстве пользователя необходима для оптимизации выполнения live-миграции гостевых окружений KVM без остановки работы гостевой системы. Для ускорения миграции гостевое окружение может быть переключено на новый хост c оставлением рабочей памяти на старом хосте. При обращении к ещё не перенесённой памяти в новом окружении будет сгенерирован "page fault", на основании которого специальный обработчик в пространстве пользователя загрузит отсутствующий блок памяти по сети и разместит в адресном пространстве гостевой системы. Подобный подход позволит обойтись без реализации протокола live-миграции на стороне ядра.
- Возможность прикрепления eBPF-обработчиков к контрольным проверкам uprobes (userspace probes), используемым для анализа поведения выполняемых в пространстве пользователя приложений. Указанная возможность позволяет применять BPF для трассировки кода в пространстве пользователя.
- В состав набора исходных текстов ядра включена библиотека libbpf, предоставляющая средства для работы со скриптами BPF. В настоящее время библиотека уже задействована в утилите perf;
- В cgroups добавлен механизм "PIDs controller" для противодействия наводнению системы процессами (защита от fork-бомб). PIDs controller даёт возможность задать лимит на максимальное число процессов в группе, при превышении которого блокируется создание новых задач через вызовы fork() и clone();
- Для архитектуры MIPS реализована поддержка системы контрольных проверок uprobes (userspace probes);
- Реализованы средства для отслеживания редко используемых (idle) страниц памяти, что может применяться для оптимизации распределения памяти между контейнерами и виртуальными машинами;
- Добавлен новый системный вызов membarrier() для установки барьеров на память для всех работающих в системе потоков;
- Виртуализация и безопасность
- Возможность наследования capabilities дочерними процессами, запускаемыми через execve(). Основная идея в предоставлении привилегированным процессам, работающим не под пользователем root, возможности запускать другие программы, передавая им ограниченный набор расширенных прав. Для включения наследования применяется маска PR_CAP_AMBIENT, указываемая для подлежащих наследованию capabilities;
- В ptrace() добавлена новая операция PTRACE_O_SUSPEND_SECCOMP, позволяющая заморозить выполнение фильтров seccomp, что может применяться для заморозки процессов, находящихся в режиме seccomp. Операция доступна только для процессов с привилегиями CAP_SYS_ADMIN в первичном пространстве идентификаторов процессов;
- В подсистему Smack добавлена возможность привязки меток к адресам IPv6;
- В подсистему SELinux добавлена поддержка проверки вызовов ioctl() в разрезе отдельных команд;
- Правила аудита теперь могут привязываться к процессам на основе привязки к запущенному исполняемому файлу;
- Реализована поддержка режима "privileged access never", доступного в новых процессорах ARM/ARM64 и позволяющего ограничить доступ кода, работающего на уровне ядра, к адресам в пространстве пользователя;
- В proc добавлен новый файл /proc/kpagecgroup, который содержит информацию о привязке cgroups к страницам физической памяти;
- Верификация модулей по цифровым подписям переведена на формат PKCS#7, что требует наличия openssl-devel при сборке ядра с поддержкой цифровых подписей;
- Сетевая подсистема
- Ядро теперь по умолчанию собирается со встроенной поддержкой IPv6 (ранее IPv6 собирался в виде модуля ядра), что привело к увеличению размера базовой сборки ядра на 270Кб;
- В сетевую подсистему добавлена поддержка инфраструктуры для создания легковесных туннелей "lwtunnel", реализующих технику инкапсуляции потока без использования отдельного сетевого интерфейса и связанных с ним накладных расходов;
- Начальная поддержка виртуальных таблиц маршрутизации VRF (Virtual Routing and Forwarding), позволяющих организовать работу нескольких доменов маршрутизации на одной системе. Например, VRF можно использовать для создания изолированных контейнеров с отдельными таблицами маршрутизации;
- В подсистему Open vSwitch добавлен модуль для взаимодействия с механизмом ядра по отслеживанию состояния соединений (conntrack);
- Добавлена возможность ILA (Identifier Locator Addressing), предназначенная для организации обращения к задачам, мигрирующим с одной машины на другую. Суть метода в присвоении каждой задаче уникального идентификатора, не привязанного к конкретному местоположению в сети, но ассоциированного с определённым адресом IPv6;
- Новый сетевой планировщик "overflow" для распределения нагрузки в условиях виртуализации серверов. Суть алгоритма в направлении сетевых соединений к серверу с наибольшим весом и переходом к следующему серверу при достижении заданного для текущего узла лимита активных сетевых соединений.
- Оборудование
- В ветку staging добавлена новая подсистема MOST (Media Oriented Systems Transport), предоставляющая средства для создания сетевых и мультимедийных драйверов на основании спецификаций MOST, развиваемых для автомобильных систем;
- Добавлен NVMEM Framework (Non Volatile Memory layer), предоставляющий API для разработки драйверов для устройств постоянной памяти, таких как eeprom и efuses;
- Расширены возможности DRM-драйвера для видеокарт Intel: включена по умолчанию поддержка чипов Gen9 (Skylake), которая признана стабильной;
- Расширены возможности DRM-драйвера для видеокарт NVIDIA (Nouveau): выполнена внутренняя переработка и чистка кода, улучшены средства управления питанием для GPU GT200, добавлена начальная поддержка GM20B (Tegra X1);
- Расширены возможности DRM-драйвера для видеокарт AMD (Radeon): начальная поддержка AMD Radeon R9 Fury (Fiji), решены проблемы с Maxwell DisplayPort;
- В DRM-драйвер vmwgfx для систем виртуализации VMware добавлена возможность использования OpenGL 3.3 в гостевых системах (раннее поддерживался OpenGL 2.1);
- Для архитектуры s390 реализована поддержка режима "fake NUMA", позволяющая представить крупную систему в форме набора эмулируемых узлов NUMA, упрощающих партицирование нагрузки;
- Поддержка криптографических акселераторов Allwinner Security System и Intel DH895xCC;
- Поддержка звуковых кодеков Cirrus Logic CS4349, Realtek ALC298 и STI SAS;
- Поддержка отечественной DVB-S2/T2/C2-платы NetUP Universal DVB CI.
Вышел релиз ядра Linux 4.2
30 августа 2015 года Линус Торвальдс анонсировал релиз ядра Linux 4.2[51].
Среди заметных изменений:
- интеграция драйвера AMDGPU,
- поддержка стекового подключения LSM-модулей,
- новый метод формирования энтропии для генератора псевдослучайных чисел,
- новый классификатор пакетов Flower,
- оптимизация ассемблерного кода для архитектуры x86,
- поддержка туннелей GENEVE,
- средства шифрования в F2FS,
- драйвер virtio-gpu с реализацией виртуального GPU,
- подсистема libnvdimm.
В эту версию принято около 13 тыс. исправлений от 1569 разработчиков, размер патча - 64 Мб (в два раза больше, чем патч с ядром 4.1. Изменения затронули 10926 файлов, добавлено 1081330 строк кода, удалено 282089 строк). Около 42% всех изменений, представленных в 4.2, связаны с драйверами устройств, примерно 20% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 4% - с файловыми системами и 4% c внутренними подсистемами ядра.
Разработчики отметили изменения:
- Дисковая подсистема, ввод/вывод и файловые системы
- В F2FS, развиваемую компанией Samsung высокопроизводительную файловую систему для Flash-накопителей, добавлена возможность шифрования на уровне отдельных файлов и поддержка операций FALLOC_FL_ZERO_RANGE и FALLOC_FL_COLLAPSE_RANGE для управления резервированием пустых областей через вызов fallocate();
- В ext4 добавлена поддержка опции FALLOC_FL_INSERT_RANGE, позволяющей осуществить подстановку обнулённого блока в существующий файл через вызов fallocate();
- В XFS появилась возможность использования интерфейса DAX для прямого доступа к устройствам постоянной памяти (persistent-memory) в обход страничного кэша (полезно для NVDIMM);
- В Btrfs обновлена реализация квот для подразделов. Расширена связанная с Btrfs информация в sysfs;
- В файловую систему CIFS добавлена экспериментальная поддержка протокола SMB 3.1.1;
- В модуле dm-cache, предназначенном для ускорения доступа к жестким дискам через применение кэширования на SSD-накопителях, добавлена поддержка SMQ-кэширования (stochastic-multi-queue), решающего проблемы с большим потреблением памяти при кэшировании с привлечением нескольких очередей (multi-queue);
- В libata улучшена поддержка NCQ (Native Command Queuing) TRIM. Для включения и отключения NCQ TRIM представлены параметры ncqtrim и noncqtrim;
- Память и системные сервисы
- Код выборки по именам файлов переработан для исключения рекурсии, что позволило сократить нагрузку на стек, повысить надёжность работы сложных систем хранения и убрать лимит на глубину вложенных символических ссылок;
- В подсистему профилирования perf добавлена поддержка функциональности PEBSv3 (Precise Event-Based Sampling), присутствующей в новых процессорах Intel. Улучшена поддержка возможностей Intel PT (аппаратный трассировщик CPU) и Intel CQM (мониторинг качества утилизации кэша). Значительно расширены возможности утилиты perf: в 'perf top' реализована возможность динамического включения/выключения событий, в 'perf probe' добавлена поддержка глобальных масок имён функций и возможность сбора данных о всех аргументах функций, проведена подготовка к внедрению многопоточного варианта команды 'perf report';
- В систему обработки данных от термодатчиков, добавлен новый power-allocator, сочетающий раздельную обработку параметров нагрева отдельных элементов с попыткой поддержания общей температуры системы в заданных границах;
- Многочисленные оптимизации и переработки ассемблерного кода для архитектуры x86 (в дальнейшем часть кода планируют переписать на Си). Переработан и реструктуризирован код для взаимодействия с модулями операций с плавающей запятой (FPU);
- Добавлена новая подсистема ядра "libnvdimm", предоставляющая различные методы доступа к массивам энергонезависимой памяти (NVM, non-volatile memory), сочетающей производительность ОЗУ с возможностью постоянного хранения содержимого. Для процессора энергонезависимая память выглядит как обычное ОЗУ (отображается в пространство системной памяти в виде больших регионов физической памяти), но при этом данные не теряются после прекращения подачи энергии. Для записи данных в NVM-память представлены функции memremap_pmem(), memcpy_to_pmem() и wmb_pmem(). Обеспечена возможность представления регионов NVM-памяти в качестве отдельных виртуальных устройств. Через модуль "BTT" (block translation table) реализован слой для атомарного посекторного доступа к NVM-массивам, представленным в форме блочных устройств;
- Изменён подход к монтированию псевдо-ФС sysfs и /proc. Поддиректории для точек монтирования (например, /sys/debug) теперь специально помечены и монтирование допускается только в них. Добавлены средства для контроля соответствия флагов для уже примонтированных и новых экземпляров псевдо-ФС (для монтирования в контейнерах);
- Добавлена поддержка появившихся в спецификации UEFI 2.5 таблиц ESRT (EFI System Resource Table), которые необходимы для работы утилиты fwupdate для организации обновления системных прошивок на новом оборудовании;
- Виртуализация и безопасность
- Добавлен новый код формирования энтропии для генератора псевдослучайных чисел, основанный на учёте отклонения времени повторного исполнения определённого набора инструкций на CPU (CPU execution time jitter), которое зависит от множества внутренних факторов и непредсказуемо без физического контроля над CPU. Новый код решает проблему с недостаточным числом источников энтропии на встраиваемых устройствах;
- В гипервизор KVM добавлена поддержка множественных адресных пространств и режима системного управления (SMM, System Management Mode). Данные возможности позволяют реализовать поддержку режима верифицированной загрузки (Secure Boot) для гостевых систем;
- Реализована возможность стековой организации модулей LSM (Linux Security Modules), позволяющей выстраивать цепочки обработчиков, задействуя сразу несколько модулей. Например, теперь можно подключить специализированные LSM-модули в качестве надстройки поверх таких систем, как SELinux, Smack, TOMOYO и AppArmor.
- Реализовано устройство virtio-gpu (виртуальный GPU), развиваемое в рамках проекта Virgil. Драйвер предоставляет средства управления видеорежимами для гостевых систем KVM/QEMU с поддержкой VirtIO. В настоящее время драйвером пока поддерживается только возможность ускорения 2D-графики, поддержка 3D/OpenGL появится в дальнейшем;
- Сетевая подсистема
- Добавлен новый классификатор пакетов "Flower", который позволяет классифицировать пакеты на основе настраиваемой комбинации ключей и масок пакетов;
- Интегрирована поддержка туннелей GENEVE (Generic Network Virtualization Encapsulation);
- В подсистему netfilter добавлена поддержка классификации пакетов по времени их поступления (ingress-time);
В сокетах Unix-domain обеспечена поддержка системного вызова splice();
- Добавлен алгоритм контроля перегрузки (congestion-control), учитывающий отклонение величины ожидания (Delay-gradient);
- Оборудование
- В состав ядра принят код драйвера AMDGPU, разработанного для воплощения в жизнь новой стратегии продвижения драйверов для графических процессоров компании AMD, в рамках которой модуль ядра является полностью открытым, а проприетарный драйвер Catalyst будет включать лишь набор проприетарных библиотек, реализующих фирменные варианты OpenGL, OpenCL и т.п. Добавленный в ядро драйвер отвечает за поддержку GPU на основе GCN, начиная с R9 285 "Tonga" (семейство Volcanic Islands) и более новых;
- Возвращена поддержка архитектуры Renesas H8/300, которая несколько лет назад была исключена из ядра из-за заброшенного состояния и отсутствия сопровождающего. Новая реализация переписана и избавлена от ранее наблюдаемых ошибок;
- Расширены возможности драйверов для видеокарт Intel, NVIDIA (Nouveau) и AMD (Radeon): В Radeon добавлена поддержка блоков кодирования видео VCE1. В драйвер Intel добавлена начальная поддержка новых SoC Intel Atom Broxton с GPU Intel Gen 9 (Skylake). В Nouveau отмечены только исправления ошибок;
- Поддержка ARM SoC Freescale i.MX7D, HiSilicon hi6220 и ZTE ZX296702;
- Поддержка SATA-контроллеров Broadcom STB AHCI и CEVA AHCI;
- Поддержка третьего поколения блоков управления памятью для процессоров ARM;
- Поддержка беспроводных мышей Logitech M560 и контроллеров движения Sony;
- Поддержка беспроводных чипов Mediatek MT7601U и Atmel WILC1000, а также сетевых контроллеров Cavium ThunderX, Mellanox Technologies ConnectX-4, Texas Instruments DP83867 Gigabit PHY, Cavium LiquidIO и Unisys visornic.
Вышел пре-релиз Linux 4.2-RC1
7 июля 2015 года Линус Торвальдс анонсировал кандидата в релиз очередной версии ядра Linux[52].
Разработчик отметил Linux 4.2-RC1 как самый крупный релиз по количеству строк кода.
«Если вы оцениваете размер как количество изменённых строк, то это действительно самый большой rc [release candidate], который мы когда-либо создавали: добавлено более миллиона строк (и около четверти миллиона строк было удалено), — написал Линус в рассылке. - Довольно необычная ситуация, когда единственный драйвер составляет почти половину всего rc1 по количеству новых строк».
Значимая часть добавленных строк — фрагмент драйвера для видеокарт AMD. По словам Торвальдса, он составил 41 % от всего патча ядра (до версии Linux 4.2-RC1).
Предыдущий рекордсмен по количеству новых строк в ядре релиз Linux 3.11rc1, куда добавили распределённую файловую систему Lustre.
Вышел релиз Linux 4.1
21 июня 2015 года Линус Торвальдс представил релиз ядра Linux — 4.1[53].
«После очень тихой недели после выпуска 4.1-rc8 представлен финальный релиз 4.1. Не знаю, была эта неделя тихой по той причине, что действительно не проблем (стучу по дереву), или же люди проявили тактичность к моему отпуску — вне зависимости от причин я это оценил. Не похоже, что цикл релизов 4.1 был трудным, так что давайте надеяться, что дополнительная неделя его ожидания сделала релиз лучше. Это будет здорово, учитывая, что 4.1 станет релизом с длительной поддержкой (LTS)», - написал создатель ОС Linux в своем обращении к сообществу.
Линус Торвальдс, 2014
Среди значимых изменений в ядре Linux 4.1 можно выделить:
- существенные улучшения в производительности для некоторого оборудования;
- улучшения в энергопотреблении для некоторого железа Intel (в драйвере Intel DRM);
- поддержка ACPI для 64-битной архитектуры ARM (AArch64);
- поддержка ускорения для GeForce GTX 750 в видеодрайвере Nouveau;
- поддержка Intel XenGT vGPU для ускорения графики в гостевых системах, использующих виртуализацию Xen (поддержка для KVM в процесс реализации);
- поддержка Radeon DisplayPort MST;
- шифрование файловой системы ext4 (сделано специалистами Google для Android);
- улучшенная поддержка массивов RAID 5 и 6 в MD RAID;
- улучшенная поддержка ноутбуков от крупных производителей (в том числе, лучшая поддержка Chromebook Pixel 2);
- улучшения в поддержке микроархитектуры Intel Skylake (сама она появится позже в этом году).
Торвальдс анонсировал ядро Linux версии 4.0.
13 апреля 2015 года Линус Торвальдс представил релиз ядра Linux 4.0.
Среди наиболее заметных улучшений:
- интеграция базовых компонентов для обновления ядра Linux без перезагрузки,
- поддержка нескольких слоёв на чтение в overlayfs,
- реализация механизма для выявления ошибок работы с памятью,
- поддержка энергонезависимой памяти (NVM),
- возможность привязки к хостам алгоритмов контроля перегрузки,
- возможность установки меток на сетевые пакеты в модулях Smack,
- добавление в ext4 опции lazytime.
Номер версии 4.0 вместо ожидаемого 3.20 присвоен после голосования, в котором приняли участие более 31 тысячи участников сообщества, из которых 56% посчитали - настало время выпуска версии 4.0. Переход к нумерации 4.x действие формальное, обусловлено лишь эстетическими соображениями. Этот выпуск ядра оказался как нельзя лучшим претендентом на смену нумерации. Репозиторий приблизился к отметке в 500 тыс. коммитов и преодолел рубеж в 4 млн объектов. С выпуском ядра 3.0 преодолены рубежи в 250 тысяч коммитов и 2 млн объектов в Git.
С точки зрения функциональности выпуск 4.0 не содержит кардинальных изменений или нарушений совместимости и не выделяется среди других выпусков, плавно продолжая развитие действующей программной основы. Цикл разработки принёс меньше значимых изменений, нежели в предыдущих выпусках (10 тыс изменений против 12.5 тысяч в ядре 3.19). Последняя смена нумерации проведена в 2011 году, когда в ветке 2.6.x накопилось 39 релизов, на подготовку которых потрачено 10 лет.
В новую версию принято более 10 тысяч исправлений от 1403 разработчиков, размер патча - 34 Мб (изменения затронули 9489 файлов, добавлено 509084 строк кода, удалено 327296 строк). Около 45% всех изменений, представленных в 4.0, связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 4% - файловыми системами и 4% c внутренними подсистемами ядра.
11.6% изменений внесены сотрудниками компании Intel, 7% - Red Hat, 4.6% - SUSE, 4.0% - Linaro, 3.6% - Samsung, 2.2% - IBM, 1.6% - Freescale, 1.5% - Google, 1.4% - AMD, 1.4% - Texas Instruments, 1.4% - Oracle, 1.2% - Qualcomm, 1.2% - ARM.
Наиболее интересные новшества:
- Память и системные сервисы
- Интеграция базовой инфраструктуры, предоставляющей универсальный API для горячего наложения патчей на ядро. Код подготовлен в результате сотрудничества разработчиков SUSE и Red Hat, которые согласились задействовать данный API в реализациях систем обновления ядра без перезагрузки - kPatch и kGraft. В текущем виде, добавленный в ядро код позволяет создавать простые патчи для горячего устранения некоторых типов уязвимостей, но пока не может быть использован для более сложных изменений, так как не предоставляет средств для обеспечения непротиворечивости. Подробнее об особенностях добавленной в ядро инфраструктуры и отличиях kPatch от kGraft можно прочитать в ранее опубликованном анонсе.
- Приняты патчи для поддержки энергонезависимой памяти (NVM, non-volatile memory), сочетающей производительность ОЗУ с возможностью постоянного хранения содержимого.
- В состав исходных текстов ядра включена подборка вспомогательных скриптов scripts/gdb, упрощающих отладку с использованием GDB;
- Представлен новый отладочный механизм KASan (Kernel address sanitizer), который позволяет выявлять ошибки работы с памятью и факты некорректного обращения к памяти, такие как помещение кода в области памяти, не предназначенные для подобных манипуляций. Применение KASan пока ограничено архитектурой x86_64;
- Ядро теперь может быть собрано для запуска нитей RCU grace-period-handling с использованием системы приоритетов режима реального времени, что может оказаться полезным для выскоконагруженных систем;
- Удалён ранее объявленный устаревшим системный вызов remap_file_pages(), вместо которого добавлена заглушка, симулирующая его функциональность через использование нескольких виртуальных областей памяти, что позволило сохранить работоспособность приложений, использующих данный системный вызов;
- В механизм pstore, позволяющий сохранить отладочную информацию о причине краха в области памяти, не теряемые между перезагрузками, добавлена реализация специального файла /dev/pmsg0, позволяющего помещать в хранилище информацию из пространства пользователя.
- Реализация шины I2O перемещена в директорию staging в связи с планами по исключению в будущем подсистемы I2O из состава ядра;
- Дисковая подсистема, ввод/вывод и файловые системы
- В OverlayFS добавлена возможность использования более одного слоя, доступного только на чтение;
- Для файловых систем реализована поддержка опции монтирования lazytime, которая даёт возможность отследить время обращения к файлам, но не приводит к возникновению большого числа паразитных операций записи в ФС. Основное отличие от "atime" состоит в том, что время доступа сохраняется в inode, хранящихся в оперативной памяти, и сбрасываемых на диск только при возникновении явных условий или истечения достаточно длительного таймаута (раз в 24 часа). Таким образом для работающих программ возвращается всегда точный atime, но на диске сведения сохраняются с большой задержкой. Данный режим пока доступен только для ФС ext4;
- Реализация блочного сервера pNFS, позволяющего NFS-клиентам подключаться к совместно используемым дискам с применением блочного ввода/вывода вместо операций чтения и записи NFS. Поддержка нового режима пока реализована только для файловой системы XFS;
- Поддержка в pNFS слоя Flexible File Layout, позволяющем сохранять метаданные отдельно от содержимого файлов. Например, метаданные могут отдаваться с использованием NFSv4.1, а содержимое файлов при помощи протокола, предоставляемого хранилищем;
- В файловую систему Btrfs принята часть подготовленных компанией Facebook изменений, направленных на более грамотную обработку ситуаций исчерпания свободного дискового пространства. В Btrfs также внесена порция исправлений и чисток, большинство из которых связаны с обеспечением работы RAID 5/6;
- В dm-crypt внесены оптимизации для увеличения масштабируемости, которые позволили поднять производительность на крупных нагруженных системах.
- В файловой системе ubifs, предназначенной для использования на Flash-накопителях, обеспечена поддержка блочного слоя blk-mq (multiqueue block layer) с многоуровневой моделью очередей, рассчитанного на организацию многопоточного доступа к данным на многоядерных системах и позволяющего эффективно использовать возможности современных SSD-накопителей. В ubifs также добавлена поддержка расширенных атрибутов "security.*";
- Виртуализация и безопасность
- Подсистема Open vSwitch теперь генерирует собственные идентификаторы потока ("flow IDs"), которые используются для идентификации сетевых потоков в пространстве пользователя, что может привести к увеличению производительности до 40%;
- Подсистема Virtio (Virtual I/O Device) приведена в соответствие к недавно принятому стандарту virtio 1.0;
- Модулям безопасности Smack предоставлена возможность взаимодействовать с системой netfilter через установку меток на проходящие через фильтр пакеты.
- Код механизма межпроцессного взаимодействия Binder, созданный для платформы Android, снабжён хуками для применения политик SELinux;
- Сетевая подсистема
- В подсистеме управления трафиком добавлена поддержка фильтров, написанных с использованием языка виртуальной машины eBPF;
- В сетевом стеке обеспечена поддержка применения для определённых хостов специфичных алгоритмов контроля перегрузки (congestion-control) с привязкой через таблицу маршрутизации;
- В реализации сетевого протокола TIPC (Transparent Inter-process Communication), предназначенного для организации межпроцессного взаимодействия в кластере, обеспечена поддержка изолированных пространств имён (namespace);
- Оборудование
- Прекращена поддержка запуска 32-разрядных исполняемых файлов HP-UX на архитектуре PA-RISC;
- В драйвер Radeon добавлена поддержка передачи аудиоданных через интерфейс DisplayPort и решены проблемы с производительностью GPU AMD семейства Hawaii (R9 290 и R9 290X). В состав также включены патчи для улучшения управления системой охлаждения GPU на основе GCN, которые приводят к ощутимому снижению уровня шума для GPU за счёт снижения частоты вращения вентилятора;
- Расширены возможности драйверов для видеокарт Intel, включая начальную поддержку оборудования Intel Skylake;
- В Nouveau произведено слияние с драйвером для видеоподсистем NVIDIA, используемых в SoC на базе процессоров ARM. Добавлены средства для управления частотой GPU GK20A (Tegra K1);
- В подсистему LED добавлен новый класс устройств, позволяющий использовать светодиоды в режиме "вспышки" (как в фотокамере);
- Поддержка звуковых карт Studio Evolution SE6X;
- Поддержка сетевых контроллеров Rockchip SoC RK3288 10/100/1000 Ethernet, HISILICON P04 Ethernet, TI Keystone NETCP Ethernet, Kvaser USBcan II CAN, PEAK PCAN-USB/USB Pro CAN-FD.
- Поддержка SCSI-контроллеров Qualcomm UFS PHY;
- Поддержка USB-контроллеров Rockchip USB2 PHY и NXP ISP1761;
- В Video4Linux добавлена поддержка устройств захвата видео TI AM437x VPFE, декодеров Philips RC5/RC6 и USB-камер Touptek.
- Поддержка плат Intel Quark X1000, процессоров MIPS, построенных на базе архитектуры MIPS32 R6, процессоров IBM s/390 z13, одноплатных ПК Artesyn MVME2500, Conexant Digicolor SoC, NVIDIA Tegra132 SoC, Freescale LS2085A SoC и Mediatek MT65xx & MT81xx ARMv8 SoC.
В создании Linux лидируют индивидуальные разработчики и Intel
Согласно отчету начала 2015 года Linux Foundation под заголовком Linux Kernel Development: «Разработка ядра Linux: насколько быстро она ведется, кто этим занимается, что они делают и кто это спонсирует», 19,4% всех разработок ядра Linux с сентября 2013 г., выполнили индивидуальные разработчики, но все остальное создано корпоративными программистами.
В первом ряду сотрудники Intel, за которыми числится 10,5% кода Linux. Процессорный гигант вытеснил с первого места Red Hat, чей показатель составил 8,4%. При этом количество участников разработки поднялось с 1266 при создании Linux 3.11 до 1458 при выпуске Linux 3.18.
За Intel идут Red Hat — 8,4%, Linaro — 5,6%, Samsung — 4,4%, IBM — 3,2% и SUSE — 3%. В целом, как констатирует отчет Linux Foundation, «больше 80% всех разработок ядра с очевидностью принадлежит программистам, которым платят за их работу»[54].
Упомянутый отчет охватывает завершенные работы по ядру Linux вплоть до версии 3.18 с упором на релизы с 3.11 по 3.18. Приглядевшись к компаниям, внесшим вклад в разработки, можно заметить, что в центре внимания сообщества разработчиков ядра остается x86 Linux. Однако присутствие в списке компаний Linaro и Samsung показывает, что платформы ARM и Android начинают отнимать заметную долю труда программистов.
В ядро внесли свой вклад в общей сложности больше 4 тыс. разработчиков от 200 компаний. Половина из них были вовлечены в эту работу впервые. Хотя эта цифра кажется большой (так оно и есть), Foundation также констатирует, что «основную долю работы выполняет сравнительно небольшое число людей. В каждом конкретном цикле разработок примерно треть участников внесла лишь по единственному патчу». С релиза 2.6.11 первый десяток ведущих разработчиков внес 36 664 изменения — 8,2% общего числа. Первая тридцатка разработчиков внесла чуть больше 17% всего кода.
Особое впечатление производит тот факт, что сообщество по разработке ядра Linux интегрирует предлагаемые патчи со средней скоростью 7,71 патча в час. Не в день, а именно в час. А среднее количество дней, затрачиваемых на создание релиза, уменьшилось с прошлогодних 70 дней до 66.
Со времени выпуска в апреле 2013 г. ядра Linux версии 3.10 в Linux добавилось много новых функций.
Среди них, в частности, можно упомянуть опцию O_TMPFILE для создания временных файлов; поддержку протокола NFS 4.2; поддержку виртуализации на архитектуре ARM64 с использованием Xen и KVM; технологию zswap сжатого swap-кэширования; поддержку использования GPU-движков рендеринга независимо от графического дисплея; поддержку блоковым уровнем ядра нескольких очередей запросов для ускорения операций ввода-вывода при использовании высокопроизводительных дисков; сетевой экран nftables, призванный со временем заменить iptables; EDF-планировщик режима реального времени с приоритетом задач, требующих более раннего завершения; множество усовершенствований в выполнении сетевых задач; основательную переработку подсистемы cgroups; поддержку «file sealing» (ограничение числа допустимых операций над файлом)* для безопасных коммуникаций между процессами; и многослойную файловую систему overlayfs, объединяющую другие файловые системы в одну. Ко всему этому конечно надо добавить сотни новых драйверов и тысячи исправлений.
Объем вклада неоплачиваемых разработчиков год за годом медленно падает. Он составлял 14,6% в 2012 г., 13,6% в 2013 г. и ныне 11,8%.
Конечно, возможно, это всего лишь признак успеха Linux. ИТ-отделам компаний, которые сами по себе могут не иметь никакого отношения к технологии, сейчас нужны опытные Linux-инженеры и программисты. Этот фактор в Linux Foundation считают наиболее правдоподобным. Как ни как, а «число разработчиков ядра ограничено, и у каждого, кто продемонстрирует способность вставить код в стержневую ветку проекта, скорее всего не будет проблем с поиском места работы».
В то же время чуть больше половины новых участников разработки ядра Linux уже работают в какой-то компании. Особенно это относится к Intel, которая поставляет новых разработчиков Linux втрое больше остальных. Но и Samsung, IBM, Google и Huawai тоже помогают своим программистам влиться в ряды разработчиков ядра Linux.
Linux Foundation также выяснил, что контролем кода ядра Linux, как правило, занимаются в компаниях. Больше всего этой работой занимается Red Hat с долей 18,8%, за ней следует сам Linux Foundation с 14,8%, далее Intel — 12,2%, Linaro — 9,3%, Google — 5,8% и Samsung — 5,2%.
Во время выступления на конференции Linux Collaboration Summit в феврале 2015 года исполнительный директор Linux Foundation Джим Землин (Jim Zemlin) заявил, что Linux постоянно привлекает новых разработчиков и программистов. По словам Землина, с сентября 2013 года по февраль 2015-го более 96 тыс. изменений в ядро Linux внесли 4169 индивидуальных разработчиков, половина из которых сделали это впервые[55] .
2014: Linux 3.8
В новое ядро интегрирована более глубокая поддержка аппаратных возможностей компьютеров и оптимизирована работа драйверов. Среди отличительных особенностей Linux 3.8 указывается, что в нём больше не поддерживаются процессоры 386-DX/SX. В то же время добавлена поддержка горячего подключения/отключения базового CPU для архитектуры x86.
Серьезным видоизменениям подверглись файловые системы ядра. К примеру, в Ext4 добавлена поддержка inline-хранения данных; для Btrfs реализована поддержка быстрой замены диска; для XFS появился новый механизм обеспечения целостности хранимых в журнале метаданных, а также добавлена новая виртуальная файловая система `efivars`, предназначенная для доступа к загрузочным переменным UEFI. Состав ядра дополнила разработанная компанией Samsung файловая система F2FS, ориентированная для использования на флэш-памяти.
Обеспечена поддержка пространств имён для непривилегированных пользователей, которая в прошлых выпусках ядра была доступна только для пользователей с правами `root`. Существенной переработке подверглась система для учёта и ограничения потребления ядром памяти, расходуемой в процессе обеспечения работы заданного набора процессов, привязанных к группе контроля.
Ядро Linux 3.8 получило ускоренную обработку криптографических операций (например, ускорены шифры camellia,cast5, serpent, twofish, cast6) с использованием набора команд AVX на новых процессорах Intel. На аппаратном уровне в ядро осуществлена интеграция нового 2D-драйвера для платформ Tegra 2 и Tegra 3, а также существенно расширен список поддерживаемых звуковых устройств. Заявлена улучшенная производительность сетевых драйверов, которые используются для виртуализации, а также значительно расширен спектр поддерживаемых устройств.
Всего же в новую версию принято около 11 тыс. исправлений от более чем 1200 разработчиков, размер патча — 42 Мб (изменения затронули 11 701 файла, добавлено 577 870 строк кода, удалено 352 678 строк). Около 44% всех представленных в 3.8 изменений связаны с драйверами устройств, примерно 25% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур (основная масса изменений касается платформ на основе ARM), 11% связано с сетевым стеком, 3% — с файловыми системами и 4% c внутренними подсистемами ядра.
2013: Linux 3.11
В августе 2013 года создатель Linux Линус Торвальдс (Linus Torvalds) объявил, что до релиз очередной версии 3.11 остались считанные недели. Версия выходит на рынок спустя 22 года после появления Linux в открытом доступе, чему Торвальдс посвятил отдельный пост в своем блоге[56] на Google+, иронизируя в связи с важной датой:
«Добрый день всем, кто использует Linux – Я делаю (бесплатную) операционную систему (это только хобби, несмотря на то, что она большая и профессиональная) для 486+ AT клонов и всё такое прочее. Несмотря на то, что это длится с 1991 года, она всё ещё не готова. Я буду рад любому фидбэку по поводу того, что вам нравится или не нравится в Linux 3.11-rc7», - написал Торвальдс.
В этом отрывке Торвальдс недвусмысленно провел параллель с первым постом, которым он сообщил миру о создании Linux в 1991 году, тогда он написал буквально следующее:
«Всем привет, кто использует minix – Я делаю (бесплатную) операционную систему (это только хобби, не такую большую и профессиональную как gnu) для 386(486) AT клонов», - такое сообщение появилось сети 26 августа 1991 года.
Версия ядра Linux 3.11 имеет кодовое имя Linux for Workgroups (Linux для рабочих групп). Интересно, что 20 лет назад Microsoft также выпускала операционную систему с подобным названием - Windows 3.11 for Workgroups. Одной из главных особенностей нового ядра должна стать поддержка графических чипов AMD Radeon.
2012: Microsoft подключается к разработке
3 апреля 2012 года организация Linux Foundation объявила о выходе очередной версии отчета Linux Kernel Development: How Fast It is Going, Who is Doing It, What They are Doing and Who is Sponsoring It. Он выходит приблизительно на ежегодной основе и дает представление о ходе работ по разработке ядра Linux, в частности, с момента выхода предыдущей версии в декабре 2010 года, начиная с релиза 2.6.36 до 3.2.
Пожалуй, самым неожиданным (или наоборот, предсказуемым) событием стало непосредственное участие Microsoft в работах над созданием ядра Linux. Вчерашний непримиримый враг свободно распространяемого ПО, некогда называвший Linux «раковой опухолью», впервые пошел на такой шаг. Более того, в настоящий момент корпорация занимает 17 место в списке компаний, оказавших наибольшую поддержку разработке Linux. На ум приходит известная пословица: не можешь победить врага – возглавь его.
В двадцатку крупнейших контрибуторов ядра Linux вошла и российская компания Parallels. В течение последнего года ее специалисты работали над включением в ядро исходного кода контейнеров серверной виртуализации. В том или ином виде они используются в большинстве «мега-облаков» уровня Google, Facebook и др. По сравнению с гипервизорами (виртуальными машинами) контейнеры дают большую плотность виртуальных сред на физический сервер и обеспечивают почти нативное быстродействие запущенных в них приложений.
Первую десятку оказавших поддержку компаний составляют Red Hat, Intel, Novell, IBM, Texas Instruments, Broadcom, Nokia, Samsung, Oracle и Google (в порядке убывания мест в рейтинге). В приведенном списке особое внимание на себя обращает Nokia – сторонник мобильной платформы Microsoft Windows Phone. Финский производитель телефонов занимает даже более высокое седьмое место, чем известные апологеты Linux – Oracle и Google. Все это позволяет с уверенностью говорить, что Linux приобрела статус индустриальной ОС в корпоративном и мобильном сегменте. Достаточно вспомнить Android, KVM, Xen, облачные вычисления.
С момента начала создания подобного рода отчетов в 2005 году в создании Linux приняли участие около 800 различных компаний и свыше 7800 разработчиков. После выхода последнего отчета – более 1000 разработчиков из примерно 200 компаний. В то же время три четверти всех работ выполнили специалисты, чей труд оплачивался на коммерческой основе.
2011: Fedora и openSUSE опережают Ubuntu по популярности
Согласно исследованию сайта DistroWatch (ноябрь 2011 г), доля операционной системы Ubuntu, которая долгое время считалась самым популярным в мире дистрибутивом Linux, за последнее время заметно сократилась, и теперь Ubuntu опережают Fedora, Mint и openSUSE[57].
Mint сейчас занимает первое место в рейтинге DistroWatch, заметно опережая своих конкурентов – ее доля среди дистрибутивов Linux составила около 11%.
Доля Fedora и openSUSE составляет примерно по 6% рынка. Показатель Ubuntu в то же время опустился примерно до 4%. В 2005 г. Ubuntu занимала более 10% рынка операционных систем на основе Linux, однако с тех пор ее доля неуклонно снижалась.
По мнению экспертов, одной из причин заметного падения популярности Ubuntu может являться изменение пользовательского интерфейса в версии 11.04, которая вышла в апреле 2011 г. под кодовым названием Natty Narwhal: в этой версии была использована оболочка Unity, ранее применявшаяся в версии Ubuntu Netbook Edition.
Пользователи восприняли интерфейс Unity крайне неоднозначно, что вполне могло повлиять на их переход к альтернативным Ubuntu операционным системам, и, в частности, к клону Ubuntu - Linux Mint.
С 2010 года доля Ubuntu сократилась уже более чем на 47%, тогда как популярность Mint, основанной на дистрибутиве Ubuntu, выросла на 105%. Впрочем, DistroWatch отмечают, что, несмотря на общее падение доли Ubuntu, количество посещений страниц с этим дистрибутивом на DistroWatch почти удвоилось.
За 2011 год лидерами среди Linux-систем являлись Debian, Fedora, Mint, openSUSE и Ubuntu. Если Ubuntu и Debian в течение этого времени теряли популярность, то доли остальных трех систем выросли. Также авторы отчета отмечают общее увеличение количества закачек операционных систем на основе Linux на 21%, что говорит об увеличении популярности Linux в целом.
1996: Появление талисмана в виде пингвина
В 1996 году в результате соревнования выбран официальный талисман Linux-ядра - пингвин Tux. Имя Tux расшифровывается как Torvalds UniX. Нарисовал пингвина Ларри Ивинг (Larry Ewing) из Института научных вычислений университета А&М.
1991: Линус Торвальдс сообщает о завершении прототипа новой ОС Linux
25 августа 1991 г. 21-летний студент Хельсинкского университета Линус Торвальдс (Linus Torvalds) в новостной usenet-группе comp.os.minix сообщил о том, что завершил создание рабочего прототипа новой операционной системы Linux, для которой отмечено завершение портировния bash 1.08 и gcc 1.40. На работу ушло пять месяцев. С этого дня принято отсчитывать историю развития самой известной ОС с открытым кодом.
Первый публичный выпуск ядра Linux представлен 17 сентября 1991 года. Ядро 0.0.1 имело размер 62 Кб в сжатом виде и содержало около 10 тыс. строк исходного кода.
Ядро Linux создано под впечатлением от операционной системы MINIX, которая не устраивала Линуса ограниченной лицензией. Впоследствии, когда Linux стал известным проектом, недоброжелатели пытались обвинить Линуса в прямом копировании кода некоторых подсистем MINIX. Нападение отразил Эндрю Таненбаум, автор MINIX - он поручил одному из студентов провести детальное сравнение кода Minix и первых публичных версий Linux. Результаты исследования показали наличие четырёх несущественных совпадений блоков кода, обусловленных требованиями POSIX и ANSI C.
В начале Линус думал назвать ядро Freax, от слов «free», «freak» и X (Unix). Но имя «Linux» ядро получило при участии Ари Лемке (Ari Lemmke), который по просьбе Линуса выложил ядро на FTP-сервер университета, назвав директорию с архивом не «freax», как просил Торвальдс, а «linux».
Предприимчивый делец Вильям Делло Крок (William Della Croce) сумел зарегистрировать торговую марку Linux и хотел со временем собирать отчисления, но позднее передумал и передал все права на торговую марку Линусу.
Ядро Linux
На 2016 год ядро ОС Linux содержит более 19 млн строк кода. По данным исследования, проведённого по заказу Евросоюза, приблизительная стоимость разработки проекта, аналогичного современному ядру Linux, с нуля, могла бы превысить $1 млрд, по другим оценкам - более $3 млрд[58].
Динамика роста базы кода (количество строк исходного кода) ядра
- 0.0.1 - сентябрь 1991, 10 тыс. строк кода;
- 1.0.0 - март 1994, 176 тыс. строк кода;
- 1.2.0 - март 1995, 311 тыс. строк кода;
- 2.0.0 - июнь 1996, 778 тыс. строк кода;
- 2.2.0 - январь 1999, 1.8 млн. строк кода;
- 2.4.0 - январь 2001, 3.4 млн. строк кода;
- 2.6.0 - декабрь 2003, 5.9 млн. строк кода;
- 2.6.28 - декабрь 2008, 10.2 млн. строк кода;
- 2.6.35 - август 2010, 13.4 млн. строк кода;
- 3.0 - август 2011, 14.6 млн. строк кода.
- 3.5 - июль 2012, 15.5 млн. строк кода.
- 3.10 - июль 2013, 15.8 млн. строк кода;
- 3.16 - август 2014, 17.5 млн. строк кода.
- 4.1 - июнь 2015, 19.5 млн. строк кода.
- 4.7 - июль 2016, 21.7 млн. строк кода.
Прогресс развития ядра
- Linux 0.0.1 - сентябрь 1991, первый публичный выпуск, поддерживающий только CPU i386 и загружающийся с дискеты;
- Linux 0.12 - январь 1992, код начал распространяться под лицензией GPLv2;
- Linux 0.95 - март 1992, обеспечена возможность запуска X Window System, реализована поддержка виртуальной памяти и раздела подкачки.
- Linux 0.96-0.99 - 1992-1993, началась работа над сетевым стеком. Представлена файловая система Ext2, добавлена поддержка формата файлов ELF, представлены драйверы для звуковых карт и контроллеров SCSI, реализована загрузка модулей ядра и файловой системы /proc.
- В 1992 году появились первые дистрибутивы SLS и Yggdrasil. Летом 1993 года были основаны проекты Slackware и Debian.
- Linux 1.0 - март 1994, первый официально стабильный релиз;
- Linux 1.2 - март 1995, существенное увеличение числа драйверов, поддержка платформ Alpha, MIPS и SPARC, расширение возможностей сетевого стека, появление пакетного фильтра, поддержка NFS;
- Linux 2.0 - июнь 1996 года, поддержка многопроцессорных систем. Именно с ее подверсиями и связано победоносное шествие Linux по всему миру;
- Март 1997, основан LKML, список рассылки разработчиков ядра Linux;
- 1998 год, запущен первый попавший в список Top500 кластер на базе Linux, состоящий из 68 узлов с CPU Alpha;
- Linux 2.2 - январь 1999, увеличена эффективность системы управления памятью, добавлена поддержка IPv6, реализован новый межсетевой экран, представлена новая звуковая подсистема;
- Linux 2.4 - февраль 2001, обеспечена поддержка 8-процессорных систем и 64 Гб ОЗУ, файловая система Ext3, поддержка USB, ACPI;
- Linux 2.6 - декабрь 2003, поддержка SELinux, средства автоматического тюнинга параметров ядра, sysfs, переработанная система управления памятью;
- В 2005 году представлен гипервизор Xen, который открыл эру виртуализации;
- В сентябре 2008 года сформирован первый релиз платформы Android, основанной на ядре Linux;
- Linux 2.6.39 - очередной стабильный релиз операционной системы был выпущен 19 мая 2011 г.
- В июле 2011 года после 10 лет развития ветки 2.6.x выполнен переход к нумерации 3.x.
- В 2015 году состоялся выпуск ядра Linux 4.0.
Уменьшение сроков обновления ядра
На выпуск ядра Linux 3.18 (релиз состоялся 7 декабря 2014 года) потребовалось 63 дня. Рекордно короткие сроки обновления принадлежат версии 3.16 (56 дней). Средний цикл разработки ядра в случае с версиями от 3.11 до 3.18 сократился до 66 дней с 70 дней на версиях с 3.3 по 3.10.
Ускорение темпов выхода обновлений
В ядре Linux 3.18 появились 11 379 изменений, тогда как абсолютным лидером по числу корректировок является версия 3.15 (13 722). Она же занимает первое место по скорости обновления: на этапе разработки ядро 3.15 получало каждый час в среднем 8,17 изменения против 7,53 у 3.18. При этом стоит учитывать, что ядро 3.15 создавалось около 70 дней.
Уменьшение размеров ядра
Более чем за два десятка лет ядро Linux наполнилось огромным количеством функций, что, безусловно, сказалось на его размере. Однако разработчики усиленно работают над тем, чтобы снизить системные требования Linux до минимума при наращивании функциональности. Промежуточным итогом такой работы является легкий дистрибутив Tiny Core размером 9 Мбайт. Эта ОС полностью загружается в память и работает из нее.
Обновление ядра в реальном времени
В 2015 году ожидается выпуск ядра Linux 4.0, в который планируется включить только исправления ошибок, без добавления функциональных изменений и новшеств. Одним из самых главных нововведений станет интеграция в ядро патчей в реальном времени.
Какие бывают дистрибутивы GNU/Linux
Наиболее известными дистрибутивами Linux являются Arch Linux, CentOS, Debian, Fedora, Gentoo, Mandriva, Mint, openSUSE, Red Hat, Slackware, Ubuntu.
В отличие от большинства других операционных систем, GNU/Linux не имеет единой «официальной» комплектации. Вместо этого GNU/Linux поставляется в большом количестве так называемых дистрибутивов или сборок, в которых программы GNU соединяются с ядром Linux и другими программами.
Среди существующих сборок можно выделить 3 линейки:
- Debian like дистрибутивы - основываются на Debian GNU/Linux. Для распространения программ используются DEB пакеты. Наиболее известные дистрибутивы: Gnu/Linux Debian, семейство дистрибутивов Ubuntu (Ubuntu, Kubuntu, Xubuntu), Xandros.
- Red Hat like дистрибутивы - основываются на Red Hat Linux. Для распространения программ используются RPM пакеты. Наиболее известные сборки: Red Hat Enterprise Linux, Fedora, Mandrake, Mandriva, ASPLinux, CentOS, OpenSUSE.
- Source Based дистрибутивы - основным способом установки программ в таких дистрибутивах является сборка из исходных кодов - Gentoo, Arch (частично).
Так же есть инструкции по сборке своего собственного дистрибутива - LFS (Linux from Scratch). И есть операционная система CLIP OS, разработанная для французских правительственных учреждений. В сентябре 2018 года были раскрыты ее исходные коды. Подробнее здесь.
Кто разрабатывает дистрибутивы
Дистрибутивы GNU/Linux существенно различаются не только по особенностям организации разработки, но и по бизнес-модели. Так, например, семейство дистрибутивов Red Hat, выпускаемое одноимённой компанией, ориентированно исключительно на корпоративный рынок, что обуславливает разнообразие редакций внутри линейки, наличие различных программ коммерческой поддержки и сертификации. В противовес этому, существуют дистрибутивы и разрабатываемые преимущественно сообществом, например, Debian, поддержка инфраструктуры которых осуществляется за счет пожертвований членов сообщества и третьих лиц.
Вместе с тем, по данным The Linux Foundation, более 85% изменений в ядро Linux в 2006-2007 году вносились корпоративными разработчиками[59], при этом стоимость разработки «с нуля» только ядра Linux оценивается в $1,4 млрд., а типичного GNU/Linux-дистрибутива — в $10,8 млрд[60].
Популярность дистрибутивов
2017: Лучшие дистрибутивы по версии читателей Linux Journal
В феврале 2018 года издание Linux Journal, освещающее события в области операционных систем на ядре Linux, обнародовала рейтинг самых популярных таких платформ. Список составлен на основе опроса, в котором приняли участие более 10 тысяч читателей журнала.
Наиболее востребованным дистрибутивом назван Debian, в пользу которого отдали треть голосов. В тройку лидеров вошли openSUSE (12%) и Fedora (11%), а четвертое место поделили Ubuntu Linux и Arch Linux с 9-процентным показателем. Пятую строчку занял дистрибутив Linux Mint (7%), следом расположился Manjaro Linux (4%). За остальные ОС проголосовали не более 1-3% опрошенных.
По словам экспертов, наиболее популярные дистрибутивы объединяет наличие развернутой документации в интернете, что позволяет даже новичкам работать с операционной системой. Кроме того, многие дистрибутивы могут быть установлены параллельно Windows или работать в Live-режиме с DVD или USB-накопителя без установки.
Многие читатели Linux Journal назвали Debian лучшей серверной операционной системой, а Manjaro больше всего привлекает начинающих пользователей благодаря своему понятному интерфейсу и удобной работе.
Linux Mint также характеризуется своей дружественностью по отношению к новичкам и приятным дизайном. Благодаря поддержке проприетарного программного обеспечения, например Adobe Flash, этот дистрибутив можно рассматривать и для работы с мультимедийным контентом.
Высокие места по-прежнему занимает дистрибутив Ubuntu благодаря акценту на простых непрофессиональных пользователей. Людям нравится портал Software Center, через который можно скачать множество программ с открытым исходным кодом, причем зачастую их можно установить за несколько кликов мыши и без запуска терминала.
Fedora привлекает больше тех, кто предпочитает работать со свободно распространяемым программным обеспечением. При этом разработчики дистрибутива стараются поддерживать развитие инновационных функций и интересных концепций.[61]
2014: Популярность на корпоративном рынке
3 декабря 2014 года был опубликован отчет Enterprise End User Trends Report, в котором говорится о продолжающемся росте использования Linux компаниями по всему миру. Исследовательскую работу организация Linux Foundation подготовила совместно с аналитиками Yeoman Technology Group.[62]
В 2014 году количество предприятий и организаций, которые на базе Linux развернули новые приложения, сервисы и сетевую инфраструктуру, возросло до 79% от общего количества участников опроса. В 2011 году этот показатель составлял 65%. Число приверженцев Windows среди корпоративных пользователей за этот период сократилось с 45% до 36%.
Предприятия охотно внедряют Linux, отказываясь от Windows.
Стоит отметить, что в исследовании принимали участие достаточно большие компании с годовым оборотом от $500 млн и количеством сотрудников от 500. В частности, эксперты выслушали позиции представителей Morgan Stanley, Goldman Sachs, Bank of America, Bristol-Myers Squibb, NTT, Deutsche Bank, DreamWorks, ADP, Bank of New York и др.
Согласно результатам опроса, три четверти респондентов называют Linux приоритетной платформой для работы с облачными вычислениями. В пользу Windows проголосовали 24% опрошенных, за Unix — всего 2%.
78% компаний считают Linux самой безопасной операционной системой. Еще 17% участников опроса уверены, что этот продукт по крайней мере не уступает своим конкурентам. Лишь 2% предприятий сообщили о превосходстве других платформ над Linux в части информационной защиты.
Те компании, которые уже однажды сделали выбор в пользу Linux, продолжают придерживаться этого продукта. По словам 87% опрошенных, в 2014 году они установили Linux-серверы. 82% компаний намерены сделать то же самое в 2015 году.
При этом популярность Windows и Unix в корпоративной среде продолжает снижаться. К примеру, показатель по новым серверным проектам на базе Unix, о которых сообщается в отчете Enterprise End User Trends Report, уменьшился более чем вдвое — с 24% до 11%.
Linux нет равных среди тех пользователей, которым приходится решать критически важные задачи. Для них, по мнению 72% респондентов, подходит только Linux. В 2011 году такой же точки зрения придерживались 60% участников исследования.
Примечания
- ↑ Обновление ядра Linux 6.6.6
- ↑ Релиз ядра Linux 6.6
- ↑ В ядрe Linux 6.6 убрана возможность сборки без поддержки загрузки микрокода для систем x86
- ↑ Релиз ядра Linux 6.5
- ↑ Уязвимость в Linux-драйвере exFAT, позволяющая поднять привилегии в системе
- ↑ Уязвимость StackRot в ядре Linux, позволяющая повысить свои привилегии
- ↑ Релиз ядра Linux 6.4
- ↑ Разработчик из Red Hat исправил редкую ошибку в ядре Linux, проведя почти 300 тыс экспериментов
- ↑ 0-day уязвимость в IPv6-стеке Linux, позволяющая удалённо вызвать крах ядра
- ↑ Релиз ядра Linux 6.3
- ↑ Уязвимости в QoS-подсистеме ядра Linux, позволяющие поднять свои привилегии в системе
- ↑ Релиз ядра Linux 6.2
- ↑ Релиз ядра Linux 6.1
- ↑ Hybrid AI to Protect Integrity of Open Source Code (SocialCyber)
- ↑ Russia’s Open-Source Code and Private-Sector Cybersecurity Ecosystem
- ↑ The US military wants to understand the most important software on Earth
- ↑ Релиз ядра Linux 6.0
- ↑ Линус Торвальдс объявил о выпуске первой предварительной версии ядра Linux 6.0
- ↑ Релиз ядра Linux 5.19
- ↑ Уязвимость в ядре Linux, позволяющая обойти ограничения режима Lockdown
- ↑ Шестая версия патчей для ядра Linux с поддержкой языка Rust
- ↑ Релиз ядра Linux 5.17
- ↑ Обнаружена уязвимость Dirty Pipe в Linux
- ↑ Новая уязвимость cgroups в Linux ядре позволяет злоумышленнику выйти за пределы контейнера
- ↑ PwnKit: Local Privilege Escalation Vulnerability Discovered in polkit’s pkexec (CVE-2021-4034)
- ↑ Гигантские «дыры» в Linux вызывают крах системы и позволяют запускать любой код. Под угрозой Debian, Ubuntu, Red Hat
- ↑ Линус Торвальдс представил релиз ядра Linux 5.12
- ↑ Уязвимость в ядре Linux подвергает опасности web-серверы и устройства на Android
- ↑ Вышло самое крупное в истории обновление Linux. В него впервые добавлена поддержка российского процессора
- ↑ Huawei denies involvement in buggy Linux kernel patch proposal
- ↑ GitHub
- ↑ Выпущено ядро Linux 5.5
- ↑ Вымогательское ПО Ryuk перестало шифровать папки Linux
- ↑ «Дыра» в Linux превращает любого пользователя в админа системы
- ↑ Линус Торвальдс покусился на святое: Админам запретят менять код ядра Linuxи
- ↑ Выпущено ядро Linux 5.0
- ↑ В обновленной версии принято 15214 исправлений от 1879 разработчиков
- ↑ Релиз ядра Linux 4.17
- ↑ Локальная уязвимость в ядре Linux, позволяющая получить root-доступ
- ↑ Релиз ядра Linux 4.13
- ↑ Вышло «историческое» обновление ядра Linux
- ↑ В новый Linux попала ошибка, «способная убить все ядро»
- ↑ Релиз ядра Linux 4.8
- ↑ Релиз ядра Linux 4.7
- ↑ АНБ считает пользователей Linux «экстремистами»
- ↑ Релиз ядра Linux 4.5
- ↑ Релиз ядра Linux 4.4
- ↑ You Can Break Into a Linux System by Pressing Backspace 28 Times. Here’s How to Fix It
- ↑ Ещё никогда не было так просто взломать Linux
- ↑ Релиз ядра Linux 4.3
- ↑ Релиз ядра Linux 4.2
- ↑ Предварительный релиз ядра Linux 4.2-RC1 стал рекордным по количеству новых строк
- ↑ Linux 4.1 — новый LTS-релиз ядра свободной операционной системы
- ↑ Кто сегодня пишет Linux? Капиталисты
- ↑ 7 Linux Facts That Will Surprise You
- ↑ https://plus.google.com/+LinusTorvalds/posts
- ↑ Ubuntu доигралась: лидерство среди Linux утеряно
- ↑ Ядру Linux исполнилось 25 лет
- ↑ http://www.cnews.ru/news/top/index.shtml?2008/04/07/295779
- ↑ http://www.cnews.ru/news/top/index.shtml?2008/10/27/324781
- ↑ Best Linux Distribution
- ↑ Linux Foundation finds enterprise Linux growing at Windows' expense
Ссылки
- Генеральная Публичная Лицензия GPL
- The Linux Kernel Archives» (eng)
- GNU/GPL v.2 (rus)
- GNU/GPL v.2 (eng)
- GNU/GPL v.3 (eng)
Подрядчики-лидеры по количеству проектов
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
Распределение вендоров по количеству проектов внедрений (систем, проектов) с учётом партнёров
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
Распределение систем по количеству проектов, не включая партнерские решения
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)