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

LibreSSL
LibreSSL logo as of 2014-04-22.png
Тип библиотека функций
Разработчик OpenBSD Project[d]
Написана на Си[3] и ассемблер
Операционная система BSD[d][4], GNU/Linux[d][4], GNU/Hurd[d][4], UNIX, macOS[4] и Microsoft Windows[4]
Первый выпуск 11 июля 2014
Последняя версия
Тестовая версия
Лицензия OpenSSL License[d][4], Лицензия ISC[4] и передано в общественное достояние владельцем авторских прав[d][4]
Сайт libressl.org​ (англ.)

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

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

ИсторияПравить

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

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

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

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

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

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

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

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

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

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

  1. OpenBSD, начиная с версии 5.6[29]
  2. Void Linux, начиная с 6 августа 2014 года[30]
  3. PC-BSD, начиная с версии 10.1.2[31]
  4. как альтернатива в OPNsense, начиная с версии 15.7[32]
  5. OpenELEC, начиная с версии 6.0beta2[33]
  6. OS X, начиная с версии 10.11 El Capitan[34]

ИзмененияПравить

Работа с памятьюПравить

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

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

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

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

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

КриптографияПравить

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

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

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

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

  • 2.1.0: Автоматические эфемерные ключи на эллиптических кривых[28]
  • 2.1.2: Поддержка встроенного ГПСЧ arc4random на OS X и FreeBSD[41]
  • 2.1.2: Переработана поддержка шифра ГОСТ
  • 2.1.3: Поддержка ALPN[42]
  • 2.1.3: Поддержка SHA-256 Camellia cipher suites
  • 2.1.4: Поддержка TLS_FALLBACK_SCSV на стороне сервера[43]
  • 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-битные сборки[44]
  • 2.1.6: Библиотека libtls объявлена стабильной и включена по умолчанию[45]
  • 2.2.0: Поддержка AIX и Cygwin[46]
  • 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 некоторые возможности были по умолчанию отключены[29]. Реализация некоторых из этих возможностей была позднее удалена полностью, включая поддержку Kerberos, экспортного набора шифров, TLS сжатия, DTLS heartbeat, и SSL v2.

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

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

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

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

  • В ответ на уязвимость Heartbleed, одной из первых удалённых возможностей была поддержка Heartbeat-пакетов[50]
  • Поддержка ненужных платформ («классическая» 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, который подозревают в наличие бэкдора[51], также подвергся уничтожению. Также были удалены неиспользуемые протоколы и небезопасные алгоритмы, включая поддержку стандарта FIPS 140-2[52], MD4/MD5[40] J-PAKE,[29] и SRP.[25]

Старые ошибкиПравить

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

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

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

LibreSSL OpenSSL LibreSSL OpenSSL
Классификация 1.0.1 1.0.2[54]
Критическая 0 0 0 0
Высокая 0 4 0 2
Средняя 14 25 12 17
Низкая 4 11 3 6
Итого 18 39 15 23

СсылкиПравить

ПримечанияПравить

  1. Cook B. LibreSSL 3.3.3 Released (англ.) — 2021.
  2. Cook B. LibreSSL 3.3.2 Released (англ.) — 2021.
  3. The libressl Open Source Project on Open Hub: Languages Page — 2006.
  4. 1 2 3 4 5 6 7 8 Free Software Directory
  5. LibreSSL: Releases. www.libressl.org. Дата обращения: 3 октября 2019.
  6. Unangst, Ted Origins of libressl. flak (22 April 2014). Дата обращения: 24 апреля 2014.
  7. Seltzer, Larry OpenBSD forks, prunes, fixes OpenSSL. Zero Day. ZDNet (21 April 2014). Дата обращения: 21 апреля 2014.
  8. Brodkin, Jon OpenSSL code beyond repair, claims creator of "LibreSSL" fork. Ars Technica (22 April 2014). Дата обращения: 24 апреля 2014.
  9. McCallion, Jane Heartbleed: LibreSSL scrubs "irresponsible" OpenSSL code (недоступная ссылка). PC Pro (22 April 2014). Дата обращения: 23 апреля 2014. Архивировано 26 июня 2014 года.
  10. Larabel, Michael OpenBSD Affirms That LibreSSL Will Be Portable. Phoronix (9 May 2014). Дата обращения: 30 мая 2014.
  11. 1 2 Beck, Bob LibreSSL: The first 30 days, and what the Future Holds Slides (17 May 2014). Дата обращения: 17 мая 2014.
  12. Re: OpenSSL seven security fixes. Список рассылки (5 June 2014). Дата обращения: 9 июня 2014.
  13. de Raadt, Theo Re: new OpenSSL flaws. Список рассылки (5 June 2014). Дата обращения: 9 июня 2014.
  14. 1 2 Langley, Adam BoringSSL (20 Jun 2014). ImperialViolet (20 June 2014). Дата обращения: 21 июня 2014.
  15. Goodin, Dan Google unveils independent "fork" of OpenSSL called "BoringSSL". Ars Technica (20 June 2014). Дата обращения: 21 июня 2014.
  16. Sing, Joel OpenBSD — lib/libssl/src/crypto/evp evp_aead.c e_chacha20poly1305.c (недоступная ссылка) (21 June 2014). Дата обращения: 21 июня 2014. Архивировано 22 июня 2014 года.
  17. de Raadt, Theo Boringssl and such. Список рассылки (21 June 2014). Дата обращения: 28 октября 2015.
  18. Beck, Bob OpenBSD — lib/libcrypto/crypto getentropy_linux.c (недоступная ссылка) (20 June 2014). Дата обращения: 28 ноября 2015. Архивировано 9 июля 2014 года.
  19. Beck, Bob OpenBSD - lib/libcrypto/crypto getentropy_osx.c getentropy_solaris.c (недоступная ссылка) (8 July 2014). Дата обращения: 28 ноября 2015. Архивировано 22 июля 2014 года.
  20. Index of /pub/OpenBSD/LibreSSL (11 July 2014). Дата обращения: 11 июля 2014.
  21. Beck, Bob First release of LibreSSL portable is available. Список рассылки (11 July 2014). Дата обращения: 11 июля 2014.
  22. Beck, Bob LibreSSL 2.0.1 released. Список рассылки (13 July 2014). Дата обращения: 28 октября 2015.
  23. Beck, Bob LibreSSL portable 2.0.2 released. Список рассылки (16 July 2014). Дата обращения: 28 октября 2015.
  24. Beck, Bob LibreSSL 2.0.3 released. Список рассылки (22 July 2014). Дата обращения: 28 октября 2015.
  25. 1 2 Beck, Bob LibreSSL 2.0.4 released. Список рассылки (3 August 2014). Дата обращения: 28 октября 2015.
  26. Cook, Brent LibreSSL 2.0.5 released. Список рассылки (8 August 2014). Дата обращения: 28 октября 2015.
  27. Unangst, Ted LibreSSL: More Than 30 Days Later (28 сентября 2014). Дата обращения: 9 июня 2014.
  28. 1 2 Beck, Bob LibreSSL 2.1.0 released. Список рассылки (12 October 2014). Дата обращения: 28 октября 2015.
  29. 1 2 3 4 Jacoutot, Antoine OpenBSD 5.6 Released. Список рассылки (1 November 2014). Дата обращения: 28 октября 2015.
  30. LibreSSL enabled by default (недоступная ссылка). Void Linux. Дата обращения: 28 ноября 2015. Архивировано 8 декабря 2015 года.
  31. Mark VonFange. PC-BSD 10.1.2: an Interview with Kris Moore. Official PC-BSD Blog. Дата обращения: 15 октября 2015.
  32. OPNsense version 15.7 Released. OPNsense. Дата обращения: 15 октября 2015.
  33. [Beta OpenELEC 6.0 Beta 2 released] (недоступная ссылка). OpenELEC. Дата обращения: 28 ноября 2015. Архивировано 26 ноября 2015 года.
  34. Apple iOS 9: Security & Privacy Features. Medium. — «OS X 10.11 ships with LibreSSL.». Дата обращения: 24 октября 2015.
  35. Orr, William A quick recap over the last week. OpenSSL Valhalla Rampage (23 April 2014). Дата обращения: 30 апреля 2014.
  36. OpenBSD LibreSSL CVS Calloc Commits.
  37. OpenBSD LibreSSL CVS Double Free Commits.
  38. OpenBSD LibreSSL CVS insecure seeding.
  39. OpenBSD LibreSSL CVS Kernel Seeding (недоступная ссылка). Дата обращения: 28 ноября 2015. Архивировано 16 сентября 2014 года.
  40. 1 2 3 LibreSSL-portable ChangeLog. LibreSSL.
  41. Beck, Bob LibreSSL 2.1.2 released. Список рассылки (9 December 2014). Дата обращения: 28 октября 2015.
  42. 1 2 Cook, Brent LibreSSL 2.1.3 released. Список рассылки (22 January 2015). Дата обращения: 28 октября 2015.
  43. Cook, Brent LibreSSL 2.1.4 released. Список рассылки (4 March 2015). Дата обращения: 28 октября 2015.
  44. Cook, Brent LibreSSL 2.1.5 released. Список рассылки (17 March 2015). Дата обращения: 28 октября 2015.
  45. Cook, Brent LibreSSL 2.1.6 released. Список рассылки (19 March 2015). Дата обращения: 28 октября 2015.
  46. Cook, Brent LibreSSL 2.1.7 and 2.2.0 released. Список рассылки (11 June 2015). Дата обращения: 28 октября 2015.
  47. 1 2 Cook, Brent LibreSSL 2.2.1 released. Список рассылки (9 July 2015). Дата обращения: 28 октября 2015.
  48. 1 2 Cook, Brent LibreSSL 2.2.2 released. Список рассылки (6 August 2015). Дата обращения: 28 октября 2015.
  49. Beck, Bob LibreSSL 2.1.1 released (16 October 2014).
  50. OpenBSD LibreSSL CVS OPENSSL_NO_HEARTBEATS.
  51. Perlroth, Nicole. Government Announces Steps to Restore Confidence on Encryption Standards (10 September 2013). Дата обращения 9 мая 2014.
  52. The future (or lack thereof) of LibreSSL’s FIPS Object Module.
  53. Vallat, Miod Re: CVS: cvs.openbsd.org: src. Список рассылки (10 November 2014). Дата обращения: 28 октября 2015.
  54. Сумма с момента релиза 1.0.2