Рубрика:
Спецвыпуск «Развитие Open Source в России»
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
ВИЗИТКА
Алексей Хорошилов, руководитель Технологического центра исследования безопасности ядра Linux
Международный проект по разработке ядра Linux
Процессы разработки
Операционные системы (ОС) семейства 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 недель работы над стабилизацией ядра.
Одновременно с выпуском новой версии открывается двухнедельное окно слияний для следующей версии, и цикл повторяется.
- Более 1600 разработчиков в каждой версии
- ~7 изменения (коммита) каждый час
- ~4 тыс. строк кода добавляется каждый день
- ~1,5 тыс. строк кода изменяется каждый день
- ~1,5 тыс. строк кода удаляется каждый день
По статистике за 10 лет: 2010-2020
|
Такой отлаженный процесс позволил достичь поистине впечатляющих результатов с точки зрения масштаба разработки.
Согласно статистике, собранной за 10 последних лет, в работе над каждой версией ядра принимает участие более 1600 различных разработчиков, которые делают в среднем 7 изменений в ядре каждый час (непрерывно в течение 10 лет!), что приводит к добавлению 4 тыс. и модификации 1,5 тыс. строк кода каждый день.
Процессы сопровождения
Хотя Линус Торвальдс после выпуска очередной версии ядра переключает своё внимание на работу над следующей, новая версия не остаётся заброшенной. Её под своё крыло берёт команда поддержки стабильных веток ядра (Грег Кроа-Хартман и Саша Левин).
В ходе процесса поддержки регулярно (1-2 раза в неделю) выпускаются обновления стабильной версии (5.10.1, 5.10.2 и т.д.), которые включают исправления обнаруженных ошибок. При этом действует жёсткое правило, что исправление принимается в стабильную ветку только после того, как оно уже попало в основную ветку ядра. Редкие исключения возникают лишь в тех случаях, когда ошибка в основной ветке уже не существует ввиду значительного изменения соответствующего кода.
Стандартная длительность поддержки стабильной версии ядра немного превышает время работы над следующей версией. Например, в обычных условиях поддержка версии 5.10 была бы прекращена вскоре после того, как была выпущена версия 5.11. Но для некоторых версий принимается решение о долгосрочной поддержке, которая может продлиться до 3 - 6 лет. Так, относительно версии 5.10 было принято решение о ее поддержке до конца 2026 года.
На рисунке ниже приведена статистика по исправлениям в версии 5.10 ошибок, которым были присвоены идентификаторы уязвимостей CVE в базе данных общеизвестных уязвимостей информационной безопасности.
В международном сообществе разработчиков ядра откровенно недолюбливают систему присваивания идентификаторов уязвимостей CVE. Разработчики, как правило, просто исправляют ошибки, не выделяя те из них, которые можно было бы считать уязвимостями. Тем не менее, многие исправления получают идентификаторы уязвимости CVE, и, как видно из приведённой статистики, количество исправленных CVE варьируется от 10 до 20 в месяц. При этом большое число уязвимостей получают исправление без присвоения номера, а многие из тех, которым присвоен номер, имеют достаточно ограниченную критичность.
Усилия по тестированию и обеспечению безопасности
Растущая распространенность ядра Linux в качестве основы системного программного обеспечения приводит к росту количества напрямую зависимых от его надежности и безопасности информационных систем, предоставляющих массово используемые сервисы; программно-аппаратных комплексов, обеспечивающих работу критически важных производственных и инфраструктурных автоматизированных систем, потребительских мобильных и встраиваемых систем. Актуальность задачи обеспечения и повышения надежности и безопасности ядра Linux осознается, как международным сообществом разработчиков ядра Linux, так и производителями систем на его основе.
В составе поставок ядра разрабатываются и поддерживаются инструменты для статической проверки кода – ([checkpatch] (https://www.kernel.org/doc/html/latest/dev-tools/checkpatch.html), [coccinelle] (https://www.kernel.org/doc/html/latest/dev-tools/coccinelle.html), [sparse](https://www.kernel.org/doc/html/latest/dev-tools/sparse.html)), набор автоматических тестов [kselftest] (https://www.kernel.org/doc/html/latest/dev-tools/kselftest.html), среда модульного тестирования [KUnit] (https://www.kernel.org/doc/html/latest/dev-tools/kunit/index.html), средство для сбора покрытия кода в процессе выполнения фаззинга [kcov] (https://www.kernel.org/doc/html/latest/dev-tools/kcov.html), [средство поддержки в ядре] (https://www.kernel.org/doc/html/latest/dev-tools/gcov.html) инструмента сбора покрытия кода gcov компилятора GCC, средства обнаружения в процессе выполнения ошибок и утечек памяти, неопределенного поведения, условий гонок ([KASAN] (https://www.kernel.org/doc/html/latest/dev-tools/kasan.html), [KFENCE] (https://www.kernel.org/doc/html/latest/dev-tools/kfence.html), [Kmemleak] (https://www.kernel.org/doc/html/latest/dev-tools/kmemleak.html), [UBSAN] (https://www.kernel.org/doc/html/latest/dev-tools/ubsan.html), [KCSAN] (https://www.kernel.org/doc/html/latest/dev-tools/kcsan.html)), средства для отладки кода ядра [kgdb и kdb] (https://www.kernel.org/doc/html/latest/dev-tools/kgdb.html).
Кроме того сообществом разработчиков ядра и его участниками поддерживаются отдельные наборы тестов такие, как : [xfstests] (https://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git/), [blktests] (https://github.com/osandov/blktests), [FIO] (https://github.com/axboe/fio), [NFS Connectathon testsuite] (http://wiki.linux-nfs.org/wiki/index.php/Connectathon_test_suite).
Отдельные компании, использующие ядро Linux в своих продуктах, разрабатывают тестовые наборы и поддерживают инфраструктуры для проверки обновлений отдельных веток ядра Linux.
Тестовый набор [Linux Kernel Performance tests (LKP)](https://github.com/intel/lkp-tests) разработан компанией Intel и используется в поддерживаемой компанией инфраструктуре [O-Day Continuous Integration system] (https://01.org/lkp).
Google в рамках разработки [ОС Android] (https://ci.android.com/) тестирует на своих облачных ресурсах обновления соответствующих веток ядра Linux. Кроме того, Google предоставляет ресурсы в своем облаке для фаззинга ядра Linux с использованием [syzkaller] (https://syzkaller.appspot.com/upstream).
При этом компании совместно участвуют в проектах с открытым исходным кодом по разработке инструментов статического и динамического анализа кода, тестовых наборов, платформ для непрерывной интеграции и тестирования, а также по поддержке инфраструктур для проведения анализа и тестирования кода ядра Linux таких, как:
- [Linux Test Project (LTP)] (https://github.com/linux-test-project/ltp);
- [KernelCI] (https://kernelci.org/);
- [CKI Project kernel tests] (https://gitlab.com/cki-project/kernel-tests);
- [CIP Testing Project] (https://gitlab.com/cip-project/cip-testing);
- [Linaro Automation and Validation Architecture] (https://validation.linaro.org/);
- [Linaro's Linux Kernel Functional Testing] (https://lkft.linaro.org/).
Открытые проблемы безопасности
Несмотря на общие усилия заинтересованных сторон, общепризнанным фактом является то, что надежность и безопасность ядра Linux требует улучшения. Отчеты только одного из источников обнаружения потенциальных дефектов и уязвимостей показывает, что количество открытых ошибок в настоящее время приближается к 900 и растет примерно на 100 в год, несмотря на то что за год исправляется примерно 400 ошибок [[Cook 2021] (https://security.googleblog.com/2021/08/linux-kernel-security-done-right.html)].
Согласно консолидированному мнению сообщества разработчиков основной причиной текущих проблем с надежностью и безопасностью ядра является поведение больших компаний, использующих ядро Linux в разработке своих коммерческих продуктов, которые активно поддерживают разработку ядра, но не инвестируют достаточно ресурсов в исследования его надежности и безопасности [[Korbet 2017] (https://lwn.net/Articles/726580/), [Hartman 2021] (https://lore.kernel.org/lkml/YH5tAqLr965MNZyW@kroah.com/?s=09), [Cook 2021] (https://security.googleblog.com/2021/08/linux-kernel-security-done-right.html)].
Коммерческие компании могут быть заинтересованы в изменениях в ядре, если эти изменения могут дать их продуктам конкурентные преимущества на рынке. Но компании не заинтересованы напрямую инвестировать ресурсы в поддержку уже разработанного кода, в том числе, в его тестирование и исправление обнаруженных проблем, и предпочитают занимать выжидательную позицию в надежде, что эту работу сделает кто-то другой [[Hartman 2021] (https://lore.kernel.org/lkml/YH5tAqLr965MNZyW@kroah.com/?s=09)].
Таким образом, активности, связанные с исследованиями надежности и безопасности ядра Linux, сталкиваются с проблемой использования общих ресурсов, известной под названием ["трагедия общин»] (https://ru.wikipedia.org/wiki/Трагедия_общих_ресурсов).
По оценке, сделанной в августе 2021 года, недостаток в ресурсах на разработку общего кода ядра Linux и инструментов для его разработки составлял порядка 100 инженеров [[Cook 2021] (https://security.googleblog.com/2021/08/linux-kernel-security-done-right.html)].
Для улучшения надежности и безопасности ядра Linux предлагается перераспределить ресурсы, чтобы обеспечить более быстрое и полное исправление выявленных дефектов и уязвимостей [[Hartman 2021] (https://lore.kernel.org/lkml/YH5tAqLr965MNZyW@kroah.com/?s=09)].
Также, чтобы исключить внесение дефектов и уязвимостей в новый и изменяемый код, предлагается перераспределить ресурсы [[Cook 2021] (https://security.googleblog.com/2021/08/linux-kernel-security-done-right.html)], чтобы обеспечить:
- повышение качества инспекции изменений, принимаемых в код ядра;
- разработку статических анализаторов и их спецификаций и выполнение статического анализа в процессе разработки ядра;
- разработку спецификаций для увеличения покрытия кода ядра в процессе фаззинга;
- разработку новых и адаптацию существующих тестовых наборов для увеличения покрытия кода при тестировании;
- внесение изменений в ядро, затрагивающих большие части кода, которые позволяют исключить появление или эксплуатацию сразу целых классов ошибок;
- развитие и внедрение инструментов для разработки кода ядра Linux, повышающих надежность и безопасность разрабатываемого кода, вплоть до возможного перехода на более безопасные языки программирования, например, Rust.
Ядро Linux на службе отечественных разработчиков
Популярность ядра Linux наблюдается не только за рубежом. Решения многих отечественных разработчиков также базируются на нём.
Ядро Linux лежит в основе дистрибутивов операционных систем общего назначения таких, как Альт, AstraLinux, РОСА, РедОС, Синтез, Циркон, Эльбрус-Д, Стрелец, ОСнова, AlterOS, ОС ТП АИС ФССП России, операционных систем для мобильных устройств (например, Аврора), операционных систем для встроенных систем, таких как маршрутизаторы, межсетевые экраны, системы обнаружения вторжения, системы управления оборудованием и т. д.
При этом многие из этих решений применяются в государственных информационных системах, на объектах критической инфраструктуры и в других ответственных областях. Поэтому все обозначенные открытые проблемы безопасности ядра Linux являются актуальными и в контексте обеспечения безопасности функционирования цифровой инфраструктуры нашей страны.
Отечественные разработчики не сидят сложа руки, предлагая, в том числе, оригинальные решения. Например, AstraLinux и МЦСТ (Эльбрус-Д) разрабатывают собственные реализации ключевых компонентов ядра Linux, таких как модуль управлением доступа (Linux Security Module).
Тем не менее, ядро Linux разработано в монолитной архитектуре, соответственно ошибка в любом его компоненте может позволить получить контроль над всей доступной памятью и преодолеть любые защитные меры. Поэтому широкий анализ безопасности всех используемых компонентов ядра является необходимым, а сил у отечественных компаний на его проведение заведомо меньше по сравнению с международными гигантами.
Напрашивающимся решением является идея объединить усилия всех отечественных компаний, а по возможности и международного сообщества, чтобы решать эту задачу сообща, поскольку это принесёт пользу всем, а конкурентные преимущества участников никак не пострадают, поскольку они расположены совсем в других плоскостях.
Технологический центр исследования безопасности ядра Linux
Следует отметить, что большинство из предлагаемых в международном сообществе подходов к повышению безопасности ядра – это предложения начать систематически применять уже достаточно устоявшиеся лучшие практики разработки программного обеспечения, которые нашли своё отражение в международных и отраслевых стандартах.
Так, требования проводить регулярный статический анализ, фаззинг-тестирование, функциональное и модульное тестирование прописаны в ГОСТ Р 56939-2016 «Защита информации. Разработка безопасного программного обеспечения. Общие требования», а также в методических рекомендациях отечественных регуляторов в области информационной безопасности.
Все эти мероприятия уже являются обязательными при разработке сертифицированных систем защиты информации на основе ядра Linux, и требования регуляторов к качеству их выполнения постоянно возрастают.
Чтобы повышающиеся требования к разработчикам можно было подкрепить методической и организационной поддержкой, по инициативе ФСТЭК России в ИСП РАН стартовала работа по созданию Технологического центра исследования безопасности ядра Linux, в рамках которого предлагается:
- сформировать методическое обеспечение для проведения всех видов исследований безопасности применительно к ядру Linux;
- обеспечить сокращение дублирования работ по исследованию ядра при сертификации отечественными разработчиками;
- организовать ведение стабильной ветки ядра, ко всем изменениям в которой регулярно применяются все необходимые виды исследований.
По результатам опроса отечественных компаний, в качестве стабильной версии ядра для исследований и поддержки в рамках Технологического центра была выбрана версия 5.10.
Для проведения исследований ядра была развёрнута инфраструктура автоматической верификации ядра, включающая в себя:
- автоматическую сборку ядра в заданном наборе конфигураций заданным набором компиляторов;
- проведение статического анализа при помощи инструмента SVACE, разработанного в ИСП РАН;
- проведение тестирования собранных ядер в виртуальных машинах qemu при помощи системы управления тестированием LAVA;
- агрегацию результатов сборки и тестирования в базе данных KernelCI;
- фаззинг-тестирование ядра при помощи инфраструктуры syzkaller.
Помимо полностью автоматизированных исследований также предусмотрен ряд процессов, требующих вовлечения экспертов. Так, проведение архитектурного анализа, целью которого является выявление поверхности атаки, требует от эксперта проведения исследования интерфейсов, непосредственно доступных потенциальному нарушителю.
Для ядра Linux поверхность атаки, как правило, состоит из интерфейсов ядра (системные вызовы, файлы) и аппаратуры (сетевые интерфейсы, шины). Например, интерфейс системных вызовов рассматривается как поверхность атаки, если согласно модели угроз разрабатываемой системы, допускается выполнение недоверенного прикладного кода.
Сетевые интерфейсы (Ethernet, WiFi, Bluetooth) рассматриваются как поверхность атаки, если согласно модели угроз допускается взаимодействие с потенциальным нарушителем при помощи соответствующих протоколов. Аналогично рассматриваются шины подключения внешних устройств. Например, если допускается подключение недоверенных USB устройств, то шины USB должны быть включены в поверхность атаки.
Для проведения анализа глубины поверхности атаки зарекомендовала себя удобным инструментом система Natch, которая за счёт эмуляции поведения аппаратуры при помощи Qemu позволяет автоматически собрать информацию о функциях ядра, обращавшихся к данным, помеченным как недоверенные, например, пакетам, пришедшим по сети.
Ещё один вид экспертного анализа – полносистемный анализ помеченных данных, который позволяет убедиться, что в заданных сценариях чувствительные данные, такие как ключи или парольная информация, гарантированно удалены из памяти в момент, когда в них больше нет необходимости. Для проведения этого вида анализа применяется другая система, разработанная в ИСП РАН на основе эмулятора Qemu – система Блесна.
Также в рамках развёртывания функционирования Технологического центра проводятся работы по разработке патчей, устраняющих ошибки и уязвимости в ядре Linux, которые обнаруживаются в ходе проведения исследований, ведётся наполнение БДУ ФСТЭК России сведениями об уязвимостях ядра Linux, готовятся доработки в ядра, нацеленные на повышение безопасности, поддерживается работа над уточнением и развитием карты средств защиты ядра Linux и соответствующих инструментов.
Ряд отечественных компаний уже стали активными участниками работ, ведущихся в рамках Технологического центра, они участвуют в разметке результатов статического анализа и подготовке патчей, которые исправляют обнаруженные предупреждения. Первые патчи уже отправлены представителем компании «Открытые мобильные платформы» Сергеем Штылёвым.
Приглашаем всех лиц, заинтересованных в повышении безопасности ядра Linux, присоединяться к исследованиям Технологического центра!
[1] The Linux Foundation «New Horizons for Open Source» https://linuxfoundation.org/tools/linux-foundation-annual-report-2021/
Ключевые слова: уязвимость, ядро Linux, безопасность, патчи, Технологический центр, средства защиты, исследования, система Блесна, компания, разработка, атака, анализ
Подпишитесь на журнал Купите в Интернет-магазине
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|