Heartbleed

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Логотип ошибки Heartbleed

Heartbleed (CVE-2014-0160) — ошибка чтения за пределами буфера (англ. buffer over-read) в OpenSSL, позволяющая несанкционированно читать память на сервере или на клиенте, в том числе для извлечения закрытого ключа сервера. Информация об уязвимости была опубликована в апреле 2014 года, ошибка существовала с конца 2011 года.

На момент объявления об ошибке количество уязвимых веб-сайтов оценивалось в полмиллиона, а это составляло около 17 % защищённых веб-сайтов Интернета[1].

История[править | править код]

Расширение Heartbeat для протоколов TLS и DTLS, обеспечивающее поддержку соединения активными без необходимости постоянного переподключения с полной авторизацией, было предложено RFC 6520 в качестве стандарта в феврале 2012 года. В 2011 году один из авторов RFC Робин Сеггельман реализовал Heartbeat-расширение для OpenSSL и выслал сопровождающим проекта. Код был проверен Стивеном Хэнсоном, одним из четырёх основных разработчиков OpenSSL. Хэнсон не заметил проблем в реализации и добавил уязвимый код в репозиторий OpenSSL 31 декабря 2011 года. Уязвимость распространилась с OpenSSL 1.0.1 14 декабря 2012 года. Поддержка Heartbeat была включена по умолчанию, что и повлияло на распространение уязвимости.

Обнаружение[править | править код]

Официально о существовании ошибки Heartbleed сообщили 1 апреля 2014 года. Название «Heartbleed» было предложено инженером финской компании Codenomicon[en], занимающейся информационной безопасностью. Они же придумали логотип в виде кровоточащего сердца и создали сайт heartbleed.com, чтобы рассказать об уязвимости сообществу. Согласно Codenomicon, команда безопасности Google сообщила о Heartbleed в OpenSSL первой, но обе компании обнаружили уязвимость независимо друг от друга. Codenomicon объявила 3 апреля 2014 года датой обнаружения ошибки и датой сообщения об этом Национальному центру компьютерной безопасности Финляндии для отслеживания уязвимости. The Sydney Morning Herald опубликовали 15 апреля 2014 года временную диаграмму открытия уязвимости, показывающую, что некоторые организации смогли устранить уязвимость до её публичного объявления.

Устранение уязвимости[править | править код]

Бодо Меллер и Адам Лэнгли из Google разработали патч, устраняющий Heartbleed. Стивен Хэнсон применил этот патч к OpenSSL 7 апреля 2014. Первая исправленная версия 1.0.1g была представлена в этот же день. По состоянию на 21 июня 2014, свыше 300 тыс. серверов остались уязвимыми[источник не указан 2688 дней].

Атака[править | править код]

Принцип работы ошибки

Атака реализуется через небольшой модуль Heartbeat-расширения TLS библиотеки OpenSSL. TLS — протокол представления данных поверх TCP или UDP, рассчитанный, однако, только на непрерывный поток данных. Если же обмен данными состоит из запросов и ответов, появляется возможность определять какую-то информацию по активности связи, да и после длинного простоя понадобится заново устанавливать TLS-соединение. Чтобы справиться с этой проблемой, клиент и сервер периодически взаимно отправляют и получают пакет случайной длины, и этим поддерживают связь в активном состоянии и «зашумляют» канал[2].

Чтобы сложнее было отличить пульсовые сообщения от полезного трафика, разработчики использовали следующую тактику: пакет состоит из контрольной строки и ничего не значащего «хвоста». Сервер должен вернуть сообщение, состоящее из такой же строки и своей порции «шума». Длина контрольной строки задаётся 16-битным целым числом[2]. Если эта длина окажется больше, чем весь пакет, уязвимые версии OpenSSL читали память за пределами отведённого буфера (RFC предписывает не отвечать на такие пакеты). За пределами буфера могут встретиться любые данные, в том числе (очень редко) закрытые ключи шифрования сервера, данные других соединений, содержащие идентификационные cookie и многое другое[3].

Heartbleed осуществляется отправкой некорректно сформированного Heartbeat-запроса, в котором реальная длина строки меньше указанной, а число, символизирующее длину передаваемой строки, в свою очередь, больше действительной длины строки. Так можно получить в ответ от сервера больше всего скрытой информации. Таким образом, у жертвы возможно за один запрос узнать до 64 килобайт памяти, которая была ранее использована OpenSSL.

Heartbeat-запрос выглядит так: «вернуть строку x, которая состоит из n символов», и получает ответ — строку x, состоящую из n символов. Heartbleed-запрос выглядит иначе: «вернуть строку x, которая состоит из количества символов n + y», и получает ответ, состоящий из строки x и ещё y символов, находящихся у жертвы в активной памяти.

Несмотря на то, что злоумышленник имеет некоторый контроль над размером блока памяти, он никак не может управлять положением этого блока, и поэтому единственным способом увеличить вероятность получения ценных данных — многократный повтор эксплуатации ошибки.

Решение[править | править код]

Проблема может быть решена игнорированием Heartbeat-запросов, которые хотят получить больше данных, чем длина передаваемой строки.

В OpenSSL версии 1.0.1g добавлена проверка границ, которая предотвращает выход за пределы переданной строки. Например, была добавлена следующая проверка, которая отбрасывает некорректные Heartbeat-запросы, предотвращая Heartbleed.

if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; /* silently discard per RFC 6520 sec. 4 */

Версии[править | править код]

Версии OpenSSL, подверженные уязвимости:

  • OpenSSL 1.0.2-beta
  • OpenSSL 1.0.1 — OpenSSL 1.0.1f

Чтобы безопасно пользоваться уязвимой версией OpenSSL, её нужно компилировать с флагом -DOPENSSL_NO_HEARTBEATS.

Уязвимые исходные файлы: t1_lib.c и d1_both.c.
Уязвимые функции: tls1_process_heartbeat() и dtls1_process_heartbeat().

Неподверженные уязвимости версии:

  • OpenSSL 1.0.2-beta2
  • OpenSSL 1.0.1g
  • OpenSSL 1.0.0 (и релизы ветви 1.0.0)
  • OpenSSL 0.9.8 (и релизы ветви 0.9.8)

Реакция[править | править код]

Системным администраторам рекомендуется либо использовать OpenSSL 1.0.1g, либо перекомпилировать библиотеку OpenSSL с ключом -DOPENSSL_NO_HEARTBEATS, отключая уязвимое расширение до тех пор, пока не представится возможным обновить ПО. Несмотря на то, что наложение патча решает проблему, запущенные приложения будут использовать подгруженный и ещё уязвимый код OpenSSL, пока каждое из приложений не будет перезапущено, позволяя подгрузить исправленный код. Так как все использованные уязвимой версией OpenSSL сертификаты и пароли могут считаться скомпрометированными, все закрытые ключи должны быть перевыпущены и все пароли сменены.

В день обнаружения уязвимости Tor Project выпустил уведомление, советующее всем желающим «надёжной анонимности или приватности в Интернете» «держаться подальше от Интернета несколько дней, пока всё не утрясётся»[4]. Владельцы сайтов и платформ советуют своим пользователям сменить пароли.

Примечания[править | править код]

  1. Mutton, Paul Half a million widely trusted websites vulnerable to Heartbleed bug. Netcraft (8 апреля 2014). Дата обращения: 16 апреля 2014. Архивировано 19 ноября 2014 года.
  2. 1 2 RFC 6520 — Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) Heartbeat Extension. Дата обращения: 15 апреля 2014. Архивировано 16 апреля 2014 года.
  3. Critical crypto bug exposes Yahoo Mail, other passwords Russian roulette-style | Ars Technica. Дата обращения: 16 апреля 2014. Архивировано 11 апреля 2014 года.
  4. "OpenSSL bug CVE-2014-0160". Tor. 2014-04-07. Архивировано из оригинала 10 июля 2017. Дата обращения: 16 апреля 2014.

Ссылки[править | править код]