Международный проект по разработке ядра Linux

1.1. Процессы разработки

Операционные системы (ОС) семейства Linux занимают ведущие позиции в мире по многим направлениям [1]:

  • по результатам анализа 1 млн. наиболее популярных доменов более 96% веб-серверов работают на Linux;
  • более 85% смартфонов в мире используют Android, основанный на ядре Linux;
  • все 100% суперкомпьютеров из списка 500 самых производительных используют ОС на базе ядра Linux;
  • более 90% облачных сервисов, включая и сервисы таких технологических гигантов, как Google, Amazon, Ebay, Paypal, Walmart, Yandex, работают на Linux;
  • большинство бирж, включая NYSE, NASDAQ, London Exchange, Tokyo Stock Exchange, работают на Linux.

Проект по разработке ядра Linux является одним из самых крупных и долгоживущих среди проектов по разработке свободного программного обеспечения. К настоящему времени разработка ядра Linux длится более 30 лет, количество строк кода ядра достигло 22 миллионов (с комментариями и пустыми строками 29 миллионов).

Работа над развитием ядра ведётся по чётко выверенной схеме, которая была сформирована в около 2005 года. Каждые 9-10 недель происходит выпуск новой версии основной ветки ядра (mainline или upstream). Первые две недели очередного цикла отводятся под «окно слияний» (merge window), в ходе которого в основную ветку попадает новая функциональность, новые драйвера и т. д. Добавляемая функциональность, как правило, проходит предварительное обсуждение и тестирование в рамках тематических веток разработки ядра, относящихся к модифицируемой подсистеме (например, для сетевой подсистемы это ветка netdev/net.git или kvm/kvm.git для встроенного гипервизора KVM).

Окно слияний закрывается, когда Линус Торвальдс выпускает первый кандидат на релиз очередной версии ядра (например, 5.10-rc1). Это даёт начало периоду стабилизации, в ходе которого в основную ветку ядра принимаются только исправления ошибок. В процессе стабилизации регулярно, раз в неделю, выпускаются очередные кандидаты на релиз (rc2, rc3 и т. д.), которые проходят тестирование у заинтересованных участников процесса. Процесс завершается выпуском очередной версии ядра (например, 5.10), когда Линус посчитает, что основная ветка является достаточно протестированной, и в ней не остаётся известных критических ошибок и деградаций. Как правило, это происходит через 7 или 8 недель работы над стабилизацией ядра. Одновременно с выпуском новой версии открывается двухнедельное окно слияний для следующей версии, и цикл повторяется.

Такой отлаженный процесс позволил достичь поистине впечатляющих результатов с точки зрения масштаба разработки. Согласно статистике собранной за 10 последних лет, в работе над каждой версией ядра принимает участие более 1600 различных разработчиков, которые делают в среднем 7 изменений в ядро каждый час (непрерывно в течение 10 лет!), что приводит к добавлению 4 тыс. и модификации 1,5 тыс. строк кода каждый день.

Версии ядра Linux

1.2. Процессы сопровождения

Хотя Линус Торвальдс после выпуска очередной версии ядра переключает своё внимание на работу над следующей, новая версия не остаётся заброшенной. Её под своё крыло берёт команда поддержки стабильных веток ядра (Грег Кроа-Хартман и Саша Левин). В ходе процесса поддержки регулярно (1-2 раза в неделю) выпускаются обновления стабильной версии (5.10.1, 5.10.2 и т.д.), которые включают исправления обнаруженных ошибок. При этом действует жёсткое правило, что исправление принимается в стабильную ветку только после того, как оно уже попало в основную ветку ядра. Редкие исключения возникают только в тех случаях, когда ошибка в основной ветке уже не существует ввиду значительного изменения соответствующего кода.

Стандартная длительность поддержки стабильной версии ядра немного превышает время работы над следующей версией. Например, в обычных условиях поддержка версии 5.10 была бы прекращена вскоре после того как была выпущена версия 5.11. Но для некоторых версий принимается решение о долгосрочной поддержке, которая может продлиться до 3 - 6 лет. Так относительно версии 5.10 было принято решение о поддержке до конца 2026 года.

Статистика по исправлениям ошибок в Linux версии 5.10

На рисунке выше приведена статистика по исправлениям в версии 5.10 ошибок, которым были присвоены идентификаторы уязвимостей CVE в базе данных общеизвестных уязвимостей информационной безопасности. В международном сообществе разработчиков ядра откровенно недолюбливают систему присваивания идентификаторов уязвимостей CVE. Разработчики, как правило, просто исправляют ошибки, не выделяя те из них, которые можно было бы считать уязвимостями. Тем не менее, многие исправления получают идентификаторы уязвимости CVE, и, как видно из приведённой статистики, количество исправленных CVE варьируется от 10 до 20 в один месяц. При этом многие уязвимости получают исправление без присвоения номера, а многие из тех, которые получают номер, имеют достаточно ограниченную критичность.

1.3. Усилия по тестированию и обеспечению безопасности

Растущая распространенность ядра Linux в качестве основы системного программного обеспечения приводит к росту количества напрямую зависимых от его надежности и безопасности информационных систем, предоставляющих массово используемые сервисы, программно-аппаратных комплексов, обеспечивающих работу критически важных производственных и инфраструктурных автоматизированных систем, потребительских мобильных и встраиваемых систем. Актуальность задачи обеспечения и повышения надежности и безопасности ядра Linux осознается, как международным сообществом разработчиков ядра Linux, так и производителями систем на его основе.

В составе поставок ядра разрабатываются и поддерживаются инструменты для статической проверки кода checkpatch, coccinelle, sparse, набор автоматических тестов kselftest, среда модульного тестирования KUnit, средство для сбора покрытия кода в процессе выполнения фаззинга kcov, средство поддержки в ядре инструмента сбора покрытия кода gcov компилятора GCC, средства обнаружения в процессе выполнения ошибок и утечек памяти, неопределенного поведения, условий гонок KASAN, KFENCE, Kmemleak, UBSAN, KCSAN, средства для отладки кода ядра kgdb и kdb.

Кроме того сообществом разработчиков ядра и его участниками поддерживаются отдельные наборы тестов такие, как xfstests, blktests, FIO, NFS Connectathon testsuite.

Отдельные компании, использующие ядро Linux в своих продуктах, разрабатывают тестовые наборы и поддерживают инфраструктуры для проверки обновлений отдельных веток ядра Linux. Тестовый набор [Linux Kernel Performance tests (LKP)](https://github.com/intel/lkp-tests) разработан компанией Intel и используется в поддерживаемой компанией инфраструктуре O-Day Continuous Integration system. Google в рамках разработки ОС Android тестирует на своих облачных ресурсах обновления соответствующих веток ядра Linux. Также Google предоставляет ресурсы в своем облаке для фаззинга ядра Linux с использованием [syzkaller](https://syzkaller.appspot.com/upstream).

Также компании совместно участвуют в проектах с открытым исходным кодом по разработке инструментов статического и динамического анализа кода, тестовых наборов, платформ для непрерывной интеграции и тестирования, а также по поддержке инфраструктур для проведения анализа и тестирования кода ядра Linux таких, как:

1.4. Открытые проблемы безопасности

Несмотря на общие усилия заинтересованных сторон, общепризнанным фактом является то, что надежность и безопасность ядра Linux требует улучшения. Отчеты только одного из источников обнаружения потенциальных дефектов и уязвимостей показывает, что количество открытых ошибок в настоящее время приближается к 900 и растет примерно на 100 в год, несмотря на то, что в год исправляется примерно 400 ошибок [[Cook 2021](https://security.googleblog.com/2021/08/linux-kernel-security-done-right.html)].

Согласно консолидированному мнению сообщества разработчиков основной причиной текущих проблем с надежностью и безопасностью ядра является поведение больших компаний, использующих ядро Linux в разработке своих коммерческих продуктов, которые активно поддерживают разработку ядра, но не инвестируют достаточно ресурсов в исследования его надежности и безопасности Korbet 2017, Hartman 2021, Cook 2021. Коммерчески компании могут быть заинтересованы в изменениях в ядре, если эти изменения могут дать их продуктам конкурентные преимущества на рынке. Но компании не заинтересованы напрямую инвестировать ресурсы в поддержку уже разработанного кода, в том числе, в его тестирование и исправление обнаруженных проблем, и предпочитают занимать выжидательную позицию в надежде, что эту работу сделает кто-то другой Hartman 2021. Таким образом, активности, связанные с исследованиями надежности и безопасности ядра Linux, сталкиваются с проблемой использования общих ресурсов, известной под названием "трагедия общин". По оценке от августа 2021 года недостаток в ресурсах на разработку общего кода ядра Linux и инструментов для его разработки составлял порядка 100 инженеров Cook 2021.

Для улучшения надежности и безопасности ядра Linux предлагается перераспределить ресурсы, чтобы обеспечить более быстрое и полное исправление выявленных дефектов и уязвимостей Hartman 2021. Также, чтобы исключить внесение дефектов и уязвимостей в новый и изменяемый код, предлагается перераспределить ресурсы Cook 2021, чтобы обеспечить:

  • повышение качества инспекции изменений, принимаемых в код ядра;
  • разработку статических анализаторов и их спецификаций и выполнение статического анализа в процессе разработки ядра;
  • разработку спецификаций для увеличения покрытия кода ядра в процессе фаззинга;
  • разработку новых и адаптации существующих тестовых наборов для увеличения покрытия кода при тестировании;
  • внесение изменений в ядро, затрагивающих большие части кода, которые позволяют исключить появление или эксплуатацию сразу целых классов ошибок;
  • развитие и внедрения инструментов для разработки кода ядра Linux, повышающих надежность и безопасность разрабатываемого кода, вплоть до возможного перехода на более безопасные языки программирования, например, Rust.

2. Ядро Linux на службе отечественных разработчиков

Популярность ядра Linux наблюдается не только за рубежом. Решения многих отечественных разработчиков также базируются на нём. Ядро Linux лежит в основе дистрибутивов операционных систем общего назначения таких, как Альт, AstraLinux, РОСА, РедОС, Синтез, Циркон, Эльбрус-Д, Стрелец, ОСнова, AlterOS, ОС ТП АИС ФССП России, операционных систем для мобильных устройств (например, Аврора), операционных систем для встроенных систем, таких как маршрутизаторы, межсетевые экраны, системы обнаружения вторжения, системы управления оборудованием и т.д.

При этом многие из этих решений применяются в государственных информационных системах, на объектах критической инфраструктуры и в других ответственных областях. Поэтому все обозначенные открытые проблемы безопасности ядра Linux являются актуальными и в контексте обеспечения безопасности функционирования цифровой инфраструктуры нашей страны.

Отечественные разработчики не сидят сложа руки, предлагая в том числе оригинальные решения. Например, AstraLinux и МЦСТ (Эльбрус-Д) разрабатывают собственные реализации ключевых компонентов ядра Linux, таких как модуль управлением доступа (Linux Security Module).

Тем не менее, ядро Linux разработано в монолитной архитектуре, соответственно ошибка в любом его компоненте может позволить получить контроль над всей доступной памятью и преодолеть любые защитные меры. Поэтому широкий анализ безопасности всех используемых компонентов ядра является необходимым, а сил у отечественных компаний на его проведение заведомо меньше по сравнению с международными гигантами. Напрашивающимся решением является объединить усилия всех отечественных компаний, а во возможности и международного сообщества, чтобы решать эту задачу сообща, поскольку это принесёт пользу всем, а конкурентные преимущества участников никак не пострадают, поскольку они расположены совсем в других плоскостях.

[1] The Linux Foundation «New Horizons for Open Source»