Я знаю об основной уязвимости Heartbleed, ее последствиях и причинах. Однако недавно я прочитал, что Heartbleed может вызвать сбой сервера. Мне интересно, верно ли это утверждение, и если да, то почему.
Насколько я понимаю, Heartbleed просто отправляет обратно длину, запрошенную клиентом, и пропускает проверку, действительно ли эта длина соответствует действительности. Так что я действительно не понимаю, как могло произойти сбой сервера при чтении данных?
Чтобы ответить на этот вопрос, нужно немного узнать, как работает подкачка. В современных операционных системах приложения обращаются не к адресам физической памяти, а к адресам виртуальной памяти. Сопоставление виртуальной и физической памяти происходит в блоках, называемых страницами. Размер страницы зависит от оборудования, наиболее распространенная сторона - 4 КБ.
Когда процесс запущен, большая часть адресного пространства виртуальной памяти пуста. Доступ к нему вызовет ловушку в ядре ОС, которая может завершить процесс и, возможно, зарегистрировать событие.
Поскольку процессу требуется память, он запрашивает память у операционной системы по одной или нескольким страницам за раз.
Ошибка heartbleed может привести к утечке до 64 КБ данных. Это означает, что он может пересекать границы до 16 страниц (другими словами, он может занимать 17 страниц). На первой из этих страниц хранятся легитимные данные, так что эта страница гарантированно существует. Но следующие 16 страниц виртуального адресного пространства, возможно, еще не выделены. Если это произойдет, не будет возвращаться 64 КБ данных, и ядру ОС придется справиться с ситуацией. Если механизм восстановления не определен, процесс будет остановлен.
В зависимости от конструкции серверного программного обеспечения оно может автоматически восстанавливаться после этого, просто создав новый процесс. Я думаю, что Apache породит новый процесс. Другое программное обеспечение может не возродиться автоматически. В этом случае сердцебиение могло привести к сбою серверного программного обеспечения и остановке его работы.
Полный сбой операционной системы невозможен из-за heartbleed. Для сбоя операционной системы потребовалась бы другая ошибка.