Введение
Функции безопасности, используемые в операционной системе OpenBSD
Операционная система OpenBSD уделяет особое внимание безопасности и разработке средств защиты. По мнению автора Майкла У. Лукаса, OpenBSD "общепризнанно является наиболее безопасной операционной системой, доступной где бы то ни было, на любых условиях лицензирования".
Изменения в API и сборке
Баги и уязвимости в системе безопасности часто возникают из-за ошибок программистов. Распространенным источником ошибок является неправильное использование строковых функций `strcpy` и `strcat` в языке программирования C. Существуют две общепринятые альтернативы – `strncpy` и `strncat`, но они также могут быть сложны для понимания и легко приводят к ошибкам. Поэтому разработчики OpenBSD Тодд Миллер и Тео де Радт разработали функции `strlcpy` и `strlcat`. Эти функции предназначены для того, чтобы усложнить программистам случайное оставление буферов незавершенными или их переполнение. Они были приняты проектами NetBSD и FreeBSD, но не вошли в GNU C Library. В OpenBSD компоновщик был изменен для выдачи предупреждения при обнаружении небезопасных функций работы со строками, таких как `strcpy`, `strcat` или `sprintf`. Все экземпляры этих функций в исходном коде OpenBSD были заменены. Кроме того, в OpenBSD включен статический анализатор границ для выявления других распространенных ошибок программирования на этапе компиляции. К другим API, связанным с безопасностью, разработанным проектом OpenBSD, относятся `issetugid` и `arc4random`.
Рандомизация ядра
В электронном письме от июня 2017 года Тео де Радт отметил, что проблема со стабильными системами заключается в том, что они могут работать месяцами без перезагрузки. Несмотря на значительную рандомизацию внутри ядра, некоторые ключевые адреса остаются постоянными. Текущий проект изменяет компоновщик таким образом, чтобы при каждой загрузке ядро перекомпоновалось, а также выполнялась вся остальная рандомизация. Это отличается от ASLR ядра; в письме он пишет: "В результате каждое новое ядро уникально. Относительные смещения между функциями и данными также уникальны. [Текущее] изменение – это подготовительная работа, обеспечивающая загрузку перекомпонованного ядра при каждой перезагрузке, чтобы можно было собрать новое случайное ядро. На быстром компьютере это занимает менее секунды. Перезагрузка запускает новое ядро, а следующее ядро создается к следующей загрузке. Внутренние разности между функциями внутри ядра не будут там, где их ожидает злоумышленник, поэтому ему потребуются более эффективные методы утечки информации."
Защита памяти
OpenBSD интегрирует несколько технологий для защиты операционной системы от атак, таких как переполнение буфера или переполнение целочисленных значений. Разработанный Хироаки Этохом, ProPolice — это расширение GCC, предназначенное для защиты приложений от атак, связанных с перезаписью стека. Это достигается за счет ряда операций: локальные переменные стека переупорядочиваются таким образом, чтобы буферы располагались после указателей, защищая их от повреждения в случае переполнения буфера; указатели из аргументов функции также размещаются перед локальными буферами; и после локальных буферов помещается «канареечное» значение, которое при выходе из функции может быть использовано для обнаружения переполнения буфера. ProPolice решает, защищать буфер или нет, на основе автоматической эвристики, оценивающей его уязвимость, что снижает накладные расходы на защиту. Оно было интегрировано в версию GCC OpenBSD в декабре 2002 года и впервые стало доступно в OpenBSD 3.3; оно было применено к ядру в выпуске 3.4. Расширение работает на всех поддерживаемых OpenBSD архитектурах процессоров и включено по умолчанию, поэтому любой скомпилированный код на C будет защищен без вмешательства пользователя. В мае 2004 года OpenBSD на платформе SPARC получил дополнительную защиту стека в виде StackGhost. Это использует возможности архитектуры SPARC для предотвращения эксплуатации переполнения буфера. Поддержка SPARC64 была добавлена в марте 2005 года. OpenBSD 3.4 представил W^X — схему управления памятью, обеспечивающую, чтобы память была либо доступной для записи, либо для исполнения, но никогда и то, и другое одновременно, что предоставляет дополнительный уровень защиты от переполнения буфера. Хотя это относительно легко реализовать на платформе, такой как x86-64, которая имеет аппаратную поддержку бита NX, OpenBSD — одна из немногих ОС, поддерживающих это на универсальной платформе i386, которой не хватает встроенных средств управления выполнением кода на уровне страниц. В процессе разработки выпуска 3.8 были внесены изменения в функции управления памятью malloc. В традиционных Unix-системах malloc выделяет больше памяти, расширяя сегмент данных Unix, что затрудняет реализацию надежной защиты от проблем безопасности. Реализация malloc в OpenBSD использует системный вызов mmap, который был изменен таким образом, чтобы он возвращал случайные адреса памяти и гарантировал, что различные области не будут отображены рядом друг с другом. Кроме того, выделение небольших блоков в общих областях теперь рандомизировано, а функция free была изменена, чтобы немедленно возвращать память в ядро, а не оставлять ее отображенной в процессе. Также были добавлены дополнительные, необязательные проверки для помощи в разработке. Эти функции облегчают обнаружение ошибок в программах и затрудняют их эксплуатацию: вместо повреждения памяти или игнорирования недопустимого доступа они часто приводят к ошибке сегментации и завершению процесса. Это выявило несколько проблем с программным обеспечением, работающим на OpenBSD 3.8, особенно с программами, читающими за пределы начала или конца буфера — тип ошибки, который ранее не был бы обнаружен напрямую, но теперь может вызвать сбой. Для реализации этих возможностей потребовалось более трех лет без значительной потери производительности.
Криптография и рандомизация
Одной из целей проекта OpenBSD является интеграция средств и программного обеспечения для надежной криптографии в ядро операционной системы. Для этого предоставляется ряд функций низкого уровня, включая источник криптографически стойких псевдослучайных чисел; встроенные криптографические хеш-функции и преобразования; и поддержку криптографического оборудования (OpenBSD Cryptographic Framework). Эти возможности используются во всей системе OpenBSD, включая алгоритм хеширования паролей bcrypt, основанный на блочном шифре Blowfish, разработанном Брюсом Шнайером, который использует ресурсоемкий процесс формирования ключа Blowfish, что делает атаки полным перебором менее эффективными. В OpenBSD 5.3 была добавлена поддержка шифрования всего диска, однако для ее включения во время установки OpenBSD требовалось ручное вмешательство пользователя – выход из установщика и выполнение команд. Начиная с OpenBSD 7.3, установщик поддерживает включение шифрования всего диска с помощью пошаговой процедуры, не требующей ручного вмешательства. Для защиты конфиденциальной информации, такой как пароли, от попадания на диск, где она может сохраняться годами, OpenBSD поддерживает шифрование области подкачки. Область подкачки разделена на множество небольших регионов, каждому из которых назначается свой собственный ключ шифрования, который генерируется случайным образом и автоматически, без участия пользователя, полностью хранится в памяти и никогда не записывается на диск, за исключением случаев перехода в режим гибернации; как только данные в регионе больше не нужны, OpenBSD удаляет его ключ шифрования, эффективно превращая данные в этом регионе в бесполезный набор символов. Включение этой функции осуществляется с помощью одной опции конфигурации sysctl и не требует предварительной настройки, разбиения диска или изменения настроек разделов; кроме того, отсутствует выбор параметров шифрования (например, алгоритма или длины ключа), поскольку всегда используются надежные параметры. Использование этой функции не наносит вреда и не приводит к потере функциональности, поскольку ключи шифрования, используемые для доступа к процессам в области подкачки, теряются только при сбое компьютера (например, при отключении питания), после чего все операционные системы в любом случае удаляют предыдущее содержимое памяти и области подкачки, а гибернация продолжает работать как обычно. Эта функция включена по умолчанию в OpenBSD 3.8 (выпущенной в ноябре 2005 года) и более поздних версиях; по состоянию на 2022 год OpenBSD остается единственной известной операционной системой, которая шифрует область подкачки по умолчанию, независимо от шифрования диска и пароля, предоставленного пользователем. (Windows требует изменения настройки конфигурации, которая не представлена в пользовательских приложениях Control Panel и Settings, а другие операционные системы, включая macOS, FreeBSD и все операционные системы на базе Linux, полагаются на существующие функции шифрования диска для шифрования области подкачки, которые часто (а) требуют ручного включения пользователем, (b) требуют настройки (если шифрование диска не было выбрано во время установки операционной системы), что сложнее, чем включение шифрования области подкачки в OpenBSD, и (c) используют пароль, предоставленный пользователем, который пользователям необходимо запомнить и который может быть слабым/угадываемым или даже извлеченным). Сетевой стек также активно использует рандомизацию для повышения безопасности и снижения предсказуемости различных значений, которые могут быть полезны для злоумышленника, включая начальные номера последовательности TCP и временные метки, а также временные порты источника. Также включен ряд функций для повышения устойчивости и доступности сети, включая средства защиты от проблем с ICMP и программное обеспечение для обеспечения избыточности, такое как CARP и pfsync. Проект первым отключил демон telnet, работающий в открытом тексте, в пользу зашифрованного демона SSH в 1999 году, и включает в себя другое интегрированное криптографическое программное обеспечение, такое как IPsec. Демон telnet был полностью удален из OpenBSD в 2005 году перед выпуском версии 3.8. Проект OpenBSD разработал собственную утилиту для криптографической подписи и проверки файлов, signify, вместо использования существующих стандартов и программного обеспечения, таких как OpenPGP и GnuPG. Создатель утилиты signify, Тед Унангст, писал в 2015 году, говоря об OpenPGP и GnuPG: "Мои опасения при использовании существующего инструмента были связаны со сложностью, качеством и, опять же, сложностью". В отличие от этого, другие операционные системы с открытым исходным кодом и программное обеспечение, ориентированное на безопасность, обычно используют OpenPGP для проверки выпусков, и по состоянию на 2022 год продолжают это делать, включая: Debian, известную операционную систему, которая также используется в качестве базы для других операционных систем, включая Ubuntu; Kali Linux, специализированную операционную систему для тестирования на проникновение, исследований в области безопасности, цифровой криминалистики и реверс-инжиниринга; Qubes OS, операционную систему, ориентированную на безопасность; Tor Browser, анонимный веб-браузер; SecureDrop, программный пакет для журналистов и информаторов для безопасного и анонимного обмена информацией в Интернете; и VeraCrypt, программу для шифрования данных на лету и шифрования всего диска.
Х11
В X11 на OpenBSD ни X-сервер, ни X-клиенты обычно не имеют повышенных привилегий прямого доступа к памяти или аппаратному обеспечению: при использовании X с драйверами Intel(4) или Radeon(4) они обычно взаимодействуют с базовым аппаратным обеспечением только через интерфейс ядра Direct Rendering Management(4), так что доступ к памяти/аппаратному обеспечению низкого уровня обрабатывается исключительно ядром. Другие драйверы, такие как WSFB, следуют аналогичной схеме. По этой причине X11 на OpenBSD не предоставляет доступ к памяти или аппаратному обеспечению низкого уровня пользовательским/root программам, как это делается в некоторых других системах и как это было в прошлом, что требовало от пользователя повышения настройки machdep.allowaperture с её значения по умолчанию (ноль) до небезопасного. Версия X Window System в OpenBSD (под названием Xenocara) имеет некоторые модификации в области безопасности. Сервер и некоторые приложения по умолчанию были пропатчены для использования разделения привилегий, а OpenBSD предоставляет драйвер "апертуры" для ограничения доступа X к памяти. Однако, после работы над уязвимостями безопасности X, Лоик Дюфло и Тео де Радт прокомментировал, что драйвер апертуры был лишь "лучшим, что мы могли сделать", и что X "нарушает все модели безопасности, о которых вы услышите на университетских лекциях". Он также раскритиковал разработчиков X за "то, что они медленно решают эту проблему, которой более 10 лет". 29 ноября 2006 года был разработан драйвер ядра VESA, который позволял X работать, хотя и медленнее, без использования драйвера апертуры. 15 февраля 2014 года X был дополнительно модифицирован, чтобы позволить ему работать без привилегий root. После обнаружения уязвимости в X, OpenBSD не поддерживает запуск X от имени пользователя root и поддерживает только запуск X через диспетчер отображения от имени выделенного пользователя x11.
Другие особенности
Разделение привилегий, отмена привилегий, использование chroot и рандомизированная загрузка библиотек также способствуют повышению безопасности системы. Многие из этих мер были применены к OpenBSD-версиям распространенных программ, таких как tcpdump и Apache, а также к системе аутентификации BSD. OpenBSD традиционно предоставляет пользователям полную информацию об обнаруженных командой OpenBSD ошибках и уязвимостях в системе безопасности. Это отражено в слогане проекта: «Всего две удаленные уязвимости в базовой установке за очень долгое время!». OpenBSD разработан с учетом безопасности по умолчанию, что включает (но не ограничивается этим) отключение всех несущественных служб по умолчанию. Это делается не только для того, чтобы избавить пользователей от необходимости изучать и тратить время на обеспечение безопасности своих компьютеров после установки OpenBSD, но и в надежде повысить осведомленность пользователей о вопросах безопасности, требуя от них осознанного принятия решений о включении функций, которые могут снизить уровень защиты. OpenBSD 5.9 включил поддержку нового системного вызова pledge (представленного в OpenBSD 5.8 как tame и переименованного в pledge в 5.9) для ограничения возможностей процесса минимальным набором, необходимым для корректной работы. Если процесс будет скомпрометирован и попытается выполнить несанкционированное действие, ядро завершит его работу. OpenBSD 6.4 представил системный вызов unveil для ограничения видимости файловой системы до минимально необходимого уровня. Pledge и unveil используются совместно для ограничения приложений, дополнительно сужая круг действий, разрешенных им под учетной записью пользователя. С момента внедрения pledge базовые программы OpenBSD (входящие в состав системы), приложения (поддерживаемые их разработчиками) и порты (приложений, поддерживаемые командой OpenBSD) были обновлены для использования pledge и/или unveil. Примеры сторонних приложений, обновленных с использованием этих функций (их разработчиками или в портах приложений OpenBSD), включают веб-браузеры Chromium и Firefox.