Компания
436,27
рейтинг
17 декабря 2015 в 20:48

Разработка → Критическая уязвимость в загрузчике 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 благодаря некорректной работе функции восстановления пароля — система принимала в качестве верного кода даже пустое значение.
Автор: @ptsecurity
Positive Technologies
рейтинг 436,27

Комментарии (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».

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

Самое читаемое Разработка