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
    Digital Security
    109.21
    Безопасность как искусство
    Share post

    Comments 25

      0
      Что-то не понял. Судя по статье это как же надо сойтись звездам, чтобы можно было эту уязвимость эксплуатировать? И что если мои хостнэймы не подпадают под вышеперечисленные критерии?
        0
        Для того, чтобы появилась возможность выполнения кода, нужно здорово постараться. Парням просто повезло с организацией памяти в exim4, и с тем, что есть функция run{} именно там, где должна быть. А чтобы уронить программу, достаточно того, чтобы хостнейм соответствовал описанным критериям.
          0
          (убежал срочно патчиться...)
          • UFO just landed and posted this here
              +2
              Навскидку проглядывается следующий способ эксплуатации:

              1. Зарегить домен (или взять уже зарегистрированный) и организовать ему поддержку DNS;
              2. Прописать ему в качестве MX-записи вредоносное имя хоста;
              3. Зарегиться на каком-нибудь Web-сервисе, отправляющем почту через exim4, указав при регистрации e-mail в подготовленном домене. Сервис передаст мэйлеру письмо с подтверждением регистрации, тот для отправки письма найдёт MX-запись домена и дальше полезет на хост.
              4. Профит.
                +1
                Прописать искомое в PTR хоста, стукнуться в exim телнетом по ipv4 и сказать EHLO — вот тут будет профит.
                Все экзимы к утру полягут, если такую ptr-ку сделать смогут.
                  0
                  Не знаю, насколько PTR-записи в Сети допустимы на своих DNS-серверах. А на чужих могут и не дать сохранить килобайтную запись.
                    +3
                    Все PTR-записи расположены на чьих-то dns-серверах =)
                    Так что тут вопрос только в наличии своей сети.
              0
              Написать письмо с адреса в таком домене, почтовый сервер резолвит домены, так что как раз почтовые сервера в первую очередь атакуются.
              0
              вызов inet_aton() перед gethostbyname()

              Не совсем понял практику использования этих двух функций вместе. Может первое вместо второго? Или gethostbyaddr() вместо gethostbyname()?
                0
                Некоторые программы сначала вызывают inet_aton(), и если он не смог распарсить адрес, то gethostbyname(). А хост, который выполнить уязвимость, «выглядит» как IP-адрес (т.е. имеет 4 октета, цифры и точки).
                  0
                  Это я понял, спасибо. Я не понял как надо совместно использовать inet_aton() и gethostbyname(), чтоб избежать проблем ?:)
                    0
                    Вы отредактировал коммент и мой потерял смысл. :) Теперь я понял, спасибо.
                      0
                      Да, прошу прощения.
                  0
                  — Содержать в себе только цифры и точку
                  — Первый символ должен быть цифрой

                  Не могу найти это в оригинале. Кто может процитировать?

                    0
                    www.openwall.com/lists/oss-security/2015/01/27/9
                    — Its first character must be a digit (line 127).

                    — Its last character must not be a dot (line 135).

                    — It must comprise only digits and dots (line 197) (we call this the
                    «digits-and-dots» requirement).
                    0
                    Интересно, как скоро в репах Цента появится обновленная версия.
                    0
                    Объясните пожалуйста, в описании уязвимости описан случай Экзима, но, насколько я понял из того же описания, это по-большому счету проблемы того же Экзима + микроскопическая уязвимость в glibc.
                    Да, Ред Хат говорят, что это critical vulnerability, но мне кажется, они так говорят автоматически на все, что содержит «arbitrary code execution», неважно при каких условиях это может быть получено.
                    Я не понимаю, как это может угрожать тем, кто не использует Экзим? Реально не понимаю.
                      0
                      Данная уязвимость позволяет удаленно перезаписать хоть и пару, но байт в программе, но, в целом, вы в чем-то правы: уронить программу может быть достаточно просто, а выполнить код в ней — сложно, если вообще возможно.
                        0
                        проблема в том, что подвержена этому багу неопределённая тонна программ, вполне корректно использующие этот вызов из glibc.
                        и без анализа каждой конкретной нельзя сказать, что она иммунна к нему.
                        например экзим оказался хоть и с диким переподвыподвертом — но узявим до уровня реально эксплуатируемого RCE.
                        как выяснилось, весьма популярный форум на php тоже оказался уязвим.
                        и никто не может сказать какое количество еще самых неожиданных мест окажется уязвимым.

                        именно поэтому, это и критикал.

                      Only users with full accounts can post comments. Log in, please.