УДК 004.451.87

Обзор эволюции функционала операционной системы GNU/Linux при эволюции ядра

Колосов Лев Сергеевич – бакалавр кафедры Защищенных систем связи Санкт-Петербургского государственного университета им. проф. М.А. Бонч-Бруевича

Умаралиев Игорь Васильевич Умаралиев – бакалавр Защищенных систем связи Санкт-Петербургского государственного университета им. проф. М.А. Бонч-Бруевича

Аннотация: В данной статье рассматривается эволюция архитектуры ядра операционной системы Linux, что в процессе развития и масштабирования позволило разработать и внедрить новые функциональные возможности и непрерывно их развивать. Делаются выводы касательно устранения сетевых уязвимостей ядра.

Ключевые слова: oперационная система Linux, монолитное ядро, эволюция ядра Linux, уязвимости ядра.

Созданное в 1991 году ядро Linux является одним из самых зрелых проектов с открытым исходным кодом на момент написания и продолжает быстро развиваться. Оно остается важнейшим компонентом многочисленных проектов с открытым и закрытым исходным кодом, включая дистрибутивы операционная система GNU/Linux, мобильные телефоны, ноутбуки, сеть маршрутизаторов, аппаратные медиаплееры и аналогичные устройства. Такое разнообразие приложений и пользователей обеспечивает настраиваемую архитектуру ядра [1].

Действительно, ядро Linux входит в число крупнейших хорошо документированных линеек программных продуктов, изученных до сих пор.Сообщество разработчиков Linux включает как добровольцев, так и платных разработчиков из более чем 200 компаний, включая Red Hat, IBM, Intel, Oracle, Google и Microsoft среди прочих.Зрелость проекта проявляется по нескольким показателям, таким как размер кодовой базы (более 8 миллионов строк), количество активных разработчиков (600–1200 на каждый релиз и далее) и уровень активности (до 10000 исправлений на выпуск) [2].

Продолжало значительно улучшаться ядро Linux в течение 1990-х годов, с версией 2.0, выпущенной 6 июня 1996 года, и версией 2.2.13, которая позволила ядру Linux работать на машинах корпоративного класса благодаря исправлениям мэйнфреймов IBM, выпущенным 18 декабря 1999 года.

После наступления нового тысячелетия Linux превратился во всемирный проект разработки с бесчисленными участниками со всего мира. Можно увидеть полный список изменений всего, что произошло с 17 декабря 2001 года по сегодняшний день, посетив открытый источник. Согласно последним оценкам, «среднее количество изменений, принимаемых в ядро в час, составляет 7,71, что означает 185 изменений каждый день и почти 1 300 в неделю».

Учитывая, что Линус Торвальдс никогда не предполагал, что его любимый проект станет таким большим, ядро Linux является истинным свидетельством силы разработки с открытым исходным кодом, изобретательности и мастерства независимых разработчиков, мотивированных желанием коллективно создать что-то великое [3]. Ядро Linux содержит явную модель функций (модель функций ядра Linux), выраженную на предметно-ориентированном языке под названием Kconfig. Язык Kconfig был официально включен в версию 2.5.45 в октябре 2002 года. С тех пор это язык функциональной модели ядра Linux. Таким образом, функциональная модель ядра Linux является зрелой моделью с многолетней историей в ее нынешнем виде (и хорошей предысторией в предшествующих языках спецификации).

Изменчивость в ядре Linux по вертикали присутствует в трех отдельных, но связанных пространствах: пространство конфигурации: файлы конфигурации ядра (Kconfig), включающие модель изменчивости Linux; пространство компиляции: файлы сборки ядра (KBuild), в основном записанные как Makefile с неявными правилами; пространство реализации: реализация всех функций, в основном написанных в виде кода на Си. Архитектура ядра Linux была переработана, чтобы иметь одну общую кодовую базу, которая могла бы одновременно поддерживать отдельное конкретное дерево для любого количества различных архитектур машин. Использование загружаемых модулей ядра, представленное в версии ядра 2.0, еще больше повысило модульность, предоставив явную структуру для написания модулей, содержащих аппаратно-зависимый код (например, драйверы устройств) [4]. Помимо того, что основное ядро стало легко переносимым, введение модулей позволило большой группе людей одновременно работать над ядром без централизованного контроля. Модули ядра – это хороший способ позволить программистам работать независимо над частями системы, которые должны быть независимыми.

Самое большое изменение в LKMs (Loadable Kernel Modules)  между Linux 2.4 и Linux 2.6 – внутреннее: LKM загружаются по-другому. Большинство людей не увидят никакой разницы, кроме того, что изменился суффикс файла, содержащего LKM, потому что они используют высокоуровневые инструменты для управления LKM, а интерфейс этих инструментов не изменился [5]. До Linux 2.6 программа в пространстве пользователя интерпретировала объектный файл ELF (.o) и выполняла всю работу по его связыванию с работающим ядром, создавая готовый двоичный образ. Программа передавала этот образ ядру, а ядро делало лишь то, что помещало его в память. В Linux 2.6 ядро выполняет компоновку. Программа пространства пользователя передает содержимое объектного файла ELF непосредственно ядру. В прошлом, 2.0.x 2.2.x и 2.4.x (четные младшие части) были стабильными сериями, а 2.1.x, 2.3.x и 2.5.x были сериями разработки, в которых происходили основные изменения. Когда разработка 2.1 завершалась, она становилась 2.2 и 2.3 и так же с другими версиями. Когда вышла 2.6, было решено не создавать новую серию, а продолжить разработку серии 2.6. В один момент было решено создать стабильные ветки от каждого из выпусков 2.6.x, что привело к выпуску 2.6.x.y. Некоторые из них стали долгосрочными релизами. 3.x и 4.x являются прямым продолжением серии 2.6 [7].

При переходе к "третьему десятилетию" ядра Linux в файловой системе Btrfs (B-Tree Filesystem) произошли серьёзные изменения. Поскольку Btrfs использует Copy on Write (COW), она может быстро фрагментироваться при определенных шаблонах доступа; новая опция монтирования "auto_defrag" предписывает файловой системе обнаруживать "небольшие случайные записи" в существующих файлах и ставить их в очередь на автоматическую дефрагментацию. В комментарии к коммиту и запросе Git-Pull говорится, что опция подходит для небольших файлов, таких как базы данных Sqlite или Berkeley DB, но пока не может работать с большими базами данных или образами жёстких дисков решений виртуализации [8].

Программы Ping теперь смогли использовать новый сокет IPPROTO_ICMP, чтобы позволить непривилегированным пользователям отправлять и получать пакеты ICMP_ECHO; ранее для выполнения ping в Linux требовались привилегии root или получение необходимых операционных привилегий.

В ядро добавлен сетевой планировщик, реализующий механизм Quick Fair Queue (QFQ), который позволяет улучшить производительность. Новый системный вызов setns позволяет создать пространство имен, которое может быть передано различным процессам; согласно Git-Pull запросу, такое пространство имен может, например, позволить изолировать VPN-соединения [6].

Все версии до 3.13.6 ядра Linux подвержены уязвимости CVE-2014-2523.  Эта серьезная уязвимость netfilter может быть связана с неправильным использованием указателя заголовка DCCP.  Дефект позволяет удаленным злоумышленникам вызвать DoS (крах системы) или выполнить произвольный код через DCCP-пакет, который вызывает вызов функции dccp_new, dccp_packet или dccp_error.

Хотя в ядре Linux было найдено и устранено гораздо больше уязвимостей безопасности, чем перечисленные ниже, некоторые из наиболее известных ошибок включают [8]:

  • CVE-2017-18017: критическая уязвимость, существующая в функции netfilter tcpmss_mangle_packet, чрезвычайно опасна из-за важной роли, которую она играет в фильтрации сетевых соединений, определяя максимальный размер сегмента, допустимый для приема заголовков TCP. Без этих средств контроля пользователи подвержены проблемам переполнения и DoS-атакам. Дефект затрагивает версии до 4.11.
  • CVE-2016-10229: ошибка в udp.c, также затрагивающая версии до 4.5, позволяет удаленным злоумышленникам выполнить произвольный код через UDP-трафик, вызвав небезопасную вторую контрольную сумму во время выполнения системного вызова recv с флагом MSG_PEEK.
  • CVE-2015-8812: серьезная уязвимость, затрагивающая версии до 4.5, обнаруженная в драйверах ядра Linux, позволяет удаленным злоумышленникам выполнить произвольный код или вызвать DoS (use-after-free) через поддельные пакеты.
  • CVE-2016-10150: Уязвимость use-after-free, затрагивающая версии ядра Linux до 4.8.13, позволяет пользователям вызвать DoS-атаку. Этот недостаток также может быть использован для получения привилегий.

Также Линус Торвальдс одобрил включение в версию 5.4 ядра новой функции безопасности, Linux Security Module (LSM), прозванной "lockdown". Цель функции – ограничить различные аспекты функциональности ядра, предотвратить модификацию кода ядра и заблокировать аппаратное обеспечение, которое потенциально может генерировать прямую адресацию памяти, а также обеспечить другие преимущества безопасности [7].

Таким образом, мы можем сделать вывод, что в каждой обновлённой версии ядра linux происходят серьёзные изменения, направленные как на функционал, так и на устранение уязвимостей. Linux с каждым выпуском становится всё более масштабных проектом.

Список литературы

  1. Lotufo R., She S., Berger T., Czarnecki K., Wasowski A. (2010). Evolution of the Linux Kernel Variability Model. 136-150. 10.1007/978-3-642-15579-6_10.
  2. Passos L., Czarnecki K., Wasowski A. (2012). Towards a catalog of variability evolution patterns: the Linux kernel case. In FOSD '12 Proceedings of the 4th International Workshop on Feature-Oriented Software Development (pp. 62-69). Association for Computing Machinery.
  3. Caprio F., Casazza G., Di Penta, M., Umberto V. Measuring and Predicting the Linux Kernel Evolution. In Proceedings of the International Workshop of Empirical Studies on Software Maintenance, Florence, Italy, 2001.
  4. Беляев Д. Л. Формирование криптотуннелей ipsec в операционных системах astra linux / Д. Л. Беляев, И. И. Дадаев // Актуальные проблемы инфотелекоммуникаций в науке и образовании (АПИНО 2022): Сборник научных трудов XI Международной научно-технической и научно-методической конференции. В 4-х томах, Санкт-Петербург, 15-16 февраля 2022 года / Под. редакцией А.В. Шестакова, сост. В.С. Елагин, Е.А. Аникевич. Том 3. – Санкт-Петербург: Санкт-Петербургский государственный университет телекоммуникаций им. проф. М.А. Бонч-Бруевича, 2022. – С. 423-426. – EDN DOZWFM.
  5. Новиков Е. М. Развитие ядра операционной системы Linux / Е. М. Новиков // Труды Института системного программирования РАН. – 2017. – Т. 29. – № 2. – С. 77-96. – DOI15514/ISPRAS-2017-29(2)-3. – EDN YNEYUT.
  6. Темченко В. И. Проектирование модели информационной безопасности в операционной системе / В. И. Темченко, А. Ю. Цветков // Актуальные проблемы инфотелекоммуникаций в науке и образовании (АПИНО 2019): сборник научных статей VIII Международной научно-технической и научно-методической конференцияи : в 4 т., Санкт-Петербург, 27-28 февраля 2019 года. Том 1. – Санкт-Петербург: Санкт-Петербургский государственный университет телекоммуникаций им. проф. М.А. Бонч-Бруевича, 2019. – С. 740-745. – EDN QQLJJX.
  7. Федорова О. В. Модули ядра Linux / О. В. Федорова, А. Ю. Цветков // Актуальные проблемы инфотелекоммуникаций в науке и образовании : сборник научных статей: в 4х томах, Санкт-Петербург, 24–25 февраля 2021 года / Санкт-Петербургский государственный университет телекоммуникаций им. проф. М.А. Бонч-Бруевича. – Санкт-Петербург: Санкт-Петербургский государственный университет телекоммуникаций им. проф. М.А. Бонч-Бруевича, 2021. – С. 675-679. – EDN DWDDKM.
  8. Цветков А.Ю. Исследование существующих механизмов защиты операционных систем семейства Linux // Актуальные проблемы инфотелекоммуникаций в науке и образование. VII Международная научно-техническая и научно-методическая конференция: сб. науч. ст. в 4-х т. СПб.: СПбГУТ, 2018. С. 657-662.

Интересная статья? Поделись ей с другими: