LibreSSL — библиотека с реализацией протоколов SSL/TLS. Эта библиотека является продуктом команды OpenBSD, в рамках которого развивается форкOpenSSL, нацеленный на обеспечение высшего уровня безопасности. До основания форка была обнаружена уязвимость heartbleed в OpenSSL.
Из особенностей LibreSSL можно отметить ориентацию на качественную поддержку протоколов SSL/TLS с изъятием излишней функциональности, привлечением дополнительных средств защиты и проведением значительной чистки и переработки кодовой базы.
Проект OpenBSD разрабатывает нативную редакцию пакета LibreSSL собственно для OpenBSD и переносимую редакцию для Unix-подобных систем и Microsoft Windows.[4]
После того, как в OpenSSL была обнаружена уязвимость Heartbleed, команда разработчиков OpenBSD провела аудит кода и пришла к выводу о необходимости создания и поддержки собственного форка библиотеки[5]. 11 апреля 2014 года был зарегистрирован домен libressl.org, а 22 апреля 2014 года объявлено о запуске проекта.
В течение первой недели разработчики удалили более 90000 строк кода на языке Си[6][7]. Удалению подвергся устаревший или неиспользуемый код, также была убрана поддержка устаревших и редко используемых в наше время операционных систем. Первоначально планировалось разрабатывать библиотеку LibreSSL как замену OpenSSL в операционной системе OpenBSD 5.6, а после того, как облегченная библиотека станет достаточно стабильной, портировать её на другие платформы[8][9].
17 мая 2014 года на конференции 2014 BSDCan Боб Бек представил доклад "LibreSSL: Первые 30 дней и что ждёт нас в будущем", в котором были описаны результаты первого месяца разработки, внесённые изменения и обнаруженные проблемы.[10]
5 июня 2014 были обнародованы некоторые уязвимости в OpenSSL. Хотя некоторым проектам сообщили об этих уязвимостях заранее[11], разработчики LibreSSL не были проинформированы; в результате Тео де Раадт обвинил разработчиков OpenSSL в преднамеренном сокрытии информации от проектов OpenBSD и LibreSSL[12].
20 июня 2014 компания Google создала ещё один форк OpenSSL под названием BoringSSL и объявила о намерении делиться патчами с проектом LibreSSL[13][14]. По просьбе разработчиков LibreSSL компания Google изменила лицензию некоторых своих изменений на лицензию ISC[13][15]. 21 июня Тео де Раадт объявил о планах по выпуску переносимой версии библиотеки LibreSSL-portable[16]. 20 июня началось портирование кода на Linux[17], а 8 июля - на платформы OS X и Solaris[18].
11 июля 2014 года вышлая первая переносимая версия LibreSSL 2.0.0[19][20]. За первым релизом быстро последовали версии 2.0.1[21] (13 июля), 2.0.2[22] (16 июля), 2.0.3[23] (22 июля), 2.0.4[24] (3 августа) и 2.0.5[25] (5 августа), в которых были исправлены многие недостатки первой переносимой версии.
28 сентября 2014 Тед Унангст представил доклад "LibreSSL: более чем 30 дней спустя", в котором описаны достижения, проблемы и изменения, сделанные за несколько месяцев после доклада Боба Бека на конференции BSDCan[10][26].
Начиная с версии 2.1.0,[27], вышедшей 12 октября 2014 года, скорость внесения изменений в LibreSSL существенно упала, а библиотека стала рабочей альтернативой OpenSSL. Большинство изменений в версиях 2.1.x являются устранением уязвимостей, найденных в OpenSSL.
Использование
LibreSSL используется в качестве библиотеки по умолчанию для реализации TLS в следующих системах:
Некоторые из наиболее заметных и важных изменений связаны с заменой самописных функций по работе с памятью на функции стандартной библиотеки (например, strlcpy, calloc, asprintf, reallocarray и т.д.)[35][36]. Это позволит в дальнейшем находить ошибки, связанные с переполнением буфера, при помощи специальных инструментов анализа утечек памяти, а также исследовать сбои при помощи технологии ASLR, атрибута NX bit, «осведомителей» и т.п.
В логесистемы контроля версий также наблюдаются исправления потенциальных двойных освобождений памяти[37]. Также внесено множество дополнительных проверок на соответствие размеров параметров, преобразований между беззнаковыми и знаковыми переменными, проверок значений указателей и возвращаемых значений.
Превентивные меры
В соответствии с общепринятыми практиками безопасного программирования, по умолчанию включены опции и флаги компилятора, направленные на обнаружение потенциальных проблем на этапе сборки (-Wall, -Werror, -Wextra, -Wuninitialized). Улучшена читаемость кода, что должно облегчить проверку кода в будущем. Исправление или удаление ненужных макросов и обёрток методов также улучшает читаемость кода и облегчает аудит.
В коде LibreSSL полностью устранена проблема 2038 года. Кроме того, для предотвращения удаления компилятором кода очистки памяти из оптимизированной сборки добавлены вызовы функций explicit_bzero и bn_clear, чтобы потенциальный атакующий не мог прочитать значения из ранее использованной памяти.
2.2.1: Добавлены эллиптические кривые EC_curve_nid2nist и EC_curve_nist2nid[47] из OpenSSL, первоначальная поддержка Windows XP/2003
2.2.2: Определена константа LIBRESSL_VERSION_NUMBER[48], добавлены методы TLS_* как замена методам SSLv23_*, поддержка сборки при помощи cmake.
Старые небезопасные возможности
В первоначальной версии LibreSSL некоторые возможности были по умолчанию отключены[28]. Реализация некоторых из этих возможностей была позднее удалена полностью, включая поддержку Kerberos, экспортного набора шифров, TLS сжатия, DTLS heartbeat, и SSL v2.
В более поздних версиях были дополнительно отключены следующие возможности:
2.1.1: После выявления уязвимости POODLE в устаревшем протоколе SSL 3.0, в LibreSSL этот протокол по умолчанию отключен[49].
Удалены движкиIBM 4758, Broadcom ubsec, Sureware, Nuron, GOST, GMP, CSwift, CHIL, CAPI, Atalla и AEP вследствие неактуальности аппаратного обеспечения или зависимости от несвободных библиотек
Одной из причин критики OpenSSL является большое количество записей в системе отслеживания ошибок, которые остаются неисправленными в течение многих лет. Теперь эти старые ошибки исправляются в LibreSSL[53].
Безопасность и наличие уязвимостей
LibreSSL оказалась не подверженной многим уязвимостям, найденном в OpenSSL после ответвления форка. Примечательно, что ни одна из найденных за это время в OpenSSL уязвимостей высокой степени не применима к LibreSSL.
↑ 1234Jacoutot, Antoine (1 ноября 2014). "OpenBSD 5.6 Released". openbsd-announce (Mailing list). Архивировано 31 января 2016. Дата обращения: 28 октября 2015.
↑Cook, Brent (17 марта 2015). "LibreSSL 2.1.5 released". openbsd-announce (Mailing list). Архивировано 18 февраля 2018. Дата обращения: 28 октября 2015.
↑Cook, Brent (19 марта 2015). "LibreSSL 2.1.6 released". openbsd-announce (Mailing list). Архивировано 18 февраля 2018. Дата обращения: 28 октября 2015.