LibreSSL

LibreSSL — библиотека с реализацией протоколов SSL/TLS. Эта библиотека является продуктом команды OpenBSD, в рамках которого развивается форк OpenSSL, нацеленный на обеспечение высшего уровня безопасности. До основания форка была обнаружена уязвимость heartbleed в OpenSSL.

Из особенностей LibreSSL можно отметить ориентацию на качественную поддержку протоколов SSL/TLS с изъятием излишней функциональности, привлечением дополнительных средств защиты и проведением значительной чистки и переработки кодовой базы.

Проект OpenBSD разрабатывает нативную редакцию пакета LibreSSL собственно для OpenBSD и переносимую редакцию для Unix-подобных систем и Microsoft Windows.

История

После того, как в OpenSSL была обнаружена уязвимость Heartbleed, команда разработчиков OpenBSD провела аудит кода и пришла к выводу о необходимости создания и поддержки собственного форка библиотеки. 11 апреля 2014 года был зарегистрирован домен libressl.org, а 22 апреля 2014 года объявлено о запуске проекта.

В течение первой недели разработчики удалили более 90000 строк кода на языке Си. Удалению подвергся устаревший или неиспользуемый код, также была убрана поддержка устаревших и редко используемых в наше время операционных систем. Первоначально планировалось разрабатывать библиотеку LibreSSL как замену OpenSSL в операционной системе OpenBSD 5.6, а после того, как облегченная библиотека станет достаточно стабильной, портировать её на другие платформы.

17 мая 2014 года на конференции 2014 BSDCan Боб Бек представил доклад "LibreSSL: Первые 30 дней и что ждёт нас в будущем", в котором были описаны результаты первого месяца разработки, внесённые изменения и обнаруженные проблемы.

5 июня 2014 были обнародованы некоторые уязвимости в OpenSSL. Хотя некоторым проектам сообщили об этих уязвимостях заранее, разработчики LibreSSL не были проинформированы; в результате Тео де Раадт обвинил разработчиков OpenSSL в преднамеренном сокрытии информации от проектов OpenBSD и LibreSSL.

20 июня 2014 компания Google создала ещё один форк OpenSSL под названием BoringSSL и объявила о намерении делиться патчами с проектом LibreSSL. По просьбе разработчиков LibreSSL компания Google изменила лицензию некоторых своих изменений на лицензию ISC. 21 июня Тео де Раадт объявил о планах по выпуску переносимой версии библиотеки LibreSSL-portable. 20 июня началось портирование кода на Linux, а 8 июля - на платформы OS X и Solaris.

11 июля 2014 года вышлая первая переносимая версия LibreSSL 2.0.0. За первым релизом быстро последовали версии 2.0.1 (13 июля), 2.0.2 (16 июля), 2.0.3 (22 июля), 2.0.4 (3 августа) и 2.0.5 (5 августа), в которых были исправлены многие недостатки первой переносимой версии.

28 сентября 2014 Тед Унангст представил доклад "LibreSSL: более чем 30 дней спустя", в котором описаны достижения, проблемы и изменения, сделанные за несколько месяцев после доклада Боба Бека на конференции BSDCan.

Начиная с версии 2.1.0,, вышедшей 12 октября 2014 года, скорость внесения изменений в LibreSSL существенно упала, а библиотека стала рабочей альтернативой OpenSSL. Большинство изменений в версиях 2.1.x являются устранением уязвимостей, найденных в OpenSSL.

Использование

LibreSSL используется в качестве библиотеки по умолчанию для реализации TLS в следующих системах:

  • OpenBSD, начиная с версии 5.6
  • Void Linux, начиная с 6 августа 2014 года
  • PC-BSD, начиная с версии 10.1.2
  • как альтернатива в OPNsense, начиная с версии 15.7
  • OpenELEC, начиная с версии 6.0beta2
  • OS X, начиная с версии 10.11 El Capitan
  • Изменения

    Работа с памятью

    Некоторые из наиболее заметных и важных изменений связаны с заменой самописных функций по работе с памятью на функции стандартной библиотеки (например, strlcpy, calloc, asprintf, reallocarray и т.д.). Это позволит в дальнейшем находить ошибки, связанные с переполнением буфера, при помощи специальных инструментов анализа утечек памяти, а также исследовать сбои при помощи технологии ASLR, атрибута NX bit, «осведомителей» и т.п.

    В логе системы контроля версий также наблюдаются исправления потенциальных двойных освобождений памяти. Также внесено множество дополнительных проверок на соответствие размеров параметров, преобразований между беззнаковыми и знаковыми переменными, проверок значений указателей и возвращаемых значений.

    Превентивные меры

    В соответствии с общепринятыми практиками безопасного программирования, по умолчанию включены опции и флаги компилятора, направленные на обнаружение потенциальных проблем на этапе сборки (-Wall, -Werror, -Wextra, -Wuninitialized). Улучшена читаемость кода, что должно облегчить проверку кода в будущем. Исправление или удаление ненужных макросов и обёрток методов также улучшает читаемость кода и облегчает аудит.

    В коде LibreSSL полностью устранена проблема 2038 года. Кроме того, для предотвращения удаления компилятором кода очистки памяти из оптимизированной сборки добавлены вызовы функций explicit_bzero и bn_clear, чтобы потенциальный атакующий не мог прочитать значения из ранее использованной памяти.

    Криптография

    Небезопасная инициализация генератора псевдослучайных чисел начальными значениями была заменена на возможности, предоставляемые ядром операционной системы. Среди других существенных нововведений стоит отметить поддержку нового поточного шифра ChaCha и кода аутентификации сообщений Poly1305, а также более безопасного набора эллиптических кривых (кривые brainpool из RFC 5639, до 512 бит).

    Добавленные возможности

    В первой версии LibreSSL были добавлены следующие возможности: поддержка алгоритмов ChaCha и Poly1305, эллиптические кривые Brainpool и ANSSI, AEAD-режимы шифрования AES-GCM и ChaCha20-Poly1305.

    В последующих версиях появилось следующее:

    • 2.1.0: Автоматические эфемерные ключи на эллиптических кривых
    • 2.1.2: Поддержка встроенного ГПСЧ arc4random на OS X и FreeBSD
    • 2.1.2: Переработана поддержка шифра ГОСТ
    • 2.1.3: Поддержка ALPN
    • 2.1.3: Поддержка SHA-256 Camellia cipher suites
    • 2.1.4: Поддержка TLS_FALLBACK_SCSV на стороне сервера
    • 2.1.4: certhash как замена скрипта c_rehash
    • 2.1.4: X509_STORE_load_mem API для загрузки сертификатов из памяти (улучшенная поддержка chroot)
    • 2.1.4: Экспериментальная сборка для Windows
    • 2.1.5: Улучшения поддержки Windows, первые работающие 32- и 64-битные сборки
    • 2.1.6: Библиотека libtls объявлена стабильной и включена по умолчанию
    • 2.2.0: Поддержка AIX и Cygwin
    • 2.2.1: Добавлены эллиптические кривые EC_curve_nid2nist и EC_curve_nist2nid из OpenSSL, первоначальная поддержка Windows XP/2003
    • 2.2.2: Определена константа LIBRESSL_VERSION_NUMBER, добавлены методы TLS_* как замена методам SSLv23_*, поддержка сборки при помощи cmake.

    Старые небезопасные возможности

    В первоначальной версии LibreSSL некоторые возможности были по умолчанию отключены. Реализация некоторых из этих возможностей была позднее удалена полностью, включая поддержку Kerberos, экспортного набора шифров, TLS сжатия, DTLS heartbeat, и SSL v2.

    В более поздних версиях были дополнительно отключены следующие возможности:

    • 2.1.1: После выявления уязвимости POODLE в устаревшем протоколе SSL 3.0, в LibreSSL этот протокол по умолчанию отключен.
    • 2.1.3: Убрана поддержка цифровой подписи ГОСТ Р 34.10-94
    • 2.2.1: Удалена поддержка динамического движка и MDC-2DES
    • 2.2.2: Удалена поддержка SSLv3 из бинарника openssl, удалена поддержка Internet Explorer 6, движка RSAX.
    • 2.3.0: Полностью удалена поддержка SSLv3, SHA-0 и DTLS1_BAD_VER

    Убранные возможности

    В первом релизе LibreSSL в OpenBSD 5.6 было удалено большое количество кода, который посчитали небезопасным, ненужным или устаревшим.

    • В ответ на уязвимость Heartbleed, одной из первых удалённых возможностей была поддержка Heartbeat-пакетов
    • Поддержка ненужных платформ («классическая» Mac OS, NetWare, OS/2, VMS, 16-битная Windows и др.)
    • Поддержка старых компиляторов
    • Удалены движки IBM 4758, Broadcom ubsec, Sureware, Nuron, GOST, GMP, CSwift, CHIL, CAPI, Atalla и AEP вследствие неактуальности аппаратного обеспечения или зависимости от несвободных библиотек
    • Генератор псевдослучайных чисел OpenSSL удалён (и заменён на arc4random)
    • Макросы препроцессора Си, которые посчитали ненужными или небезопасными и которые были помечены как устаревшие ещё в OpenSSL (например, des_old.h)
    • Старые ненужные файлы на языке ассемблера, Си и Perl (например, EGD)
    • Поддержка MD2 и SEED
    • SSLv3, SHA-0, DTLS1_BAD_VER

    Алгоритм Dual_EC_DRBG, который подозревают в наличие бэкдора, также подвергся уничтожению. Также были удалены неиспользуемые протоколы и небезопасные алгоритмы, включая поддержку стандарта FIPS 140-2, MD4/MD5 J-PAKE, и SRP.

    Старые ошибки

    Одной из причин критики OpenSSL является большое количество записей в системе отслеживания ошибок, которые остаются неисправленными в течение многих лет. Теперь эти старые ошибки исправляются в LibreSSL.

    Безопасность и наличие уязвимостей

    LibreSSL оказалась не подверженной многим уязвимостям, найденном в OpenSSL после ответвления форка. Примечательно, что ни одна из найденных за это время в OpenSSL уязвимостей высокой степени не применима к LibreSSL.