Критическая уязвимость библиотеки glibc позволяет осуществлять удаленное выполнение кода



    Исследователи Google обнаружили критическую уязвимость в библиотеке glibc (GNU C Library). В функции getaddrinfo(), которая отвечает за разбор доменных имен, происходит переполнение буфера — ошибка позволяет злоумышленникам осуществлять удаленное выполнение кода.

    Эксплуатация уязвимости, получившей обозначение CVE-2015-7547, возможна в случаях, когда уязвимые устройства или приложения отправляют запросы контролируемым хакерами доменам и серверам, а также в случае проведения атаки типа man-in-the-middle.

    Все очень серьезно


    В своем блоге исследователи Google пишут, что обнаружили уязвимость, когда в используемом ими SSH-клиенте при попытке соединения с определенным адресом раз за разом начала возникать ошибка сегментации. В ходе разбирательств выяснилось, что всему виной переполнение буфера в glibc, и что эта ошибка может приводить к удаленному выполнению кода.

    Библиотека glibc используется в большом количестве популярных Linux-приложений — по утверждениям исследователей, уже подтверждена информация об уязвимости утилит wget, SSH, sudo и curl. Общее число уязвимых приложений столь велико, что составить полный список не представляется возможным — в разговоре с изданием Ars Technica исследователь безопасности Кен Уайт заявил, что уязвимость содержится во всех дистрибутивах Linux, а также языках программирования Python, PHP, Ruby on Rails. Есть сообщения о том, что ошибка содержится и в большей части приложений для работы с криптовалютой биткоин.

    К удивлению исследователей, оказалось, что мейнтейнеры, ответственные за glibc, знали об ошибке еще в июле прошлого года. Кроме того, выяснилось, что параллельно с экспертами Google и независимо от них уязвимость обнаружили и специалисты Red Hat — продукты этой компании также уязвимы (список). В итоге две команды объединили усилия для создания патча.

    На Github также доступна proof-of-concept-реализация эксплоита.

    Как защититься


    Специалисты, занимающиеся поддержкой glibc, уже выпустили патч, исправляющий ошибку. В некоторых случаях достаточно просто установить его, однако, если софт был скомпилирован с использованием уязвимой версии glibc, то его потребуется перекомпилировать с новой версией.

    Если установить патч по какой-то причине невозможно, исследователи описывают способы снижения вероятности эксплуатации уязвимости. Прежде всего, для эксплуатации необходимы большие пакеты UDP или TCP-ответов (2048+ байт) — приходящие один за одним такие пакеты перезаписывают стек. Противодействовать этому можно, ограничив размер пакетов с ответами, которые принимает локальный DNS-резолвер. Сделать это можно с помощью DNSMasq или аналогичных программ. Кроме того, следует убедиться, что DNS-запросы отправляются только DNS-серверам, которые ограничивают размер UDP-ответов.

    Мейнтейнеры glibc дали и свои рекомендации по противодействию атакам с использованием уязвимости. Они включают использование межсетевого экрана, который отклоняет UDP DNS-пакеты размером больше 512 байт, отказ от использования AF_UNSPEC, `options edns0` в /etc/resolv.conf, а также`RES_USE_EDNS0` или `RES_USE_DNSSEC`.

    Существуют и пакеты, которые не содержат эту ошибку — например, в мобильной ОС Google Android вместо glibc иcпользуется библиотека Bionic. Кроме того, многие используемые частными пользователями устройства —например, домашние роутеры — также работают с установленными альтернативными glibc библиотеками, об уязвимости которых информации на данный момент нет.

    Это не первый случай обнаружения в glibc критических уязвимостей, которые могут приводить к удаленному исполнению кода. Так в январе 2015 года была обнаружена уязвимость CVE-2015-0235, получившая название GHOST. Она позволяла злоумышленнику получить удаленный контроль над системой. Под ударом оказались пользователи Debian 7 (wheezy), Red Hat Enterprise Linux 6 & 7, CentOS 6 & 7, Ubuntu 12.04, а также Zend Framework v2, Wordpress и ряд других популярных приложений.

    Специалисты Positive Technologies рекомендуют всем пользователям и разработчикам, чьи системы могут быть уязвимы, как можно скорее установить обновление безопасности. Кроме того, снизить риск эксплуатации уязвимости можно, применив рекомендации мейнтейнеров glibc и исследователей Google, а также с помощью использования специальных инструментов защиты, например MaxPatrol.
    Positive Technologies
    278.29
    Company
    Share post

    Comments 36

      +6
      Вот и линкуйся после этого к glibc статикой.
        –2
        Ну так уже вроде тренд Hardned систем двигается к musl ;) Почему бы с ней не линковаться? http://www.etalabs.net/compare_libcs.html :)
        0
        rhel/centos/fedora уже выкатили патч в репы. Нужно ставить.
          0
          А что делает exploit? Он что-то все-таки выполняет или просто роняет клиента? Запустил, получил на клиенте SegFault и все.
            –2
            А код читать перед компилированием и запуском — не? :)
              +7
              А что PoC уже нынче сходу компилируются?) Никакого уважения, понимаешь...
            –3
            Кстати… То ли они прикрыли лавочку:

            $  host foo.bar.google.com 8.8.8.8
            Using domain server:
            Name: 8.8.8.8
            Address: 8.8.8.8#53
            Aliases:
            
            Host foo.bar.google.com not found: 3(NXDOMAIN)

            То ли у меня что-то не так с glibc, но:

            $  ./a.out
            a.out: getaddrinfo: Name or service not known
              0
              то ли голову надо включить. в сишном исходнике компилируется обычная сишная программа, использующая системные вызовы. чтобы она завалилась надо запустить питонячий скрипт и прописать машину, где находится скрипт в резолверы.
                –4
                Ну так ведь не интересно. Могли бы и на своём DNS поднять :)
              +1
              Вообще, довольно странно перечислять отдельные уязвимые продукты в статье, потому что с glibc по умолчанию линкуются _все_ сишные программы при компиляции. Программы на других языках тоже часто линкуются с glibc, например в golang из glibc использовался резолвер в Linux (в версии 1.5 вроде бы используется pure-go резолвер по умолчанию, но есть опция для включения реализаци из glibc)
                0
                поправка: s/по умолчанию/на системах, где glibc используется как таковой/ ;)
                  +1
                  Но не все программы используют getaddrinfo().
                  0
                  использование межсетевого экрана, который отклоняет UDP DNS-пакеты размером больше 512 байт

                  Есть готовые команды для iptables?
                    +2
                    iptables -I INPUT -m length --length 513:0xffff -j DROP
                      0
                      забыли добавить --dport 53
                      а также второе правило, где --dport 1024:65535 --sport 53
                        +2
                        ну, справедливости ради, я и -p udp забыл добавить :) Но как-то я всё же не сторонник медвежьих услуг с преподнесением копипасты на блюдечке. Я просто указал основное направление :)
                          0
                          забыли добавить --dport 53

                          Не нужно. Речь идет только про ответы. Так что достаточно --sport 53.
                            –2
                            А предотвратить ответы от Вас, не?
                              +1
                              Не. Зачем? Ответы от Вас могу быть, только если у Вас dns-сервер. И вредоносными они могут быть, если Ваш DNS-серер заменили на вредоносный. А для этого нужен рут. А руту Ваши правила в iptables не помеха.
                                –6
                                Вы смешной :)
                                  +4
                                  Приятно слышать. Но как это относится к теме?
                          0
                          Это разве не сломает dnssec?
                            0
                            см ветку чуть выше
                        +2
                        Какое-то дежа-вю. Этой проблеме лет 20+. Классически DNS использует UDP — датаграммы, кроме случая когда длина ответа более 512 байт, для работы используется TCP. Большинство проблем bind были связаны как раз с реализацией TCP-сессий. Такое впечатление, что библиотечные функции с проблемами из далекого прошлого BSD 4.4Lite.
                          +4
                          Решение для iptables:
                          iptables -N UDP-DNS-LIMIT
                          iptables -N TCP-DNS-LIMIT
                          iptables -A UDP-DNS-LIMIT -p udp --sport 53 -m length --length 0:512 -j ACCEPT
                          iptables -A UDP-DNS-LIMIT -p udp --sport 53 -j DROP
                          iptables -A TCP-DNS-LIMIT -p tcp --sport 53 -m length --length 0:1024 -j ACCEPT
                          iptables -A TCP-DNS-LIMIT -p tcp --sport 53 -j DROP
                          iptables -I INPUT -p tcp --sport 53 -j TCP-DNS-LIMIT
                          iptables -I INPUT -p udp --sport 53 -j UDP-DNS-LIMIT
                          iptables -I FORWARD -p tcp --sport 53 -j TCP-DNS-LIMIT
                          iptables -I FORWARD -p udp --sport 53 -j UDP-DNS-LIMIT

                          Не забываем про ip6tables:
                          ip6tables -N UDP-DNS-LIMIT
                          ip6tables -N TCP-DNS-LIMIT
                          ip6tables -A UDP-DNS-LIMIT -p udp --sport 53 -m length --length 0:512 -j ACCEPT
                          ip6tables -A UDP-DNS-LIMIT -p udp --sport 53 -j DROP
                          ip6tables -A TCP-DNS-LIMIT -p tcp --sport 53 -m length --length 0:1024 -j ACCEPT
                          ip6tables -A TCP-DNS-LIMIT -p tcp --sport 53 -j DROP
                          ip6tables -I INPUT -p tcp --sport 53 -j TCP-DNS-LIMIT
                          ip6tables -I INPUT -p udp --sport 53 -j UDP-DNS-LIMIT
                          ip6tables -I FORWARD -p tcp --sport 53 -j TCP-DNS-LIMIT
                          ip6tables -I FORWARD -p udp --sport 53 -j UDP-DNS-LIMIT
                            0
                            Я правильно понимаю, что если линковка динамическая, то достаточно установить пропатченную либу и программу даже не надо перезапускать?
                              +3
                              Перезапустить надо.
                              +1
                              Судя по всему Opera Software уже успела пропатчить настоящую Opera на Presto, очередное обновление спустя 2 года отсутствия их пришло:


                              Оперативно, молодцы! Могу продолжать пользоваться любимым браузером :)
                                0
                                Она же динамически линкована, и у меня обновление почему-то не пришло.

                                ldd opera
                                /usr/lib/opera$ ldd opera
                                    linux-gate.so.1 =>  (0xb7740000)
                                    libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb766c000)
                                    libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb7629000)
                                    libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xb761f000)
                                    libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xb7605000)
                                    libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb75f0000)
                                    libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xb75e4000)
                                    libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb7499000)
                                    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb747b000)
                                    librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb7472000)
                                    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb746d000)
                                    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb72f6000)
                                    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb72a9000)
                                    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb728a000)
                                    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb70cf000)
                                    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb70b4000)
                                    libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb7088000)
                                    libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xb705f000)
                                    libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xb7058000)
                                    libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb7033000)
                                    /lib/ld-linux.so.2 (0x80078000)
                                    libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb702f000)
                                    libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb7028000)

                                  0
                                  Видимо под Windows это не так
                                    0
                                    А какое тогда имеет отношение win-версия Оперы к обсуждаемой теме? Думаете, там libc внутри?
                                      0
                                      Может использоваться конкретно этот код позаимствованный из LibC или одна из dll-ек может использовать.
                                  0
                                  Оперативность молодцов несколько ограничена: для мака последняя версия 12.16, выпущена три года назад
                                    0
                                    А, может, это новые хозяева китайцы привнесли свои "изменения"?
                                      0
                                      Слишком быстро — все таки покупка/продажа длительный процесс, тем более когда Heartbleed была обнаружена, та же история с оперативным патчем была.
                                    0
                                    Возможна ли эксплуатация через рекурсивные DNS-сервера? К примеру Unbound или PDNS? Т.е. я прописываю себе обратную зону с эксплойтом и делаю коннект на жертву на сервис, который делает PTR lookup. Пройдет ли эксплойт через рекурсинвные сервера опреатора, к которому подключена жертва и DNS оператора прописаны у жертвы.

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