Разбираем уязвимости проверки сертификатов SSL и TLS

Waterway

Участник

Waterway

Участник
Регистрация
8 Ноя 2018
Сообщения
23
Реакции
41
Репутация
0
Хотели как лучше
В теории, защищенное SSL/TLS-протоколом соединение должно обеспечивать конфиденциальность, достоверность и целостность коммуникаций клиентского и серверного софта, даже если в сеть проник активный продвинутый злоумышленник: когда сеть полностью захвачена врагом, DNS отравлен, а точки доступа и маршрутизаторы, коммутаторы и Wi-Fi контролируются злоумышленником, который, помимо всего прочего, контролирует SSL/TLS-бэкенд. Кроме того, когда клиентский софт пытается подключиться к законному серверу, злоумышленник может подменить сетевой адрес сервера (например, через отравление DNS) и перенаправить клиент вместо законного сервера на свой злонамеренный сервер.
Безопасность коммуникаций в таких суровых условиях, как известно, целиком зависит от адекватности проверки криптографического сертификата, предоставленного сервером при установке соединения. В том числе от адекватности реализации набора шифров (cipher suite), которыми клиент и сервер пользуются при обмене данными. Для того чтобы SSL/TLS-соединение было полностью безопасным, клиентский софт в числе прочего должен тщательно удостовериться в том, что:
  • сертификат выдан действующим органом сертификации;
  • срок его действия не истек (или сертификат не был отозван);
  • в списке перечисленных в сертификате имен присутствует тот домен, к которому производится подключение.
Получилось как всегда: проверка провалена
Однако во многих приложениях и библиотеках, для которых безопасность коммуникаций очень критична, процедура проверки SSL/TLS-сертификата, и даже EV-SSL,

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

, полностью провальна, причем это справедливо для всех популярных операционных систем: Linux, Windows, Android и iOS. Среди уязвимого софта, библиотек и middleware-сервисов можно

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

:
  • Amazon’овская Java-библиотека EC2 и все облачные фронтенд-клиенты, построенные на ее основе;
  • Amazon’овский и PayPal’овский торговый SDK, ответственный за доставку платежных реквизитов от сайтов (на которых развернута инфраструктура онлайн-коммерции) к платежным шлюзам;
  • интегрированные «корзины», такие как osCommerce, ZenCart, Ubercart и PrestaShop, которые не проверяют сертификаты вообще;
  • AdMob-код, используемый мобильным софтом для показа контекстной рекламы;
  • интерфейсные фронтенд-компоненты ElephantDrive и FilesAnywhere, ответственные за взаимодействие с облачным хранилищем;
  • Android’ная библиотека Pusher и весь софт, который использует Pusher API для управления обменом мгновенными сообщениями (например, GitHub’овский Gaug.es);
  • Apache HttpClient (версия 3.x), Apache Libcloud и все клиентские подключения к серверам Apache ActiveMQ и подобным;
  • SOAP middleware-сервисы Java, в том числе Apache Axis, Axis 2, Codehaus XFire; а также весь софт, который на базе этих middleware-сервисов построен;
  • API-инструменты Elastic Load Balancing;
  • Weberknecht-реализация WebSockets’ов;
  • а также весь мобильный софт, построенный на базе перечисленных выше библиотек и middleware-сервисов (чтобы понять, что такое middleware-сервисы, смотри слайды); в том числе iOS-клиент хостинг-провайдера Rackspace.

  • то такое middleware-сервисы
Например,

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

перечислено еще больше сотни уязвимых мобильных приложений. В их числе: Android’s Google Cloud Messaging, Angie’s List Business Center Passwords, AT&T Global Network Client, CapitalOne Spark Pay, Cisco OnPlus (remote access), Cisco Technical Support, Cisco WebEx, Cisco WebEx Passwords, Dominos Pizza, E-Trade, Freelancer, Google Earth, Huntington Mobile (Bank), Intuit Tax Online Accountant, iTunes Connect, Microsoft Skype, Oracle Now, Pinterest, SafeNet (VPN client), SouthWest Airlines, Uber, US Bank — Access Online, Western Union, WordPress, Yahoo! Finance, Yahoo! Mail.


Небольшая выборка из списка уязвимых мобильных приложений

Логические уязвимости SSL/TLS-протокола
SSL/TLS-соединения всего этого и многого другого софта уязвимы для широкого спектра MitM-атак. При этом MitM-атаку можно провести зачастую даже без подделки сертификатов и без похищения приватных ключей, которыми серверы подписывают свои сертификаты. MitM-атаку можно провести, просто эксплуатируя логические уязвимости, которые присутствуют в процедуре проверки SSL/TLS-сертификата на стороне клиентского софта. В результате MitM-злоумышленник может, например, собирать токены авторизации, номера кредитных карт, имена, адреса и прочее — у любого продавца, который использует уязвимые веб-приложения обработки платежей.
Поставщики мобильного софта, которые берут за основу семпл-код AdMob для связи своих приложений с AdMob-аккаунтом, тоже уязвимы — они позволяют атакующему захватывать учетные данные и получать доступ ко всем его Google-сервисам. К примеру, из-за некорректной проверки сертификатов в таких мессенджерах, как Trillian и AIM, MitM-злоумышленник может похитить учетные данные для входа ко всем сервисам Google (включая Gmail), Yahoo и также к сервисам Windows Live (в том числе SkyDrive). Среди других уязвимостей, которыми страдает современный небраузерный веб-софт: использование неправильных регулярных выражений при сравнении имени хоста; игнорирование результатов проверки корректности сертификата; случайное или

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

.

Другие распространенные уязвимости реализации SSL/TLS-протокола
Ну и конечно же, нельзя забывать о том, что даже если в реализации SSL/TLS-протокола нет логических ошибок (если, конечно, кто-то в это еще верит), то защиту можно обойти,

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

, применив 0day-эксплоиты к таким вещам
, как

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

,

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

либо

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

и/или

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

.


Атака на SSL по аппаратным обходным каналам
Кроме того, злоумышленники могут выполнять практически невидимые MitM-атаки, злоупотребляя механизмом кеширования SSL/TLS-сеансов, реализованным в классе SSLSessionCache. Этот механизм проверяет достоверность сертификатов только при первоначальном соединении, и при этом неспособен должным образом аннулировать сеанс связи после удаления сертификатов с устройства. Кроме того, после перезагрузки Android-устройства (через опции «Перезапуск» или «Отключить питание») можно продолжать видеть зашифрованный трафик части приложений, которые после перезагрузки не запускались, но до перезагрузки работали. Так, например, происходит с Google Maps. В

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

описано, как благодаря этим недочетам кеширования злоумышленник может совершенно прозрачно для пользователя устанавливать и удалять «невидимые сертификаты» и затем устанавливать сетевое соединение с любым приложением.


Ретроспектива уязвимого шифрования

Среди других распространенных уязвимостей реализации SSL/TLS-протокола можно отметить уязвимое шифрование (см.

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

), повторное использование GCM (Galois/Counter Mode; счетчик с аутентификацией Галуа) (источник —

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

), хитрость с CNG (CryptoAPI-NG)

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

,

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

,

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

.


Хитрость с CNG: вытягиваем секреты из Schannel
Некорректная проверка цепочки доверия представляет собой ситуацию, когда веб-приложение принимает абсолютно любой сертификат, в котором указано корректное имя хоста, не проверяя при этом, каким центром сертификации он был подписан. Это позволяет перехватывать и дешифровывать пароли и/или номера кредитных карт. А в некоторых случаях даже делать инъекцию вредоносного кода.
В Android-софт данная уязвимость проникает, например, когда создается кастомизированный X509TrustManager-интерфейс, который игнорирует исключения CertificateException. Или когда разработчик софта вставляет в код WebViews-компонента вызов метода SslErrorHandler.proceed().

Корень зла SSL/TLS
Главная причина подавляющего большинства перечисленных уязвимостей — ужасный API-дизайн SSL/TLS-библиотек (в том числе JSSE, OpenSSL и GnuTLS). А заодно и не менее ужасный дизайн библиотек передачи данных (таких как cURL, Apache HttpClient и urllib), каждая из которых представляет собой высокоуровневую обертку для SSL/TLS-библиотек. Не говоря уже о middleware-сервисах (таких как Apache Axis, Axis 2 или Codehaus XFire), еще более высокоуровневых обертках, которые увеличивают «снежный ком» ужасного дизайна.
Вместо того чтобы вести с прикладным разработчиком (зачастую далеким от системного программирования) диалог на понятном ему языке (в терминах конфиденциальности и аутентификации), абстрагируясь от низкоуровневых подробностей реализации SSL/TLS-протокола, эти API вываливают на бедолагу кучу низкоуровневых SSL/TLS-параметров, непонятных ему. Требуют от высокоуровневого софта, чтобы он правильно выставлял низкоуровневые опции, реализовывал функции проверки имени хоста и заботился об интерпретации возвращаемых низкоуровневыми операциями значений.
В результате прикладные разработчики используют SSL/TLS API неправильно: ошибочно интерпретируют многообразие их параметров, опций, побочных эффектов и возвращаемых значений.

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

:
  • Amazon’овская PHP-библиотека Flexible Payments Service пытается включить проверку имени хоста посредством установки параметра CURLOPT_SSL_VERIFYHOST в значение TRUE (в cURL-библиотеке). Однако корректное значение по умолчанию для этого параметра — 2; если же присвоить ему значение TRUE, то этому параметру незаметно для разработчика присваивается значение 1, и таким образом проверка сертификата отключается;
  • PHP-библиотека PayPal Payments Standard приобрела ту же самую ошибку; причем в тот момент, когда предыдущая, уязвимая реализация обновлялась (то есть одну ошибку убрали, другую добавили);
  • другой пример — это Lynx, текстоориентированный браузер. Он проверяет самоподписанные сертификаты, но только в том случае, если GnuTLS’ная функция проверки сертификата возвращает отрицательное значение. Однако эта самая функция для некоторых ошибок возвращает 0; в том числе в тех случаях, когда сертификаты подписаны недоверенным органом. Из-за этого цепочка проверки доверия в Lynx оказывается нарушена.
Кроме того, прикладные разработчики зачастую неправильно понимают, какие именно гарантии безопасности предоставляет та или иная SSL/TLS-библиотека. Поэтому в дикой природе можно встретить клинические случаи, когда в приложениях, принципиально нуждающихся в защищенных коммуникациях (например, взаимодействующих с платежным процессором), используется SSL/TLS-библиотека, которая не проверяет SSL/TLS-сертификаты вообще. Более прозаичные, но еще более убийственные случаи — это когда разработчик какого-нибудь из промежуточных слоев софта молча отключает процедуру проверки SSL/TLS-сертификатов (он может сделать это, например, для тестирования системы, а после тестирования — забыть вновь включить ее). При этом высокоуровневый программный код, использующий этот промежуточный слой, уверен, что проверка сертификатов производится. Таким образом, ошибки SSL/TLS часто бывают скрыты в глубине одного или сразу нескольких промежуточных слоев-библиотек — из-за чего обнаружить данную проблему становится практически невозможно.
Например, в JSSE (Java Secure Socket Extension) расширенный интерфейс SSLSocketFactory API молча пропускает проверку имени хоста, если поле algorithm в SSL-клиенте установлено в NULL или в пустую строку, а не в HTTPS. Хотя данное обстоятельство упоминается в справочном руководстве JSSE, многие Java-реализации SSL-протоколов используют SSLSocketFactory без выполнения проверки имени хоста…

Ложка меда в бочку дегтя
На практике получается, что в основной массе современного небраузерного веб-софта проверка SSL/TLS-сертификатов либо отключена совсем, либо реализована неправильно. На скриншоте представлена классификация актуальных уязвимостей SSL/TLS-протокола. Некоторые из этих уязвимостей (но не все) были описаны и/или упомянуты выше. Ознакомиться с упомянутыми, но не описанными уязвимостями можно, почитав материалы, перечисленные в библиографии.



Классификация актуальных для SSL/TLS уязвимостей
Чтобы добавить ложку меда в бочку дегтя, стоит отметить, что в

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

подробно, понятно, популярно и грамотно описано (со ссылкой на RFC), как SSL должен реализовываться. Лучшего описания, которое было бы технически точным и одновременно понятным, мы не встречали. Также авторы разбирают самые распространенные SSL-библиотеки, с классификацией по уровню абстрагирования (низкоуровневые/высокоуровневые). Все с диаграммами и лаконичными алгоритмами в псевдокоде. Подробно описаны уязвимости конкретных продуктов, с приведением некорректного программного кода и указанием ошибок. Так что если вдруг у кого-то в очередной раз возникнет желание создать такую реализацию SSL/TLS-фреймворка, которая станет исключением из поговорки «хотели как лучше, а получилось как всегда», то

Пожалуйста Авторизуйтесь или Зарегистрируйтесь для просмотра скрытого текста.

— идеальное для этого начало.
 
Сверху