«Всего две удаленные уязвимости за черт знает сколько лет!» — слоган OpenBSD, самой безопасной UNIX-подобной операционной системы. Долгое время OpenBSD получала финансирование от DARPA, созданный ее разработчиками сервер OpenSSH знаком любому IT-шнику, а разные компоненты этой ОС используются в твоем компе, смартфоне и роутере. OpenBSD — поистине бриллиант семейства BSD, и сегодня мы вглядимся в его грани.
История вопроса
История OpenBSD, ее философия, идеи и вообще причина существования тесно связаны с Тео де Раадтом, эксцентричным, высокомерным, невыносимым в общении, но невероятно талантливым программистом и руководителем. Тео стоял у истоков NetBSD, и придумал ей имя тоже он, однако многочисленные конфликты с другими участниками команды и просто неуважение к оппонентам в споре привели к тому, что в декабре 1994 года его с шумом выставили из команды разработчиков.
Долгое время, пытаясь наладить контакт или, скорее сказать, выпросить доступ к репозиторию кода, Тео продолжал программировать, допиливать порт NetBSD на SPARC, но в конце концов сдался и просто пропал. Однако вместо того, чтобы затеряться среди программистов в какой-нибудь крупной IT-компании, он форкнул NetBSD и на свой страх и риск начал разработку совершенно новой ОС, решив развивать ее по своим собственным законам и правилам.
Одна из его ключевых идей состояла в том, что операционка должна развиваться абсолютно открыто, а свежайший код всегда должен быть доступен для изучения всем желающим. Так появился первый публичный анонимный CVS-репозиторий кода, идея абсолютно обыденная сегодня, но в те времена кардинально новая. Это принесло плоды, и вскоре независимые разработчики начали присылать свои патчи, а к команде присоединились другие люди. Уже в июле 1996 года, через полгода после основания проекта, состоялся релиз OpenBSD 1.2, а в октябре за ним последовал релиз 2.0, после чего выпуск релизов начал происходить каждые полгода, невзирая на погоду, болезни, катастрофы или любые другие помехи.
Последний на момент написания статьи релиз OpenBSD — 5.8, и на сегодня это самая популярная BSD-система после FreeBSD. На OpenBSD работает огромное количество устройств, большинство из них сетевые фильтры. А о том, где используются ее компоненты, так и вообще не приходится говорить: iOS, Android, Windows, OS X; так или иначе части OpenBSD можно найти практически везде, и это еще не считая OpenSSH, созданного ее разработчиками.
Если говорить о рядовых пользователях, то это достаточно большой костяк, а самое главное, что почти каждый из них не просто «перешел на OpenBSD», а стал ярым фанатом системы и того пути, по которому идет ее развитие. Операционка действительно очень сильно к себе располагает, и причина тому — идеология.
Xakep #207. Дистанционное банковское ограбление
INFO
Для каждого нового релиза OpenBSD готовится своя собственная композиция.
Три столпа OpenBSD
OpenBSD держится на трех столпах, причем не просто держится, а вцепилась в них мертвой хваткой:
- приверженность идеям СПО;
- качество кода;
- безопасность.
Идеи СПО
Разработчики OpenBSD очень трепетно относятся к тому, каким образом лицензируется код для включения в систему. Исходный код самой системы распространяется под лицензией ISC, которая является упрощенным вариантом лицензии BSD и сводится к одному простому предложению: «Делайте с кодом все, что хотите, но не говорите, что он написан вами».
Однако в отношении стороннего софта, включенного в поставку OpenBSD, действуют жесткие правила. По сути, есть только две приемлемые для разработчиков сторонние лицензии: BSD и MIT, остальные считаются «нежелательными». По этой причине разработчики регулярно предпринимают попытки переписать известный GNU-софт, распространяемый по лицензии GPL, или найти ему замену. В свое время были переписаны многие утилиты, включая diff и grep, а знаменитый OpenBSD-шный брандмауэр PF появился как ответ на изменение политики лицензирования IPFilter. Регулярно поднимается вопрос о создании собственного C-компилятора для замены GCC, однако возможностей для этого пока нет.
Тео де Раадт никоим образом не приемлет включение бинарных блобов в ядро. По его словам, бинарный код, аудит которого нельзя провести, не вызывает доверия и может работать абсолютно непредсказуемо или содержать закладки. Поэтому нередко разработчики OpenBSD вынуждены заниматься реверс-инжинирингом проприетарных драйверов, и именно благодаря этим ребятам мы имеем открытые драйверы для многих устройств.
Качество кода и безопасность
OpenBSD по праву считается «системой для параноиков». Такого количества включенных по умолчанию средств защиты нет больше ни в одной другой продакшен ОС. Более того, многие из средств защиты, используемых сегодня повсеместно (privilege separation, например), были либо придуманы, либо впервые внедрены разработчиками OpenBSD. Эти механизмы совершенствуются с каждым новым релизом ОС, регулярно появляются и обкатываются новые идеи.
Одна из ключевых идей OpenBSD — тотальная рандомизация всего, что только можно. Процессы всегда создаются с рандомными идентификаторами (PID), номера inode при создании файлов назначаются случайным образом, системный вызов bind() использует случайные порты для привязки сокетов, начальные номера последовательности в TCP-соединении всегда случайны, timestamp’ы случайны. Все это сделано для того, чтобы максимально усложнить жизнь взломщику.
Вторая идея — всесторонняя борьба с атаками, направленными на срыв стека. Первая линия обороны здесь — это уже ставший стандартом принцип privilege separation, когда приложение получает необходимые ему повышенные полномочия (права root) только на короткие промежутки времени, так что взломщик приложения не сможет раздобыть права root в большинстве случаев. Лучший пример здесь — это OpenSSH, который работает попеременно на трех «уровнях доступа»: monitor, в котором ему доступны права root, slave — когда код работает с правами специального юзера sshd, и второй вариант slave, когда OpenSSH обслуживает пользовательскую сессию и работает с его правами.
Вторая линия обороны — безопасные версии функций Libc и -fstack-protector. Когда-то, чтобы решить проблему переполнения буфера при использовании функций strcpy() и strcat(), в библиотеку Libc были введены функции strncpy() и strncat(), позволяющие ограничить размер копируемых данных и не допустить переполнения. Однако сами эти функции также оказались уязвимыми и в случае неправильного использования тоже приводили к выходу за границы буфера. По этой причине разработчики OpenBSD реализовали собственные «правильные» версии функций под названием strlcpy() и strlcat() и перевели на их использование все компоненты ОС.
OpenBSD также была одной из первых систем с принудительной сборкой всех приложений компилятором GCC с включенной опцией ProPolice (аргумент командной строки -fstack-protector). Данный механизм слегка модифицирует код приложения перед окончательной сборкой, а именно заставляет его размещать в стеке случайный набор данных (canary) перед вызовом небезопасных функций и проверять его наличие после совершения вызова. В случае срыва стека canary будет затерт, приложение это заметит и просто завершится.
Данный метод защиты сегодня используется практически во всех ОС, включая все BSD и ведущие дистрибутивы Linux. Но разработчики OpenBSD пошли еще дальше: в дополнение к -fstack-protector они реализовали в ядре механизм, внедряющий небольшой «разрыв» случайного размера в начале стека, так что, если атакующий использует классический прием срыва стека, заставляя приложение исполнять шелл-код, находящийся в самом стеке, он потерпит неудачу, поскольку не будет знать, по какому адресу находится этот код.
Третья линия — ASLR, randomized malloc() и W^X. OpenBSD стала первой ОС с включенным по умолчанию механизмом ASLR. Последний позволяет рандомизировать адреса регионов памяти процесса (таких как стек, куча, область данных), кода и библиотечных функций. В результате выполнить некоторые типы атак, например ret2libc, стало практически невозможно. Кроме того, в OpenBSD имеется уникальный механизм рандомизации кучи путем выделения случайных регионов памяти при вызове malloc() (вместо ее простого расширения).
Еще одна уникальная для OpenBSD функция — это W^X (write or execute). Она гарантирует, что страница памяти процесса одновременно может быть либо записываемой, либо исполняемой, но не оба варианта сразу. Это обеспечивает, например, что внедренный в стек шелл-код не будет выполнен (так как стек — записываемая область памяти). На современных платформах W^X использует специальный NX-бит (No eXecute), появившийся в 64-разрядных процессорах Intel и AMD, и в этом нет ничего уникального (Linux делает то же самое), однако в OpenBSD такая защита работает даже на 32-битных процессорах i386.
В целом уровень защитных механизмов OpenBSD довольно параноидален. Дело доходит даже до того, что по умолчанию шифруется раздел подкачки, причем вовсе не для галочки. Swap-раздел разбивается на небольшие участки, каждый из которых шифруется собственным случайным ключом. Освобождение и «очистка» занятых участков происходит с помощью отзыва ключа.
Но и это еще не все. В последних релизах разработчики пошли дальше и начали выпиливать из ядра вполне полезный, но несущий проблемы с безопасностью код. Так, из версии 5.7 были убраны поддержка модулей ядра (чтобы никто не загрузил ядерный бэкдор) и виртуальная ФС /proc (чтобы никто не подсматривал за чужими процессами), а в текущем коде уже исчезла поддержка эмуляции Linux. Справедливости ради стоит отметить, что в OpenBSD данные механизмы никогда не были особо нужны и рядовой пользователь даже не заметит их отсутствия.
Софт
В рамках проекта OpenBSD развивается не только ОС, но и внушительное количество субпроектов. Один из таких проектов — это, конечно же, OpenSSH, но на нем мы останавливаться не будем. Также у проекта есть свой собственный SMTP-сервер (OpenSMTPD), веб-сервер (httpd), спам-фильтр (spamd) и даже менеджер окон (cwm). В OpenBSD интегрирован PF — один из самых продвинутых брандмауэров, который был портирован во все остальные BSD-системы, OS X, iOS и QNX.
Софт, развиваемый в рамках проекта OpenBSD
- OpenSSH — самая известная и популярная реализация протокола SSH.
- LibreSSL — форк OpenSSL, очищенный от устаревших алгоритмов, поддержки устаревших ОС и мертвого кода.
- OpenSMTPD — SMTP-сервер с поддержкой PAM, Maildir и виртуальных доменов.
- OpenNTPD — простой NTP-сервер (Network Time Protocol).
- httpd — легкий HTTP-сервер с поддержкой CGI и HTTPS.
- relayd — балансировщик нагрузки и прокси.
- dhclient — реализация DHCP-клиента.
- OpenBGPD — реализация протокола BGP-4 (Border Gateway Protocol).
- OpenOSPFD — реализация протокола маршрутизации OSPF (Open Shortest Path First).
- OpenIKED — реализация протокола IKEv2 (Internet Key Exchange).
- CARP — Common Address Redundancy Protocol, свободная реализация стека протоколов HSRP/VRRP Cisco.
- PF — брандмауэр с поддержкой NAT, PAT, QoS и нормализации трафика.
- pfsync — протокол синхронизации состояний брандмауэров.
- spamd — спам-фильтр с поддержкой серых списков и интеграцией с PF.
- sndio — звуковой сервер, аналог PulseAudio.
- duas — легковесная альтернатива утилите sudo.
- tmux — менеджер терминалов, аналог GNU Screen.
- cwm — легковесный менеджер окон для X Window system.
Выводы
Разработчики OpenBSD очень продуктивны во всем, что касается генерации идей и написания сложного кода. Именно они впервые обкатали все те идеи, что сегодня стандартны в других операционных системах, они же создали OpenSSH, без которого жизнь современного админа просто немыслима. Однако не стоит думать, будто это все, что можно было получить от системы. OpenBSD очень красива и действительно удобна для применения в продакшене. Здесь все на своих местах и абсолютно логично, утилиты имеют единый интерфейс, встроенные сервисы — единый простой и понятный формат конфигурации, а настраивать даже сложные конфигурации брандмауэра — приятное времяпрепровождение.
Достаточно просто поставить систему и попробовать поднять на ее базе какой-то сервис, чтобы ощутить, настолько современный Linux далек от понятия простоты и удобства.