Как maloc удалось захватить память, которая уже была выделена в SSL Heartbeat?

Недавняя уязвимость, вызванная Heartbleed, вызвана этим неконтролируемым исполнением:

buffer = OPENSSL_malloc(1 + 2 + payload + padding);

(согласно http://java.dzone.com/articles/everything-you-need-know-about-2)

Но как мог malloc в любой момент захватить память, которая уже вышла из другого места. Несмотря на то, что переменные payload и padding заполняются пользовательскими значениями, но мне кажется, что они могли бы вызывать ошибку из памяти (с очень большим значением), а не сдвиг в адресном пространстве, чтобы прочитайте RAM сервера за пределами этого самого буфера.

2 ответа

OpenSSL использует свой собственный распределитель памяти (по причинам скорости, поэтому они говорят). Поэтому память никогда не возвращается в операционную систему. Вместо этого они объединяют неиспользуемые буферы и повторно используют их.

Если вы вызовете OPENSSL_malloc, то почти 100% вероятность того, что буфер, который вы получите, содержит данные, ранее используемые OpenSSL. Это могут быть зашифрованные данные, незашифрованные данные или даже частные ключи шифрования.


Это не так. Он захватывает небольшой блок памяти, а затем продолжает копировать из него гораздо больший объем данных, прочитывая мимо конца блока malloc'd во все, что происходит после него на куче - другие блоки malloc'd ( как живые, так и мертвые), которые использовались для других вещей (другие клиенты или системные вещи) - и копирует эти необработанные данные злоумышленнику.

licensed under cc by-sa 3.0 with attribution.