International conference of developers
and users of free / open source software

OpenBSD 5.8 & 5.9

Vadim Zhukov, Moscow, russia

LVEE Winter 2016

At the time of LVEE Winter, the OpenBSD repositories will be in pre-release lock, so it's a perfect time to take a deep look at changes happened. In particular: a) pledge(2): simple tool for improving security of your own programs; b) cloud-ready OpenBSD: native OpenBSD hypervisor, Xen support, improvements in service management; c) new oldies: file(1), doas(1); d) UTF-8 support for everybody.

В последний и грядущий релизы OpenBSD (5.8 и 5.9, соответственно) вошло немало изменений. Не пытаясь перечислить их все, остановимся на самых любопытных и неоднозначных.

pledge(2)

Новый защитный фреймворк. Изначально анонсирован как tame(2). Идея ограничения системных вызовов, используемых приложением, не нова. В том же OpenBSD уже давно имеется systrace, а в наиболее популярном открытом ядре, Linux, имеется разработанный когда-то в АНБ SELinux (строго говоря, последний делает больший акцент на файловые дескрипторы, но всё же). Главное отличие pledge(2) – семантический подход.

В pledge(2) системные вызовы сгруппированы в соответствии с типовыми профилями их использования. Более того, контроль в отдельных случаях ведётся на уровне аргументов системных вызовов: например, область “unix” разрешает работу с сокетами, но только в домене AF_UNIX (они же AF_LOCAL). Попытка создать или подключиться к сокету, скажем, по IPv4 приведёт к немедленной, неконтролируемой смерти программы.

Вызывать pledge(2) можно несколько раз во время выполнения программы, постепенно уменьшая количество требуемых привилегий. Собственно, идея pledge(2) во многом опирается на двухэтапную организацию процесса работы программы: сначала инициализация (возможно, требующая расширенных прав), а после – основной рабочий цикл программы, в котором программа занимается в основном обработкой данных и, скажем, не открывает новые сокеты.

Такой подход, конечно, конфликтует с ПО, которое позволяет переконфигурировать себя в ходе работы и не использует при этом разделение привилегий (priviledge separation). Однако стоит отметить, что за счёт такой “гибкости” такое ПО одновременно становится куда более уязвимым.

На данный момент под контроль pledge(2) переведена большая часть базовой системы OpenBSD (порядка 90% всех приложений). Также поддержка pledge(2) постепенно добавляется в стороннее ПО, например: p7zip, mutt, Chromium/Iridium… Сверх того, для данного API уже реализованы обвязки под ряд языков программирования, от Python до Haskell.

Поддержка хост-режима виртуализации и поддержка Xen

OpenBSD уже несколько лет является добротной платформой для облачной инфраструктуры, но только в качестве гостевой системы. Хост-режим до недавнего времени был доступен только на платформе sparc64.

По ряду причин Reyk Floeter сотоварищи решили реализовывать гипервизор самостоятельно. На данный момент он умеет грузить только OpenBSD, поддержку других ОС стоит ожидать после релиза 5.9. Гипервизор не планируется настолько же богатым по возможностям, как, скажем, у VMWare. Конфигурационный файл vmd(8) легко читаем и схож по синтаксису с другими разработками OpenBSD, вроде httpd(8).

Параллельно с этим Михаил Белопухов реализовал поддержку паравиртуализации Xen. Благодаря проделанной Михаилом работе OpenBSD теперь может полноценно взаимодействовать с Xen-хостом, включая корректную инициализацию виртуальных устройств.

Для поддержки различных гипервизоров ещё в OpenBSD 5.8 была добавлена специальная шина драйверов, pvbus(4). На данный момент она обеспечивает поддержку следующих гипервизоров: Hyper-V, KVM, VMware, Xen, а также, конечно, вышеупомянутого родного гипервизора.

file(1) и doas(1)

Два сравнительно небольших изменения, отлично иллюстрирующих вектор развития OpenBSD.

file(1) и связанная с ней libmagic используются довольно часто. При этом в описании форматов, равно как и в самом коде file(1), нередко находят ошибки, уже не раз приводившие к опасным уязвимостям. При этом самой утилите, несмотря на сложную внутренню логику, практически не требуется какой-либо доступ к окружающей системе, а фактически используемый набор функций и запрашиваемых сведений о файлах весьма мал… В итоге file(1) была переписана Nicholas Marriott (к слову, автором tmux) с использованием техники разделения привилегий: фактический разбор входного потока происходит в предельно ограниченном процессе, который от получает от мастер-процесса файловые дескрипторы для анализа.

doas(1) — по сути, сильно упрощённая альтернатива sudo(8) с чуть более удобным синтаксисом. Общий код умещается в 822 строчки, включая комментарии и заголовочный файл. Для сравнения, в sudo 1.8.15 содержится 83596 строк. Из заметных “потерь” – sudoedit и явный проброс переменных окружения в командной строке.

UTF-8 для всех и каждого

Свершилось то, чего давно ждали: OpenBSD уходит от однобайтных кодировок в сторону UTF-8. Хотя принято считать, что данный переход прозрачен, на самом деле существует целая россыпь подводных камней, прежде всего, в работе с терминальными приложениями: начиная от расчёта ширины строки и заканчивая, как ни удивительно, вопросами безопасности: если программа пытается честно, но не слишком внимательно, интерпретировать UTF-8, то злонамеренный пользователь может заставить её исказить обрабатываемые данные, или их отображение для других пользователей.

Дополнительные источники

  1. Презентация pledge
  2. Отчёт о хакатоне n2k15, включая рассказ о vmd
  3. Анонс поддержки Xen

Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license

Back