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