OpenSSL — это программная библиотека для приложений, которые обеспечивают безопасную связь по компьютерным сетям от подслушивания и идентифицируют сторону на другом конце. Она широко используется интернет -серверами , включая большинство веб-сайтов HTTPS .
OpenSSL содержит реализацию протоколов SSL и TLS с открытым исходным кодом . Основная библиотека , написанная на языке программирования C , реализует основные криптографические функции и предоставляет различные служебные функции. Доступны оболочки, позволяющие использовать библиотеку OpenSSL на различных языках программирования.
OpenSSL Software Foundation (OSF) представляет проект OpenSSL в большинстве правовых аспектов, включая лицензионные соглашения участников, управление пожертвованиями и т. д. OpenSSL Software Services (OSS) также представляет проект OpenSSL по контрактам на поддержку.
OpenSSL доступен для большинства Unix-подобных операционных систем (включая Linux , macOS и BSD ), Microsoft Windows и OpenVMS .
Проект OpenSSL был основан в 1998 году для предоставления бесплатного набора инструментов шифрования для кода, используемого в Интернете. Он основан на форке SSLeay Эрика Эндрю Янга и Тима Хадсона, который неофициально завершил разработку 17 декабря 1998 года, когда Янг и Хадсон оба перешли на работу в RSA Security . Первоначальными членами-основателями были Марк Кокс, Ральф Энгельшалл, Стивен Хенсон, Бен Лори и Пол Саттон. [4]
В 2018 году нумерация версий OpenSSL была пропущена с 1.1.1 до 3.0.0, при этом 2 была исключена из основного номера версии, чтобы избежать конфликта с одним из модулей OpenSSL. Версия 3.0.0 была первой, в которой использовалась лицензия Apache .
По состоянию на май 2019 года [обновлять][ 5] комитет управления OpenSSL состоял из семи человек [6] , и семнадцать разработчиков [7] имели доступ к коммиту (многие из которых также являются частью комитета управления OpenSSL). Всего двое штатных сотрудников (научных сотрудников), а остальные — волонтеры.
Бюджет проекта составляет менее 1 миллиона долларов США в год, и он в основном полагается на пожертвования. Разработка TLS 1.3 спонсировалась Akamai . [8]
OpenSSL поддерживает ряд различных криптографических алгоритмов:
( Совершенная прямая секретность поддерживается с использованием эллиптической кривой Диффи-Хеллмана, начиная с версии 1.0. [40] )
FIPS 140 — это федеральная программа США по тестированию и сертификации криптографических модулей. Ранний сертификат FIPS 140-1 для OpenSSL FOM 1.0 был отозван в июле 2006 года, «когда возникли вопросы о взаимодействии проверенного модуля с внешним программным обеспечением». Модуль был повторно сертифицирован в феврале 2007 года, прежде чем уступить место FIPS 140-2. [41] OpenSSL 1.0.2 поддерживал использование модуля объектов OpenSSL FIPS (FOM), который был создан для предоставления одобренных FIPS алгоритмов в проверенной среде FIPS 140-2. [42] [43] OpenSSL спорно решила классифицировать архитектуру 1.0.2 как «конец жизненного цикла» или «EOL», вступившую в силу 31 декабря 2019 года, несмотря на возражения, что это была единственная версия OpenSSL, которая в настоящее время была доступна с поддержкой режима FIPS. [44] В результате окончания срока действия лицензии многие пользователи не смогли должным образом развернуть FOM 2.0 и перестали соответствовать требованиям, поскольку не обеспечили расширенную поддержку архитектуры 1.0.2, хотя сама FOM оставалась проверенной еще восемь месяцев.
FIPS Object Module 2.0 оставался проверенным на соответствие FIPS 140-2 в нескольких форматах до 1 сентября 2020 года, когда NIST объявил устаревшим использование FIPS 186-2 для стандарта цифровой подписи и обозначил все несоответствующие модули как «исторические». Это обозначение включает предупреждение федеральным агентствам о том, что они не должны включать модуль в какие-либо новые закупки. Все три проверки OpenSSL были включены в устаревание — OpenSSL FIPS Object Module (сертификат № 1747), [45] OpenSSL FIPS Object Module SE (сертификат № 2398), [46] и OpenSSL FIPS Object Module RE (сертификат № 2473). [47] Многие «частные» проверки на основе OpenSSL и клоны, созданные консультантами, также были перемещены в исторический список, хотя некоторые проверенные FIPS модули с заменой совместимости избежали устаревания, такие как BoringCrypto от Google [48] и CryptoComply от SafeLogic. [49]
Управляющий комитет OpenSSL объявил об изменении схемы управления версиями.
Из-за этого изменения основной номер следующей основной версии удвоился бы, поскольку модуль OpenSSL FIPS уже занимал этот номер. Поэтому было принято решение пропустить номер версии OpenSSL 2.0 и продолжить с OpenSSL 3.0.
OpenSSL 3.0 восстановил режим FIPS и прошел тестирование FIPS 140-2, но со значительными задержками: работа была впервые начата в 2016 году при поддержке SafeLogic [50] [51] [52] и дальнейшей поддержке Oracle в 2017 году, [53] [54], но процесс оказался сложным. [55]
20 октября 2020 года OpenSSL FIPS Provider 3.0 был добавлен в список тестируемых реализаций CMVP, что отражало официальное взаимодействие с испытательной лабораторией для продолжения проверки FIPS 140-2. Это привело к множеству сертификаций в последующие месяцы. [56]
OpenSSL был лицензирован по двойной лицензии OpenSSL License и SSLeay License, что означает, что могут использоваться условия любой из лицензий. [57] OpenSSL License — это Apache License 1.0, а SSLeay License имеет некоторое сходство с 4-пунктной BSD License . Поскольку OpenSSL License была Apache License 1.0, но не Apache License 2.0, она требует, чтобы фраза «этот продукт включает программное обеспечение, разработанное OpenSSL Project для использования в OpenSSL Toolkit» появлялась в рекламных материалах и любых перераспределениях (разделы 3 и 6 OpenSSL License). Из-за этого ограничения OpenSSL License и Apache License 1.0 несовместимы с GNU GPL . [58] Некоторые разработчики GPL добавили исключение OpenSSL в свои лицензии, которое специально разрешает использование OpenSSL с их системой. GNU Wget и climm используют такие исключения. [59] [60] Некоторые пакеты (например, Deluge ) явно изменяют лицензию GPL, добавляя дополнительный раздел в начало лицензии, документирующий исключение. [61] Другие пакеты используют GnuTLS под лицензией LGPL , Botan под лицензией BSD или NSS под лицензией MPL , которые выполняют ту же задачу.
В августе 2015 года OpenSSL объявила, что от большинства участников потребуется подписать Лицензионное соглашение участника (CLA), и что OpenSSL в конечном итоге будет перелицензирован в соответствии с условиями Apache License 2.0 . [62] Этот процесс начался в марте 2017 года [63] и был завершен в 2018 году [64].
7 сентября 2021 года OpenSSL 3.0.0 был выпущен под лицензией Apache License 2.0. [65]
OpenSSL 0.9.6k имеет ошибку, при которой определенные последовательности ASN.1 запускали большое количество рекурсий на машинах Windows, обнаруженную 4 ноября 2003 года. Windows не могла правильно обрабатывать большие рекурсии, поэтому OpenSSL в результате аварийно завершал работу. Возможность отправки произвольно большого количества последовательностей ASN.1 в результате аварийно завершала работу OpenSSL.
При создании рукопожатия клиент мог отправить неправильно отформатированное сообщение ClientHello, что приводило к тому, что OpenSSL анализировал не только конец сообщения. Проект CVE присвоил идентификатор CVE - 2011-0014, это затрагивало все версии OpenSSL от 0.9.8h до 0.9.8q и OpenSSL от 1.0.0 до 1.0.0c. Поскольку анализ мог привести к чтению по неверному адресу памяти, злоумышленник мог вызвать DoS . Также было возможно, что некоторые приложения раскрывают содержимое проанализированных расширений OCSP , что приводило к тому, что злоумышленник мог прочитать содержимое памяти, которая шла после ClientHello. [66]
При использовании базовых функций ввода/вывода (BIO) [67] или функций на основе FILE для чтения ненадежных данных формата DER , OpenSSL уязвим. Эта уязвимость была обнаружена 19 апреля 2012 года и ей был присвоен идентификатор CVE CVE - 2012-2110. Хотя она не затрагивала напрямую код SSL/TLS OpenSSL, любое приложение, использующее функции ASN.1 (в частности, d2i_X509 и d2i_PKCS12), также не было затронуто. [68]
При обработке наборов шифров CBC в SSL, TLS и DTLS OpenSSL был обнаружен уязвимым к атаке по времени во время обработки MAC. Надхем Альфардан и Кенни Патерсон обнаружили проблему и опубликовали свои выводы [69] 5 февраля 2013 года. Уязвимости был присвоен идентификатор CVE CVE - 2013-0169.
Генератор псевдослучайных чисел OpenSSL приобретает энтропию, используя сложные методы программирования. Чтобы инструмент анализа Valgrind не выдавал связанных предупреждений, сопровождающий дистрибутива Debian применил патч к варианту пакета OpenSSL от Debian, который непреднамеренно сломал его генератор случайных чисел, ограничив общее количество секретных ключей, которые он мог сгенерировать, до 32 768. [70] [71] Сломанная версия была включена в выпуск Debian от 17 сентября 2006 года (версия 0.9.8c-1), также скомпрометировав другие дистрибутивы на основе Debian, например Ubuntu . Готовые к использованию эксплойты легко доступны. [72]
Ошибка была сообщена Debian 13 мая 2008 года. В дистрибутиве Debian 4.0 (etch) эти проблемы были исправлены в версии 0.9.8c-4etch3, тогда как исправления для дистрибутива Debian 5.0 (lenny) были предоставлены в версии 0.9.8g-9. [73]
OpenSSL версий 1.0.1 по 1.0.1f имеют серьезную ошибку обработки памяти в их реализации расширения TLS Heartbeat, которая может быть использована для раскрытия до 64 КБ памяти приложения с каждым тактовым импульсом [74] [75] ( CVE - 2014-0160). Читая память веб-сервера, злоумышленники могут получить доступ к конфиденциальным данным, включая закрытый ключ сервера . [76] Это может позволить злоумышленникам расшифровать ранее подслушанные сообщения, если используемый протокол шифрования не обеспечивает идеальную прямую секретность . Знание закрытого ключа также может позволить злоумышленнику организовать атаку «человек посередине» против любых будущих сообщений. [ необходима цитата ] Уязвимость также может раскрыть незашифрованные части конфиденциальных запросов и ответов других пользователей, включая сеансовые куки и пароли, что может позволить злоумышленникам перехватить личность другого пользователя сервиса. [77]
На момент раскрытия информации 7 апреля 2014 года считалось, что около 17% или полмиллиона защищенных веб-серверов Интернета , сертифицированных доверенными органами, были уязвимы для атаки. [78] Однако Heartbleed может поражать как сервер, так и клиента.
Уязвимость внедрения CCS ( CVE - 2014-0224) - это уязвимость обхода безопасности, которая возникает из-за слабости методов OpenSSL, используемых для создания ключей. [79]
Эта уязвимость может быть использована посредством атаки типа «человек посередине» [80] , в ходе которой злоумышленник может расшифровать и изменить трафик в пути. Удаленный неаутентифицированный злоумышленник может использовать эту уязвимость, используя специально созданное рукопожатие, чтобы заставить использовать слабый ключевой материал. Успешная эксплуатация может привести к состоянию обхода безопасности, в котором злоумышленник может получить доступ к потенциально конфиденциальной информации. Атака может быть выполнена только между уязвимым клиентом и сервером.
Клиенты OpenSSL уязвимы во всех версиях OpenSSL до версий 0.9.8za, 1.0.0m и 1.0.1h. Известно, что серверы уязвимы только в OpenSSL 1.0.1 и 1.0.2-beta1. Пользователям серверов OpenSSL более ранних версий, чем 1.0.1, рекомендуется обновиться в качестве меры предосторожности. [81]
Эта уязвимость ( CVE - 2015-0291) позволяет любому человеку взять сертификат, прочитать его содержимое и точно изменить его, чтобы злоупотребить уязвимостью, заставляя сертификат вызывать сбой клиента или сервера. Если клиент подключается к серверу OpenSSL 1.0.2 и повторно согласовывает с недействительным расширением алгоритмов подписи, происходит разыменование нулевого указателя. Это может вызвать DoS-атаку на сервер.
Исследователь по безопасности из Стэнфорда Дэвид Рамос разработал личный эксплойт и представил его команде OpenSSL, которая затем исправила проблему.
OpenSSL классифицировал ошибку как проблему высокой степени серьезности, отметив, что версия 1.0.2 была признана уязвимой. [82]
Эта уязвимость ( CVE - 2016-0701) позволяет, при определенных обстоятельствах, восстановить закрытый ключ Диффи–Хеллмана сервера OpenSSL. Исследователь Adobe System Security Антонио Сансо в частном порядке сообщил об уязвимости.
OpenSSL классифицировал ошибку как проблему высокой степени серьезности, отметив, что уязвимой оказалась только версия 1.0.2. [83]
В 2009 году, после разочарования в оригинальном API OpenSSL, Марко Пирбум, в то время разработчик OpenBSD, разветвил оригинальный API, создав Agglomerated SSL (assl), который повторно использует API OpenSSL под капотом, но предоставляет гораздо более простой внешний интерфейс. [84] С тех пор он был объявлен устаревшим в свете форка LibreSSL около 2016 года.
В апреле 2014 года вслед за Heartbleed участники проекта OpenBSD разветвили OpenSSL, начав с ветки 1.0.1g, чтобы создать проект под названием LibreSSL . [85] За первую неделю сокращения кодовой базы OpenSSL из разветвления было удалено более 90 000 строк кода на языке C. [86]
В июне 2014 года Google анонсировала собственный форк OpenSSL под названием BoringSSL. [87] Google планирует сотрудничать с разработчиками OpenSSL и LibreSSL. [88] [89] [90] С тех пор Google разработала новую библиотеку Tink, основанную на BoringSSL. [91]
Среди сообществ разработчиков OpenSSL часто упоминается за то, что он нарушает совместимость API с каждой новой основной версией, [92] [93] [94] [95] , что требует адаптации программного обеспечения, что, как правило, задерживает принятие новых версий. [96] Это, в сочетании с тем фактом, что предыдущие выпуски, как правило, поддерживаются не более двух лет после выпуска новой основной версии [27], заставляет некоторых поставщиков предвидеть миграцию программного обеспечения очень рано, имея при этом мало времени [97] для обновления до новой версии, иногда с риском потери некоторой совместимости с существующим программным обеспечением [98] [99] или риском регрессии. [100] [101]
Хотя выпуски с долгосрочной поддержкой (LTS) поддерживаются в течение 5 лет [11], накопленные задержки в сроках выпуска, как правило, заставляют поставщиков операционных систем дольше оставаться на последнем поддерживаемом выпуске, оставляя меньше запаса, когда новая версия становится доступной. Например, OpenSSL 3.0 изначально ожидался в четвертом квартале 2019 года [44] и был окончательно выпущен 21 месяц спустя [27] без продления ожидаемого окончания поддержки ранее поддерживаемой версии 1.1.1, и это несмотря на значительные изменения, которые потребовали адаптации к существующему программному обеспечению.
Упомянутая выше задержка поддержки версии 1.1.1 вызывает дополнительные опасения у пользователей, чьи рабочие нагрузки чувствительны к производительности. Через некоторое время после общедоступности 3.0 некоторые пользователи начали сообщать о серьезных регрессиях производительности, влияющих на эту версию в многопоточных средах, многие ссылались на неэффективное использование блокировок в частых низкоуровневых операциях, ссылаясь на замедления от 80 до 400 раз. [102] [103] [104] [105] [106] [107] [108] [109] Команда OpenSSL создала мета-проблему, чтобы попытаться централизовать отчеты о таких масштабных регрессиях производительности. [110] Около половины этих репортеров указывают на невозможность для них обновиться до 3.0 с более ранних версий, что усугубляет проблемы, вызванные ограниченным временем поддержки, оставшимся для предыдущей версии 1.1.1.
Пока транспортный уровень QUIC работал над поддержкой третьей версии протокола HTTP , было предложено использовать TLS для обеспечения безопасности [111] и было определено, что потребуются некоторые адаптации библиотек TLS. Такие изменения были внесены в BoringSSL [112], которая к тому времени в основном использовалась разработчиками QUIC, а затем перенесена в другие библиотеки. [113] Перенос этой работы был быстро предложен в OpenSSL. [114] Хотя некоторое обсуждение началось в тот же день, оно быстро заглохло и сначала было заблокировано по соображениям лицензии [114] , а затем приостановлено после того, как эти опасения были устранены. Наконец, 10 месяцев спустя Комитет по управлению OpenSSL объявил в сообщении в блоге [115] , что этот набор исправлений не будет принят для 3.0 из-за опасений, что API со временем изменится. Наконец, более чем через год после запланированного выпуска 3.0, который все еще не состоялся, команда добровольцев из Akamai и Microsoft решила разветвить проект как QuicTLS [116] и поддерживать эти патчи поверх кода OpenSSL, чтобы разблокировать разработку QUIC. Это действие в целом приветствовалось сообществом. Наконец, после того, как OpenSSL 3.0 был окончательно выпущен, набор патчей QUIC был пересмотрен и отклонен, [117] вызвав десятки или сотни реакций разочарования в сообществе. [114] Запрос на включение был закрыт, в то время как пользователи чувствовали необходимость публично выразить свое разочарование [118] или попросить поставщиков операционных систем поддержать альтернативный форк QuicTLS [119] [120] или искать альтернативные решения. [121] Наконец, Рич Сальц, соучредитель форка QuicTLS, объявил [121] о своей заинтересованности в том, чтобы проект Apache был ответвлен от QuicTLS. По состоянию на 25 февраля 2023 года в операционных системах по-прежнему не существует совместимой с QUIC библиотеки TLS с долгосрочной поддержкой, доступной по умолчанию без необходимости для конечных пользователей самостоятельно пересобирать ее из исходных кодов.
Проект OpenSSL объявил о завершении перехода с лицензии OpenSSL/SSLeay на Apache Software License версии 2 (ASLv2).