Отчёт о развитии FreeBSD за третий квартал 2019 года

Что интересного в отчёте?

Общие и системные вопросы

  • Core team в общем виде одобрил возможность включения в систему кода, поставляемого под лицензией BSD с дополнительным соглашением об использовании патентов (BSD+Patent), но решение по включению в систему каждого компонента под данной лицензией должно утверждаться отдельно. В BSD+Patent лицензия BSD дополнена дополнительным соглашением, определяющим предоставление доступа к технологиям, пересекающимися с зарегистрированными патентами и минимизирующим риски от патентных исков (лицензия отзывается в случае патентного иска). По мнению Фонда Apache данное соглашение главным образом отстаивает интересы производителя и приводит к несбалансированному перекладыванию рисков на потребителей продуктов.
  • Состоялось первое заседание рабочей группы, созданной для проведения миграции исходных текстов из централизованной системы управления исходными текстами Subversion в децентрализованную систему Git. Дискуссия по целесообразности миграции пока продолжается, и по многим вопросам ещё предстоит выработать решения (например, как поступить с contrib/, нужно ли перегенерировать хэши в текущем git-репозитории и как наилучшим образом реализовать тестирование коммитов);
  • Из NetBSD портирован инструментарий KCSAN (Kernel Concurrency Sanitizer), позволяющий выявлять возникновение состояний гонки между потоками ядра, выполняемыми на разных CPU;
  • Ведётся работа по использованию встроенного в Clang ассемблера (IAS) вместо ассемблера из GNU binutils;
  • Инфраструктура эмуляции окружения Linux (Linuxulator) адаптирована для работы на архитектуре ARM64. Реализован системный вызов “renameat2 “. Утилита strace доработана для диагностики проблем в исполняемых файлах Linux, запускаемых в Linuxulator. Решена проблема с возникновением сбоев при связывании исполняемых файлов с новыми выпусками glibc. Порты с Linux-компонентами для Linuxulator обновлены до CentOS 7.7;
  • В рамках программы Google Summer of Code студентами успешно выполнено шесть проектов: подготовлена реализация унифицированной (IPv4/IPv6) утилиты ping, разработаны инструментарии для тестирования межсетевых экранов и выявления ошибок в ядре (Kernel sanitizer), предложен модуль mac_ipacl, написан код для сжатия виртуальной памяти и выполнена работа по отделению процесса сборки портов от локальной установки;
  • Продолжает развиваться проект по fuzzing-тестированию ядра FreeBSD с использованием системы syzkaller. За отчётный период при помощи syzkaller выявлено и устранено более десяти ошибок. Для запуска syzkaller в виртуальных машинах на базе bhyve выделен отдельный сервер, а при помощи syzbot налажена проверка различных подсистем FreeBSD в инфраструктуре Google. Организована передача информации о всех крахах в сервис backtrace.io для упрощения их группировки и анализа;
  • Ведётся работа по обновлению реализации zlib на уровне ядра. Связанный со сжатием код переведён с zlib 1.0.4, выпущенного более 20 лет назад, на актуальную кодовую базу zlib 1.2.11. Для унификации доступа к zlib в ядро добавлены функции compress, compress2 и uncompress. Обеспечивающий работу протокола PPP код из подсистемы netgraph переведён на использование системной реализации zlib, вместо собственной редакции данной библиотеки. На новый zlib также переведены подсистемы kern_ctf.c, opencryptodeflate, geom_uzip, subr_compressor, if_mxge, bxe updated и ng_deflate;
  • Развивается новый интерфейс ядра sysctlinfo, позволяющий находить элементы в базе параметров sysctl, обрабатываемой в форме MIB (Management Information Base), и передавать информации об объектах в пространство пользователя.

Безопасность

  • Разработан модуль ядра mac_ipacl, основанный на TrustedBSD MAC Framework и реализующий систему управления доступом к настройкам сетевого стека для jail-окружений. Например, при помощи mac_ipacl администратор хост-системы может запретить пользователю root в jail-окружении изменять или устанавливать IP-адреса или параметры подсетей для определённых сетевых интерфейсов. Предложенная система мандатного управления доступом позволяет задавать списки IP-адресов и подсетей, допустимых для Jail, запрещать установку определённых IP и подсетей в Jail или ограничивать смену параметров только для определённых сетевых интерфейсов;
  • Компания Intel передала проекту порт программного стека TPM 2.0 (Trusted Platform Module) для взаимодействия с чипом для безопасных вычислений, который обычно применяется для верифицированной загрузки прошивок и загрузчика ОС. Компоненты стека представлены в форме портов securtity/tpm2-tss, security/tpm2-tools и security/tpm2-abrmd. Порт tpm2-tss включает библиотеки для использования API TPM2, tpm2-tools предоставляет утилиты командной строки для выполнения операций с TPM, а tpm2-abrmd содержит фоновый процесс с реализацией компонентов TPM Access Broker и Resource Manager, мультиплексирующих запросы от разных пользователей TPM к одному устройству. Кроме верифицированной загрузки во FreeBSD TPM может использоваться для усиления безопасности Strongswan IPsec, SSH и TLS за счёт выполнения криптографических операций на отдельном чипе;
  • Ядро для архитектуры amd64 адаптировано для загрузки с применением техники защиты W^X (write XOR execute), подразумевающей, что страницы памяти не могут быть одновременно доступны на запись и исполнение (ядро теперь может грузиться с применением исполняемых страниц памяти для которых запрещена запись, ранее для страниц памяти с данными ядра уже применялся запрет исполнения, но без привязки к возможности записи). Новый метод защиты ядра включён в ветку HEAD и по умолчанию будет активирован в выпусках FreeBSD 13.0 и 12.2;
  • Для системных вызовов mmap и mprotect реализован макрос PROT_MAX(), позволяющий определить допустимый при дальнейшем изменении набор флагов ограничения доступа (PROT_READ, PROT_WRITE, PROT_EXEC). При помощи PROT_MAX() разработчик может запретить перевод области памяти в категорию исполняемой или запросить память, которая не допускает исполнения, но в дальнейшем может быть переведена в исполняемые. Например, область памяти может быть открыта на запись только на время динамического связывания или генерации кода JIT, но после завершения записи ограничена только чтением и исполнением, и в дальнейшем, в случае компрометации, атакующий не сможет разрешить запись для данного блока памяти. В дополнение к PROT_MAX() также реализован sysctl vm.imply_prot_max, при активации которого набор допустимых флагов определяется на основе исходных параметров первого вызова mmap;
  • Для усиления защиты от эксплуатации уязвимостей помимо техники рандомизации адресного пространства (ASLR) предложен механизм рандомизации смещений указателей, адресующих начальный кадр стека и размещаемые в стеке структуры с информацией об окружении, параметрах запуска программы и данных для исполняемых образов в формате ELF;
  • Проведена работа по удалению небезопасной функции gets из libc (начиная со стандарта C11 данная функция исключена из спецификации) и корректировке портов, ещё использующих данную функцию. Изменение планируется предложить во FreeBSD 13.0;
  • Запущен экспериментальный проект по создания средств оркестровки jail-окружений на основе фреймворка pot для создания и экспортирования образов, реализованного по аналогии с Docker, и драйвера nomad, предоставляющего интерфейс для динамического запуска приложений в jail-окружении. Предложенная модель позволяет разделить процессы создания jail-окружений и развёртывания в них приложений. Одной из целей проекта является предоставление средства для манипуляции jail-ами как контейнерами в стиле Docker;

Системы хранения и файловые системы

  • Из NetBSD в утилиту “makefs” перенесена поддержка файловой системы FAT (msdosfs). Подготовленные изменения позволяют создавать образы ФС с FAT без использования драйвера md и без полномочий root;
  • Завершена переработка драйвера подсистемы FUSE (File system in USErspace), позволяющей создавать реализации файловых систем в пространстве пользователя. Изначально поставляемый драйвер содержал много ошибок и был основан на версии FUSE 7.8, выпущенной 11 лет назад. В рамках проекта по модернизации драйвера реализована поддержка протокола FUSE 7.23 добавлен код для проверки прав доступа на стороне ядра (“-o default_permissions”), добавлены вызовы VOP_MKNOD, VOP_BMAP и VOP_ADVLOCK, обеспечена возможность прерывания операций FUSE, добавлена поддержка неименованных каналов и unix-сокетов в fusefs, появилась возможность использования kqueue для /dev/fuse, разрешено обновление параметров монтирования через “mount -u”, добавлена поддержка экспорта fusefs через NFS, реализован учёт RLIMIT_FSIZE, добавлены флаги FOPEN_KEEP_CACHE и FUSE_ASYNC_READ, внесены значительные оптимизации производительности и улучшена организация кэширования. Новый драйвер включён в ветки head и stable/12 (вошёл в состав FreeBSD 12.1);
  • Почти доведена до конца работа по реализации NFSv4.2 (RFC-7862) для FreeBSD. Основное внимание в отчётный период было уделено тестированию. Завершены тесты для проверки совместимости с реализацией из Linux, но ещё продолжается проверка работы сервера pNFS с NFSv4.2. В общем виде код уже рассматривается как готовый для интеграции в ветки FreeBSD head/current. В новой версии NFS добавлена поддержка функций posix_fadvise, posix_fallocate, режимов SEEKHOLE/SEEKDATA в lseek, операции локального копирования частей файла на сервере (без передачи клиенту);

Поддержка оборудования

  • Стартовал проект по улучшению работы FreeBSD на ноутбуках. Первым устройством, для которого проведён аудит поддержки оборудования во FreeBSD, стал ноутбук Lenovo X1 Carbon седьмого поколения;
  • CheriBSD, ответвление от FreeBSD для исследовательской процессорной архитектуры CHERI (Capability Hardware Enhanced RISC Instructions), обновлено для поддержки грядущего процессора ARM Morello, который будет поддерживать систему управления доступом к памяти CHERI, основывающейся на модели защиты проекта Capsicum. Чип Morello планируют выпустить в 2021 году. Разработчики CheriBSD также продолжают отслеживать развитие эталонного прототипа CHERI на базе архитектуры MIPS;
  • Расширена поддержка чипов RockChip RK3399, используемых в платах RockPro64 и NanoPC-T4. Наиболее существенным улучшением стала поддержка eMMC и разработка нового драйвера для используемого в плате контроллера eMMC;
  • Продолжена работа по реализации поддержки ARM64 SoC Broadcom BCM5871X с процессорами ARMv8 Cortex-A57, нацеленными на использование в маршрутизаторах, шлюзах и сетевых хранилищах. За отчётный период расширена поддержка iProc PCIe и добавлена возможность использования аппаратных криптографических операций для ускорения работы IPsec. Интеграция кода в ветку HEAD ожидается в четвёртом квартале;
  • Отмечаются значительные достижения в разработке порта FreeBSD для платформы powerpc64. Основное внимание уделяется обеспечению качественной работы на системах с процессорами IBM POWER8 и POWER9, но опционально поддерживается работа и на старых Apple Power Mac, x500 и Amiga A1222. Ветка powerpc*/12 продолжает поставляться с gcc 4.2.1, а ветка powerpc*/13 скоро будет переведена на llvm90. Из 33306 портов успешно собирается 30514;
  • Продолжено портирование FreeBSD для 64-разрядного SoC NXP LS1046A на базе процессора ARMv8 Cortex-A72 с интегрированным движком ускорения обработки сетевых пакетов, 10 Gb Ethernet, PCIe 3.0, SATA 3.0 и USB 3.0. За отчётный период реализована поддержка USB 3.0, SD/MMC, I2C, сетевого интерфейса DPAA и GPIO. В планах поддержка QSPI и проведение оптимизации производительности сетевого интерфейса. Завершение работы и включение в ветку HEAD ожидается в 4 квартале 2019 года;
  • Обновлён драйвер ena с поддержкой второго поколения сетевых адаптеров ENAv2 (Elastic Network Adapter), используемых в инфраструктуре Elastic Compute Cloud (EC2) для организации связи между узлами EC2 на скоростях до 25 Gb/s. В драйвер ena добавлена и протестирована поддержка NETMAP, а также проведена адаптация раскладки памяти для включения режима LLQ в окружениях Amazon EC2 A1;

Приложения и система портов

  • Обновлены компоненты графического стека и порты, связанные с xorg. Порты, использующие USE_XORG и XORG_CAT, переведены на фреймворк USES вместо вызова bsd.xorg.mk через bsd.port.mk. Подобные порты теперь включают флаг “USES=xorg” в make-файлах. Функциональность XORG_CAT выделена из bsd.xorg.mk и теперь активируется флагом “USES=xorg-cat”. Добавлен инструментарий для прямого формирования портов xorg из git-репозитория freedesktop.org, что, например, позволяет формировать порты для ещё не выпущенных версий. В дальнейшем планируется подготовить инструментарий для использования сборочной системы meson вместо autotools для сборки портов xorg.Выполнена работа по чистке старых портов xorg, привязанных к уже неподдерживаемым компонентам, например, удалён порт x11/libXp, а порты x11/Xxf86misc, x11-fonts/libXfontcache и graphics/libGLw переведены в разряд устаревших;
  • Проведена работа по улучшению поддержки Java 11 и более новых выпусков во FreeBSD, а также по портированию некоторых изменений в ветку Java 8. После того как для FreeBSD была реализована поддержка таких новых возможностей Java 11, как Java Flight Recorder, HotSpot Serviceability Agent, HotSpot Debugger, DTrace, Javac Server, Java Sound и SCTP, работа переключилась на обеспечение прохождения всех тестов на совместимость. Число сбоев при прохождении тестов снижено с 50 до 2;
  • Рабочий стол KDE Plasma, KDE Frameworks, KDE Applications и Qt поддерживаются в актуальном состоянии и обновлены до самых свежих выпусков;
  • Порты с рабочим столом Xfce обновлены до выпуска 4.14;
  • Коллекция портов FreeBSD преодолела рубеж в 38000 портов, число незакрытых PR немного превышает 2000, из которых 400 PR ещё не разобраны. За отчётный период внесено 7340 изменений от 169 разработчиков. Права коммиттера получили два новых участника (Santhosh Raju и Dmitri Goutnik). Опубликован новый выпуск пакетного менеджера pkg 1.12, в котором реализована поддержка оверлеев в дереве портов и проведена чистка содержимого bsd.sites.mk. Среди значительных обновлений версий в портах отмечаются: Lazarus 2.0.4, LLVM 9.0, Perl5.30, PostgreSQL 11, Ruby 2.6, Firefox 69.0.1, Firefox-esr 68.1.0, Chromium 76.0;
  • Продолжается развитие проекта ClonOSразвивающего специализированный дистрибутив для развёртывания инфраструктуры виртуальных серверов. По решаемым задачам ClonOS напоминает такие системы, как Proxmox, Triton (Joyent), OpenStack, OpenNebula и Amazon AWS, главным отличием от которых является использование FreeBSD и возможность управления, развёртывания и управления Jail-контейнерами FreeBSD и виртуальными средами на базе гипервизоров Bhyve и Xen. Из недавних изменений отмечается поддержка cloud-init для Linux/BSD VM и cloudbase-init для Windows VM, начало перехода на использование собственных образов, задействование Jenkins CI для тестирования сборок и новый pkg-репозиторий для установки ClonOS из пакетов.

По источникам opennet.ua

Залишити відповідь

Дякуємо, що поділились