Введение
OpenSSL - это библиотека программного обеспечения для приложений, которые обеспечивают безопасную связь через компьютерные сети против прослушивания и идентифицируют сторону на другом конце. Он широко используется интернет-серверами, включая большинство веб-сайтов HTTPS. OpenSSL содержит реализацию протоколов SSL и TLS с открытым исходным кодом. Основная библиотека, написанная на языке программирования C, реализует основные криптографические функции и обеспечивает различные полезные функции. Существуют обертки, позволяющие использовать библиотеку OpenSSL на различных компьютерных языках. Фонд программного обеспечения OpenSSL (OSF) представляет проект OpenSSL в большинстве юридических возможностей, включая лицензионные соглашения с участниками, управление пожертвованиями и так далее. OpenSSL Software Services (OSS) также представляет проект OpenSSL для контрактов на поддержку. OpenSSL доступен для большинства Unix-подобных операционных систем (включая Linux, macOS и BSD), Microsoft Windows и OpenVMS.
OpenSSL is a software library for applications that provide secure communications over computer networks against eavesdropping, and identify the party at the other end. It is widely used by Internet servers, including the majority of HTTPS websites. OpenSSL contains an open source implementation of the SSL and TLS protocols. The core library, written in the C programming language, implements basic cryptographic functions and provides various utility functions. Wrappers allowing the use of the OpenSSL library in a variety of computer languages are available. The OpenSSL Software Foundation (OSF) represents the OpenSSL project in most legal capacities including contributor license agreements, managing donations, and so on. OpenSSL Software Services (OSS) also represents the OpenSSL project for support contracts. OpenSSL is available for most Unix like operating systems (including Linux, macOS, and BSD), Microsoft Windows and OpenVMS.
История проекта
Проект OpenSSL был основан в 1998 году для предоставления бесплатного набора инструментов шифрования для кода, используемого в Интернете. Он основан на ответвлении SSLeay, созданном Эриком Эндрю Янгом и Тимом Хадсоном, разработка которого неофициально прекратилась 17 декабря 1998 года, когда Янг и Хадсон оба перешли на работу в RSA Security. Первоначальными основателями были Марк Кокс, Ральф Энгельсхалл, Стивен Хенсон, Бен Лори и Пол Саттон. В 2018 году нумерация версий OpenSSL перескочила с 1.1.1 на 3.0.0, пропустив номер версии 2, чтобы избежать конфликта с одним из модулей OpenSSL. Версия 3.0.0 стала первой, использующей лицензию Apache. По состоянию на 2019 год управляющий комитет OpenSSL состоял из семи человек, а также семнадцать разработчиков, имеющих право вносить изменения (многие из которых также входят в управляющий комитет OpenSSL). В штате проекта всего два сотрудника (исследователя), остальные работают на добровольных началах. Бюджет проекта составляет менее 1 миллиона долларов США в год и в основном формируется за счет пожертвований. Разработка TLS 1.3 была профинансирована компанией Akamai.
Валидация по FIPS 140
FIPS 140 – это федеральная программа США для тестирования и сертификации криптографических модулей. Ранний сертификат FIPS 140-1 для FOM 1.0 OpenSSL был отозван в июле 2006 года «в связи с возникновением вопросов о взаимодействии проверенного модуля с внешним программным обеспечением». Модуль был пересертифицирован в феврале 2007 года, после чего ему на смену пришел FIPS 140-2. OpenSSL 1.0.2 поддерживал использование OpenSSL FIPS Object Module (FOM), разработанного для предоставления алгоритмов, одобренных FIPS, в среде, прошедшей валидацию FIPS 140-2. OpenSSL вызвал споры, решив классифицировать архитектуру 1.0.2 как «снятую с поддержки» или «EOL» с 31 декабря 2019 года, несмотря на возражения, что это была единственная версия OpenSSL, доступная на тот момент с поддержкой режима FIPS. В результате прекращения поддержки многие пользователи не смогли корректно развернуть 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), OpenSSL FIPS Object Module SE (сертификат №2398) и OpenSSL FIPS Object Module RE (сертификат №2473). Многие «частные» валидации и клоны на основе OpenSSL, созданные консультантами, также были перемещены в список устаревших, хотя некоторые валидированные FIPS модули с совместимостью замены избежали отмены, такие как BoringCrypto от Google и CryptoComply от SafeLogic. Управляющий комитет OpenSSL объявил об изменении схемы версионирования. В связи с этим изменение основная цифра следующей основной версии была удвоена, поскольку модуль OpenSSL FIPS уже использовал эту цифру. Поэтому было принято решение пропустить версию OpenSSL 2.0 и перейти к OpenSSL 3.0. OpenSSL 3.0 восстановил режим FIPS и прошел тестирование FIPS 140-2, но с существенными задержками: работа началась в 2016 году при поддержке SafeLogic и дальнейшей поддержке Oracle в 2017 году, но процесс оказался сложным. 20 октября 2020 года OpenSSL FIPS Provider 3.0 был добавлен в список CMVP Implementation Under Test, что отражает официальное взаимодействие с испытательной лабораторией для проведения валидации FIPS 140-2. Это привело к получению множества сертификатов в последующие месяцы.
OpenSSL 3.0 restored FIPS mode and underwent FIPS 140 2 testing, but with significant delays: The effort was first kicked off in 2016 with support from SafeLogic and further support from Oracle in 2017, but the process has been challenging. On October 20, 2020, the OpenSSL FIPS Provider 3.0 was added to the CMVP Implementation Under Test List, which reflected an official engagement with a testing lab to proceed with a FIPS 140 2 validation. This resulted in a slew of certifications in the following months.
Лицензирование
OpenSSL распространялась по двойной лицензии – OpenSSL License и SSLeay License, что означает, что можно использовать условия любой из этих лицензий. OpenSSL License соответствует Apache License 1.0, а SSLeay License имеет некоторое сходство с 4-пунктной BSD License. Поскольку OpenSSL License была Apache License 1.0, а не Apache License 2.0, она требует, чтобы фраза «this product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit» (этот продукт включает программное обеспечение, разработанное проектом OpenSSL для использования в OpenSSL Toolkit) присутствовала в рекламных материалах и при любом распространении (пункты 3 и 6 лицензии OpenSSL). Из-за этого ограничения OpenSSL License и Apache License 1.0 несовместимы с GNU GPL. Некоторые разработчики GPL добавили исключение OpenSSL к своим лицензиям, которое специально разрешает использование OpenSSL в их системе. GNU Wget и climm используют такие исключения. Некоторые пакеты (например, Deluge) явно изменяют лицензию GPL, добавляя дополнительный раздел в начало лицензии, в котором документируется это исключение. Другие пакеты используют GnuTLS с лицензией LGPL, Botan с лицензией BSD или NSS с лицензией MPL, которые выполняют ту же функцию. В августе 2015 года OpenSSL объявила, что потребует от большинства контрибьюторов подписать Соглашение о лицензии контрибьютора (CLA), и что OpenSSL в конечном итоге будет перелицензирована на условиях Apache License 2.0. Этот процесс начался в марте 2017 года и был завершен в 2018 году. 7 сентября 2021 года OpenSSL 3.0.0 была выпущена под лицензией Apache License 2.0.
Отказ в обслуживании: ASN.1
В OpenSSL 0.9.6k обнаружена ошибка, при которой определенные последовательности ASN.1 вызывали чрезмерное количество рекурсий на машинах под управлением Windows, что было выявлено 4 ноября 2003 года. Операционная система Windows некорректно обрабатывала большое количество рекурсий, что приводило к аварийному завершению работы OpenSSL. Отправка произвольного количества последовательностей ASN.1 могла спровоцировать сбой OpenSSL.
Ошибка в сцеплении OCSP
При установлении соединения клиент мог отправить некорректно сформированное сообщение ClientHello, что приводило к тому, что OpenSSL анализировал данные за пределами конца сообщения. Уязвимость, получившая идентификатор от проекта CVE, затрагивала все версии OpenSSL от 0.9.8h до 0.9.8q и OpenSSL 1.0.0 до 1.0.0c. Поскольку анализ мог привести к чтению по неверному адресу памяти, злоумышленник мог вызвать отказ в обслуживании (DoS). Кроме того, существовала возможность, что некоторые приложения раскрывали содержимое расширений OCSP, позволяя злоумышленнику читать данные из памяти, расположенной после сообщения ClientHello.
Уязвимость ASN.1 BIO
При использовании функций Basic Input/Output (BIO) или FILE для чтения недоверенных данных в формате DER, OpenSSL подвержен уязвимости. Эта уязвимость была обнаружена 19 апреля 2012 года и получила идентификатор CVE. Несмотря на то, что она напрямую не затрагивает код SSL/TLS в OpenSSL, приложения, использующие функции ASN.1 (в частности, d2i_X509 и d2i_PKCS12), также не подвержены воздействию.
Атака на восстановление ясного текста SSL, TLS и DTLS
При работе с CBC-шифрами в SSL, TLS и DTLS в OpenSSL была обнаружена уязвимость к атаке по времени при обработке MAC. Проблему обнаружили Надхем Альфардан и Кенни Патерсон, опубликовавшие свои результаты 5 февраля 2013 года. Уязвимости был присвоен идентификатор CVE.
Предсказуемые частные ключи (специфичные для Debian)
Псевдогенератор случайных чисел OpenSSL получает энтропию, используя сложные методы программирования. Чтобы предотвратить выдачу связанных с этим предупреждений инструментом анализа Valgrind, сопровождающий дистрибутива Debian применил патч к варианту OpenSSL, используемому в Debian, что непреднамеренно нарушило работу генератора случайных чисел, ограничив общее количество генерируемых им приватных ключей до 32 768. Поврежденная версия была включена в релиз Debian от 17 сентября 2006 года (версия 0.9.8c 1), что также затронуло другие дистрибутивы, основанные на Debian, например Ubuntu. Эксплойты, готовые к использованию, легко доступны. Об ошибке было сообщено Debian 13 мая 2008 года. В дистрибутиве Debian 4.0 (etch) эти проблемы были устранены в версии 0.9.8c 4etch3, а для дистрибутива Debian 5.0 (lenny) исправления были предоставлены в версии 0.9.8g 9.
Сердечно-сосудистые
OpenSSL версий 1.0.1–1.0.1f содержит серьезную ошибку обработки памяти в реализации расширения TLS Heartbeat, которая может быть использована для раскрытия до 64 КБ памяти приложения при каждом сердцебиении. Считывая память веб-сервера, злоумышленники могут получить доступ к конфиденциальным данным, включая закрытый ключ сервера. Это может позволить злоумышленникам расшифровать ранее перехваченные сообщения, если используемый протокол шифрования не обеспечивает прямой секретности (perfect forward secrecy). Обладание закрытым ключом также может позволить злоумышленнику осуществить атаку типа «человек посередине» на любые последующие соединения. Уязвимость также может раскрыть незашифрованные части конфиденциальных запросов и ответов других пользователей, включая файлы cookie сеансов и пароли, что может позволить злоумышленникам похитить учетные данные другого пользователя сервиса. На момент раскрытия информации 7 апреля 2014 года, по оценкам, около 17%, или полмиллиона защищенных веб-серверов в Интернете, сертифицированных доверенными центрами сертификации, были уязвимы для этой атаки. Однако Heartbleed может повлиять как на сервер, так и на клиент.
Уязвимость впрыска CCS
Уязвимость CCS Injection – это уязвимость обхода защиты, возникающая из-за недостатка в методах OpenSSL, используемых для управления ключами. Эта уязвимость может быть использована посредством атаки типа "человек посередине", в результате которой злоумышленник может расшифровать и изменить передаваемые данные. Удалённый, не прошедший аутентификацию злоумышленник может воспользоваться этой уязвимостью, используя специально сформированное рукопожатие для принудительного использования слабых ключей. Успешная эксплуатация может привести к обходу защиты, позволяющему злоумышленнику получить доступ к потенциально конфиденциальной информации. Атака может быть осуществлена только между уязвимым клиентом и сервером. Клиенты OpenSSL уязвимы во всех версиях OpenSSL, выпущенных до версий 0.9.8za, 1.0.0m и 1.0.1h. Серверы, как известно, уязвимы только в OpenSSL 1.0.1 и 1.0.2 beta1. Пользователям серверов OpenSSL, выпущенных ранее версии 1.0.1, рекомендуется обновиться в качестве меры предосторожности.
Клиент Здравствуйте , сигальги DoS
Эта уязвимость позволяет любому получить сертификат, прочитать его содержимое и точно изменить его для эксплуатации уязвимости, что может привести к сбою клиента или сервера при использовании этого сертификата. Если клиент подключается к серверу OpenSSL 1.0.2 и выполняет повторное согласование с использованием недопустимого расширения алгоритмов подписи, происходит разыменование нулевого указателя. Это может вызвать DoS-атаку на сервер. Исследователь безопасности из Стэнфорда, Дэвид Рамос, обнаружил эксплойт и предоставил его команде OpenSSL, которая затем устранила проблему. OpenSSL классифицировала эту ошибку как критическую, отметив, что уязвимой оказалась версия 1.0.2.
Ключевая атака на небольшие подгруппы Diffie-Hellman
Эта уязвимость позволяет, при определенных условиях, восстановить закрытый ключ Diffie–Hellman сервера OpenSSL. Исследователь Adobe System Security, Антонио Сансо, сообщил об этой уязвимости в частном порядке. OpenSSL классифицировал эту ошибку как проблему высокой критичности, отметив, что уязвимой оказалась только версия 1.0.2.
Агломерированный SSL
В 2009 году, столкнувшись с неудобствами оригинального API OpenSSL, Марко Пиребум, в то время разработчик OpenBSD, создал форк оригинального API под названием Agglomerated SSL (assl), который использует API OpenSSL внутри, но предоставляет значительно более простой внешний интерфейс. Впоследствии он был упразднён в связи с появлением форка LibreSSL примерно в 2016 году.
LibreSSL (всего лишь один)
В апреле 2014 года, после обнаружения уязвимости Heartbleed, участники проекта OpenBSD сделали форк OpenSSL, начиная с ветки 1.0.1g, чтобы создать проект LibreSSL. За первую неделю очистки кодовой базы OpenSSL из форка было удалено более 90 000 строк кода на языке C.
Скучный SSL
В июне 2014 года Google объявил о создании собственного форка OpenSSL под названием BoringSSL. Google планирует сотрудничать с разработчиками OpenSSL и LibreSSL. С тех пор Google разработал новую библиотеку Tink, основанную на BoringSSL.
Обратная совместимость
Среди сообществ разработчиков OpenSSL часто упоминается из-за нарушения обратной совместимости API в каждой новой основной версии, что требует адаптации программного обеспечения и, как следствие, задерживает переход на новые версии. Это, в сочетании с тем, что поддержка предыдущих версий обычно прекращается через два года после выхода новой основной версии, часто вынуждает некоторых поставщиков заранее планировать миграцию программного обеспечения, при этом у них остается мало времени на обновление до нового релиза, что иногда влечет за собой риск потери совместимости с существующим программным обеспечением или возникновения регрессий.
Задержка между выпусками
В то время как выпуски с длительной поддержкой (LTS) поддерживаются в течение 5 лет, накопленные задержки в сроках выпуска часто вынуждают поставщиков операционных систем оставаться на последнем поддерживаемом релизе дольше, что уменьшает запас времени к моменту выхода новой версии. Например, OpenSSL 3.0 изначально ожидался в четвертом квартале 2019 года, но был выпущен только через 21 месяц. Команда OpenSSL создала обобщённую задачу для централизации сообщений о подобных серьёзных регрессиях производительности. Примерно половина сообщивших о проблеме указывают на невозможность обновления до версии 3.0 с более ранних версий, что усугубляет ситуацию, связанную с ограниченным сроком поддержки предыдущей версии 1.1.1.
Учет требований пользователей
В то время как над транспортным слоем QUIC велась работа по поддержке третьей версии протокола HTTP, было предложено использовать TLS для обеспечения безопасности, и было установлено, что потребуются некоторые адаптации библиотек TLS. Эти изменения были внесены в BoringSSL, библиотеку, которую в то время в основном использовали разработчики QUIC, а затем перенесены в другие библиотеки. Порт этих изменений был оперативно предложен для OpenSSL. Хотя обсуждение началось в тот же день, оно быстро зашло в тупик и первоначально было заблокировано из-за лицензионных ограничений, а также опасений, что этот набор патчей не будет принят для версии 3.0 из-за возможного изменения API со временем. В конечном итоге, более чем через год после запланированного выпуска 3.0, который все еще не состоялся, команда добровольцев из Akamai и Microsoft решила создать форк проекта под названием QuicTLS и поддерживать эти патчи на базе кода OpenSSL, чтобы разблокировать разработку QUIC. Это решение было в целом положительно воспринято сообществом. После того, как OpenSSL 3.0 наконец был выпущен, набор патчей QUIC был повторно рассмотрен, но от него отказались, что вызвало от десятков до сотен выражений разочарования в сообществе. В результате разработчикам пришлось либо просить поставщиков операционных систем поддержать альтернативный форк QuicTLS, либо искать альтернативные решения. В конечном итоге Рич Салц, соучредитель форка QuicTLS, заявил о своем интересе к созданию проекта Apache, ответвленного от QuicTLS. По состоянию на 25 февраля 2023 года в операционных системах по умолчанию по-прежнему отсутствует долгосрочно поддерживаемая TLS-библиотека, совместимая с QUIC, требующая от конечных пользователей самостоятельной сборки из исходного кода.