Критическая уязвимость в загрузчике Grub2 позволяет обходить защиту паролем



    Исследователи безопасности Гектор Марко (Hector Marco) и Исмаэль Риполл (Ismael Ripoll) опубликовали информацию об обнаруженной ими 0-day уязвимости в популярном загрузчике Grub2, который используется в большинстве Linux-системах. Эксплуатация уязвимости позволяет получить доступ к аварийной консоли Grub2 в обход пароля. Это, в свою очередь, открывает злоумышленнику возможность проведение атаки направленной на повышение привилегий в систем и доступа ко всей информации.

    Описание уязвимости


    Целочисленному переполнению подвержены функции загрузчика grub_password_get() и grub_username_get(). Из-за пропущенной в коде проверки, при последовательном нажатии Backspace 28 раз происходит «затирание» нулями памяти с отрицательным смещением.В итоге происходит затирание памяти стека и происходит поэтапное «перепрыгивание» выполнения на разные адреса/смещения, что в конце концов приводит к исполнению инструкции retw, и в результате удачная эксплуатация приводит к запуску встроенной оболочки.



    Исследователи провели proof-of-concept-демонстрацию, эксплуатирующую ошибку в функции grub_username_get() — после нажатия клавиши Backspace 28 раз и один раз — клавиши Enter, они получили доступ к полностью функциональной аварийной консоли Grub2.

    Более того, Марко и Риполл сумели получить полный доступ к операционной системе даже несмотря на то, что у них не было реального пароля пользователя. Для этого они изменили условия работы функции is_authenticated(), которая проверяет факт прохождения аутентификации пользователем — сделать это можно с помощью команды Grub2 write_word:



    К чему может приводить эксплуатация ошибки


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

    Марко и Риполл также создали proof-of-concept-демонстрацию подобной атаки. Для этого была разработана модифицированная библиотека Firefox libplc4.so, которая создает новый процесс и запускает консоль управления на порте 53. Затем эта библиотека была записана на флеш-накопитель и скопирована на компьютер-жертву, при этом оригинальная библиотека была заменена.



    После того, как пользователь запустит Firefox, будет активирована консоль управления, дающая атакующему доступ к данным пользователя:



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


    Уязвимы версии загрузчика с 1.98 по 2.02. Для того, чтобы проверить, подвержена ли конкретная система описанной уязвимости, необходимо в тот момент, когда Grub запросит имя пользователя нажать клавишу Backspace 28 раз, а затем нажать Enter. Если после этого компьютер перезагрузится или запустится аварийная консоль (rescue shell), то система уязвима.

    Исследователи оповестили крупных разработчиков Linux-based операционных систем, а также разработали патч, который позволяет исправить ошибку.

    Отметим, что похожая уязвимость ранее была обнаружена в мобильной ОС Android — она позволяла «пройти» экран блокировки телефона, использовав очень длинный пароль. Кроме того, летом 2015 года была обнаружена ошибка в работе системы безопасности игрового магазина Steam. Злоумышленник мог скромпрометировать учетную запись пользователя Steam благодаря некорректной работе функции восстановления пароля — система принимала в качестве верного кода даже пустое значение.
    Positive Technologies 302,61
    Компания
    Поделиться публикацией
    Комментарии 27
    • +3
      Туплю. А gdm, kdm, lightdm что спрашивают? У меня груб не спрашивает пароль. Только грузит ОС.
      • –12
        Вы не сталкивались с ситуацией, когда grub2 не может подмонтировать root? Если сталкивались, то наверняка помните, что он требует ввести рутовый пароль, для того что-бы можно было сделать с этим что-то вручную (например указать альтернативный root).
        Если Вы ввели пароль верно, то становитесь пользователем root со смонтированым в read-only initramfs, который обычно имеет достаточно инструментов, что-бы поднять систему, или спасти данные с разделов, которые ещё живы.

        Так вот, в данная уязвимость, позволяет получить рутовый доступ к Вашей системе, без загрузки с LiveCD… При загрузке с LiveCD таких плясок с бубнами не потребуется.
        • +8
          Господи, какая каша. Пароль загрузчика (grub2) спрашивается до загрузки ядра. Его и только его можно обойти в результате бага.

          Потом грузится ядро, монтирует корневую фс, и только после этого загрузочные скрипты могут спросить пароль root. Перед монтированием корневой фс часто сначала монтируется initramfs, которая может например пароль на расшифровку фс спросить.

          Вообще я не понимаю, почему уязвимость критической назвали. Чтобы это хоть какой-то вред нанесло, надо чтобы у злоумышленника был физический доступ к клавиатуре, но при этом не было возможности загрузить компьютер с другого носителя (флешки, cd/dvd, другого жёсткого диска и т.д.) Защита от младшего братика?
          • +9
            Вы правы, однако в статье это не отражено, к сожалению.
            Нашёл в оригинале:
            Information disclosure: The attacker can load a customized kernel and initramfs (for example from a USB) and then from a more comfortable environment, copy the full disk or install a rootkit.


            То есть, эта уязвимость, — всеголишь обход паролей menu-entries.
            Скриншот, с загруженым initramfs, сбивает с толку…

            P.S. Капитанить о процессе загрузки и хамить, было не обязательно.

            • +9
              Вы правы, прошу прощения.
            • +5
              Например, защита машин в общественном пользовании (элементарно в универах). Физический доступ к клавиатуре есть, но загрузку с внешних носителей можно запретить, а разобрать корпус и подключить свой жесткий диск (или забрать имеющийся и на него что-то записать) — уже нельзя.
              • 0
                Да, уязвимости с непосредственным доступом к машине — это не так страшно, как удаленные атаки. Но пароль на грабе, насколько мне известно, единственный способ избежать вот этой проблемы. А теперь оказывается, что и он уязвим. Получается, что если ты используешь grub2 — ты даешь рутовый доступ любому, что получил непосредственный доступ к твоей машине.
            • +2
              Эта уязвимость критична для тех у кого есть зашифрованные разделы и одновременно разделы меню grub2 защищены паролем.
              Если в grub2 есть пароль, то злоумышленник может установить руткит, и в последствии (после загрузки) получить доступ к уже расшифрованной информации. Если у Вас есть защищённый раздел, и нет пароля в меню grub2, то Вы и так уязвимы.
              • +4
                Если root партиция зашифрована, то эта уязвимость, вряд-ли кому-то поможет достать Ваши данные.

                P.S. За что минусуем? Я наступил на мину хабрасуицида?
              • 0
                Пароль, что бы не сказать в опции ядра
                init=/bin/bash
                

                что дасть uid 0 без лишних вопросов :) У меня на Mint 17 64bit, кстати, не сработало, не знаю, когда обновилось, но патчик CVE-2015-8370.patch там есть (в debian/patches/)
              • +3
                Пароль на груб — секрет Полишинеля. Злоумышленик может обойти его, поменяв настройки биоса, загрузившись с флешки и т.п. В общем имея физический доступ к машине — можно все. Если только разделы на машине не зашифрованы. Хотя если зашифрованы, то подкладываем ядро с кейлогером и снимаем пароль. Если только ядро не подписано… короче продолжать долго можно.
                • +1
                  На биос тоже можно ставить пароль, так что нет
                  • +3
                    Не считаю это за меру защиты, с тех пор как узнал про «award_sw».
                    • +1
                      батарейку можно в любой момент вытащить, так что да
                      • +4
                        Ага, особенно на ноуте, сколько у меня знакомых так обожглось «та ну тебя нафик, я щя батарейки выну и он сам позволит зайти… [пару часов спустя] слушай, а что ты там про программатор говорил?»
                        • 0
                          На ноутбуках батарейка CMOS тоже имеется. Обычно она литиевая «технологического исполнения», хотя на одном ноутбуке я видел аккумулятор. Эта батарейка подключена к материнке проводочком с разъёмом.
                          Подозреваю, что те знакомые просто не умеют разбирать ноутбуки :)
                          • 0
                            К слову, у меня был один ноут, где эта батарейка вообще болталась на проводах в отсеке с HDD / RAM.
                            • 0
                              К слову, она там используется для часов и части настроек. Пароль валяется в флешке =)
                      • 0
                        >В общем имея физический доступ к машине — можно все.

                        Не всегда. По возможности, стараюсь использовать полнодисковое шифрование: LUKS+LVM со всем этим справляются весьма неплохо.
                        • 0
                          В том-то и вопрос: если есть LVM, то обход пароля на GRUBe ни чем не поможет, а если его нет, то злоумышленник просто вывинтит винт, (как бы это ни звучало), подключит его к сумочке с, например, Banana PI (клон Raspbery PI, но с поддержкой SATA), запишет малварь, и ввинтит на место — GRUB опять не при делах.
                          • 0
                            >, а если его нет

                            То защиты и нет, ага.
                      • +6
                        Опять 0-day уязвимость — Вы помешались на них что ли? 0-day — это когда нет патча закрывающего уязвимость, а он есть и доступен уже более месяца, с 13 ноября 2015 года, см. -> http://hmarco.org/bugs/patches/0001-Fix-CVE-2015-8370-Grub2-user-pass-vulnerability.patch
                        Если разработчики Grub пропустили факт уведомления об уязвимости мимо ушей, а они это сделали, судя по тому что обновление вышло только пару дней назад, то это их промах.
                        • +4
                          Ну вы чего? Исследователи, нашедшие уязвимость, написали такое красивое её описание, причины, действительно постарались, а вы все это выкинули и оформили как новость.
                          • +1
                            Если кратко, то при нажатии backspace, затирается нулями стек. Жмем backspace'ы, доходим до адреса возврата из функции, затираем его нулем, нажимаем enter, перепрыгиваем на 0, где у нас таблица прерываний. Процессор начинает выполнять данные из таблицы прерываний как код (это же загрузчик, тут protected mode, нет виртуальной памяти и NX), и, ВНЕЗАПНО, у нас там что-то вроде цикла копирования памяти через movsl, причем в качестве аргумента «куда» указывается 0, т.е. начало таблицы прерываний. Так мы копируем-копируем, и в конечном итоге попадаем на вызов retw, а в ESP у нас опять ВНЕЗАПНО оказывается адрес из примерно середины функции grub_rescue_run(). Магия!
                            • 0
                              Более детальное описание.
                              У меня воспроизвести так и не вышло.
                              $ grub2-install --version
                              grub2-install (GRUB) 2.00
                              
                              • +1
                                Будет работать только если grub собран под 32 битную архитектуру. Если grub собран под 64 уходит на перезагрузку.
                                $ rpm -qa grub2
                                grub2-2.00-27.fc20.x86_64
                                
                          • 0
                            На машинах с UEFI от загрузчика (Grub, lilo/elilo...) можно отказаться вообще, его роль способен выполнить сам UEFI (в случае линукса). См. «EFI stub».

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое