Heartbleed

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

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

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

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

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

Открытие[править | править вики-текст]

Официально о существовании ошибки Heartbleed сообщили 1 апреля 2014. Название Heartbleed было придумано инженером финской компании Codenomicon, занимающейся информационной безопасностью. Они же придумали логотип в виде кровоточащего сердца и создали сайт 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, 309197 серверов остались уязвимыми.

Атака[править | править вики-текст]

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

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

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

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

Heartbeat-запрос выглядит так: «Верни мне слово тест, которое состоит из 4 букв», и получает ответ «тест». Heartbleed-запрос выглядит иначе: «Верни мне слово „тест“, которое состоит из 500 букв», и получает ответ, состоящий из слова «тест» и еще 496 символов, лежащих у жертвы в активной памяти.

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

Patch[править | править вики-текст]

Проблема может быть решена игнорированием Heartbeat-запросов, которые хотят получить больше данных, чем длина передаваемой строки. В версии 1.0.1g OpenSSL добавлена проверка границ, которая предотвращает выход за пределы переданной строки. Например, был добавлен следующий тест, который отбрасывает некорректные 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] Владельцы сайтов и платформ советуют своим пользователям сменить пароли.

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

См. также[править | править вики-текст]

  • OpenSSL
  • Bashdoor — сходный по опасности баг в bash
  • Badlock — опасная уязвимость в SMB

Ссылки[править | править вики-текст]