11-байтная DoS-атака
Серверы OpenSSL можно было вывести из строя с помощью крошечного вредоносного кода - «полезная нагрузка» занимает всего 11 байт.
Сопроводители OpenSSL закрыли уязвимость без присвоения CVE-идентификатора и распространили патч на все версии, в том числе устаревшие.
Как пишет издание BleepingComputer, ПО OpenSSL играет фундаментальную роль в области безопасных интернет-коммуникаций, так что профильным организациям необходимо как можно скорее интегрировать исправленные версии соответствующей библиотеки.
Исследователи компании Okta обозначили уязвимость как HollowByte.
По их словам, в процессе установления TLS-соединения каждое сообщение имеет 4-байтный заголовок, указывающий размер входящего сообщения.
Однако уязвимые версии OpenSSL выделяют область памяти для заявленной длины сообщения ещё до того, как «полезная нагрузка получена и до проверки её размера.
«Когда поступает вредоносный заголовок, компонент состояния запускает процедуру выделения памяти без проверки. В результате, когда на сервер поступает уже сама 11-байтная вредоносная нагрузка, конечный автомат TLS считывает 4-байтовый заголовок рукопожатия и запускает непроверенное предварительное выделение памяти на основе 3-байтового объявления длины заголовка: Read Header?grow_init_buf()?OPENSSL_clear_realloc()?malloc(attacker_size).
И поскольку на этом этапе проверка полезной нагрузки не выполняется, функция malloc() выделяет до 131 КБ памяти, основываясь исключительно на ложных данных. Затем рабочий поток уходит в цикл бесконечного ожидания данных, которые никогда не поступят.»
С осложнениями
Исследователи отмечают, что повторяющееся открытие соединений для быстрого исчерпания ресурсов сервера - старый трюк. Но HollowByte создаёт дополнительную проблему в силу того, как библиотека GNU C Library (glibc) обращается с памятью.
Когда вредоносное соединение обрывается, OpenSSL высвобождает выделенный буфер. Однако glibc не сразу возвращает операционной системе выделенные ресурсы малого и среднего размера; библиотека сохраняет их для потенциального повторного использования.
Направляя множественные волны запросов на соединения с разными заявленными длинами сообщений, злоумышленник препятствует перераспределению освободившихся областей памяти. Происходит более чем существенная фрагментация кучи (термин из области программирования), так что показатель максимального размера резидентной памяти постоянно растёт, и остаётся раздутым даже после окончания атаки. Единственный способ перераспределить память - это остановить процесс OpenSSL.
«Для оценки угрозы мы протестировали незащищенные и защищенные экземпляры OpenSSL, работающие под управлением NGINX, в различных условиях нагрузки», - пишут исследователи. - «В стандартной среде с 1 ГБ оперативной памяти незащищенный сервер прекратил работу из-за ошибки нехватки памяти (OOM), когда на зависшую, фрагментированную память пришлось 547 мегабайт. При тестировании в более производительных средах (16 ГБ оперативной памяти) атака успешно заблокировала 25% всей памяти системы, оставаясь при этом в пределах лимита соединений, что означает, что стандартные средства защиты, ограничивающие количество входящих подключений, не смогут ее остановить».
«По существу, такую атаку очень легко выполнить, сложно отразить, а последствия будут - как от распределённой DDoS-атаки, - считает Александр Зонов, эксперт по информационной безопасности компании SEQ. - Ущерб от простоя, в зависимости от нагруженности сервера, может быть огромным, так что обновить библиотеки стоит в приоритетном порядке, если это ещё не было сделано».
Библиотека OpenSSL встроена в такие популярные пакеты как Nginx, Apache, среды выполнения Node.js, Python, Ruby и PHP, а также базы данных MySQL и PostgreSQL. Она предустановлена на большинство дистрибутивов Linux с поддержкой TLS-шифрования и обработки сертификатов безопасности.
Исправленными являются версии 4.0.1, а также 3.6.3, 3.5.7, 3.4.6 и 3.0.21. Теперь буфер памяти выделяется не на основе заявленных в заголовке, а на основе фактического размера входящего сообщения.



