Разбор уязвимости Heartbleed

Cloned Boy

Professional
Messages
1,017
Reaction score
793
Points
113
Уязвимость Heartbleed (CVE-2014-0160) — это критическая уязвимость в библиотеке OpenSSL, обнаруженная в 2014 году. Она позволяла злоумышленнику читать содержимое оперативной памяти сервера, что могло привести к утечке конфиденциальных данных, включая приватные ключи, пароли и другую敏感тивную информацию.

Суть уязвимости​

  1. Протокол TLS/SSL и расширение Heartbeat
    • OpenSSL реализует протоколы шифрования TLS/SSL, используемые для защиты интернет-соединений.
    • Расширение Heartbeat позволяет проверять, жив ли удалённый сервер, отправляя небольшой запрос и ожидая ответа.
  2. Ошибка в обработке Heartbeat-запроса
    • Уязвимость была в функции dtls1_process_heartbeat() (для DTLS) и tls1_process_heartbeat() (для TLS).
    • Сервер некорректно проверял длину (payload_length) в запросе Heartbeat.
    • Атакующий мог отправить запрос с маленьким реальным payload (например, 1 байт), но указать большую длину (до 64 КБ).
    • Сервер в ответе копировал не только переданные данные, но и случайные данные из своей памяти, соответствующие указанной длине.

Технические детали​

  • Уязвимые версии OpenSSL: 1.0.1 – 1.0.1f (исправлено в 1.0.1g).
  • Тип атаки: Read Overflow (чтение за пределами буфера).
  • Возможные последствия:
    • Утечка приватных ключей сервера.
    • Перехват сессий (куки, токены).
    • Компрометация пользовательских данных.

Пример запроса (упрощённо):
Code:
| type (1B) | payload_length (2B) | payload (N bytes) | padding |
Если payload_length = 65535, а реальный payload = "A" (1 байт), сервер вернёт "A" + 65534 байт из памяти.

Код уязвимости (до исправления)​

C:
/* Уязвимый код в OpenSSL (упрощённо) */
memcpy(bp, pl, payload_length); // Копирование payload + данные из памяти

Исправление:
Добавлена проверка, что payload_length соответствует реальной длине payload.

Как эксплуатировалась уязвимость?​

  1. Атакующий отправлял специально сформированный Heartbeat-запрос.
  2. Сервер отвечал, включая в ответ случайные данные из своей памяти.
  3. Повторяя запросы, можно было получить критически важную информацию (например, приватные ключи TLS).

Пример использования утилиты openssl для проверки уязвимости:
Bash:
openssl s_client -connect example.com:443 -tlsextdebug 2>&1 | grep "TLS server extension"
Если сервер поддерживал Heartbeat, он мог быть уязвим.

Последствия и масштаб​

  • Затронуты тысячи серверов (включая крупные компании вроде Yahoo, Cloudflare).
  • Уязвимость существовала 2 года до обнаружения.
  • Потребовалась массовая замена SSL-сертификатов.

Меры защиты​

  1. Обновить OpenSSL до версии 1.0.1g или новее.
  2. Отключить расширение Heartbeat, если оно не нужно.
  3. Заменить SSL-сертификаты после потенциальной утечки.
  4. Использовать IDS/IPS для обнаружения аномальных Heartbeat-запросов.

Вывод​

Heartbleed — одна из самых опасных уязвимостей в истории интернета, показавшая важность аудита open-source библиотек. Она привела к ужесточению практик безопасности и более внимательному отношению к проверке криптографического кода.
 
Top