GHOST — уязвимость gethostbyname() в glibc
Специалисты Qualys сообщили о наличии уязвимости в gethostbyname() и gethostbyname2() в GNU
C Library (glibc), которая, как минимум в одном случае, способна привести к удаленному выполнению кода. Уязвимость позволяет перезаписать до 4 байт на 32-битных системах и до 8 байт на 64-битных системах в куче числами (0…9), точкой (.) и NULL-символом (0x00).
Уязвимость появилась в версии glibc-2.2 от 10 ноября 2000 года и была закрыта в версии 21 мая 2013 года с glibc-2.18, поэтому уязвимы только LTS-дистрибутивы Linux: Debian 7, Red Hat Enterprise Linux 6 и 7, CentOS 6 и 7, Ubuntu 12.04.
Уязвимым является код, который отвечает за получение hostname. Для перезаписи кучи, имя хоста должно удовлетворять следующим условиям:
- Содержать в себе только цифры и точку
- Первый символ должен быть цифрой
- Последний символ не должен быть точкой
- Быть достаточно длинным, чтобы переполнить буфер (>1КБ)
Следует заметить, что опасность эксплуатации значительно снижается из-за двух факторов: вызов gethostbyname() является устревшим из-за отсутствия поддержки IPv6, поэтому ПО чаще использует getaddrinfo(), чем его; вызов inet_aton() перед gethostbyname() предотвращает уязвимость.
Несмотря на эти два фактора, ребятам из Qualys удалось осуществить удаленное выполнение кода в exim4, перезаписав размер выделенного буфера и использовав встроенный в exim4 вызов $run{}. Обещают в скором времени выложить эксплоит для metasploit.
В других реализациях libc (uclibc, musl) уязвимость отсутствует. Eglibc уязвим.
CVE-2015-0235
Страница на qualys.com
Подробное описание в рассылке oss-security