Исследователи безопасности Гектор Марко (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 благодаря некорректной работе функции восстановления пароля — система принимала в качестве верного кода даже пустое значение.

Комментарии (27)


  1. Meklon
    17.12.2015 21:17
    +3

    Туплю. А gdm, kdm, lightdm что спрашивают? У меня груб не спрашивает пароль. Только грузит ОС.


    1. thatsme
      17.12.2015 21:39
      -12

      Вы не сталкивались с ситуацией, когда grub2 не может подмонтировать root? Если сталкивались, то наверняка помните, что он требует ввести рутовый пароль, для того что-бы можно было сделать с этим что-то вручную (например указать альтернативный root).
      Если Вы ввели пароль верно, то становитесь пользователем root со смонтированым в read-only initramfs, который обычно имеет достаточно инструментов, что-бы поднять систему, или спасти данные с разделов, которые ещё живы.

      Так вот, в данная уязвимость, позволяет получить рутовый доступ к Вашей системе, без загрузки с LiveCD… При загрузке с LiveCD таких плясок с бубнами не потребуется.


      1. aml
        17.12.2015 21:58
        +8

        Господи, какая каша. Пароль загрузчика (grub2) спрашивается до загрузки ядра. Его и только его можно обойти в результате бага.

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

        Вообще я не понимаю, почему уязвимость критической назвали. Чтобы это хоть какой-то вред нанесло, надо чтобы у злоумышленника был физический доступ к клавиатуре, но при этом не было возможности загрузить компьютер с другого носителя (флешки, cd/dvd, другого жёсткого диска и т.д.) Защита от младшего братика?


        1. thatsme
          17.12.2015 22:25
          +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. Капитанить о процессе загрузки и хамить, было не обязательно.


          1. aml
            17.12.2015 23:21
            +9

            Вы правы, прошу прощения.


        1. mihaild
          17.12.2015 22:29
          +5

          Например, защита машин в общественном пользовании (элементарно в универах). Физический доступ к клавиатуре есть, но загрузку с внешних носителей можно запретить, а разобрать корпус и подключить свой жесткий диск (или забрать имеющийся и на него что-то записать) — уже нельзя.


        1. maxim_0_o
          18.12.2015 09:01

          Да, уязвимости с непосредственным доступом к машине — это не так страшно, как удаленные атаки. Но пароль на грабе, насколько мне известно, единственный способ избежать вот этой проблемы. А теперь оказывается, что и он уязвим. Получается, что если ты используешь grub2 — ты даешь рутовый доступ любому, что получил непосредственный доступ к твоей машине.


    1. thatsme
      17.12.2015 22:38
      +2

      Эта уязвимость критична для тех у кого есть зашифрованные разделы и одновременно разделы меню grub2 защищены паролем.
      Если в grub2 есть пароль, то злоумышленник может установить руткит, и в последствии (после загрузки) получить доступ к уже расшифрованной информации. Если у Вас есть защищённый раздел, и нет пароля в меню grub2, то Вы и так уязвимы.


      1. thatsme
        17.12.2015 22:45
        +4

        Если root партиция зашифрована, то эта уязвимость, вряд-ли кому-то поможет достать Ваши данные.

        P.S. За что минусуем? Я наступил на мину хабрасуицида?


    1. monah_tuk
      18.12.2015 07:50

      Пароль, что бы не сказать в опции ядра

      init=/bin/bash
      

      что дасть uid 0 без лишних вопросов :) У меня на Mint 17 64bit, кстати, не сработало, не знаю, когда обновилось, но патчик CVE-2015-8370.patch там есть (в debian/patches/)


  1. J_o_k_e_R
    17.12.2015 23:21
    +3

    Пароль на груб — секрет Полишинеля. Злоумышленик может обойти его, поменяв настройки биоса, загрузившись с флешки и т.п. В общем имея физический доступ к машине — можно все. Если только разделы на машине не зашифрованы. Хотя если зашифрованы, то подкладываем ядро с кейлогером и снимаем пароль. Если только ядро не подписано… короче продолжать долго можно.


    1. rPman
      18.12.2015 00:36
      +1

      На биос тоже можно ставить пароль, так что нет


      1. J_o_k_e_R
        18.12.2015 00:47
        +3

        Не считаю это за меру защиты, с тех пор как узнал про «award_sw».


      1. torf
        18.12.2015 02:39
        +1

        батарейку можно в любой момент вытащить, так что да


        1. JerleShannara
          18.12.2015 04:13
          +4

          Ага, особенно на ноуте, сколько у меня знакомых так обожглось «та ну тебя нафик, я щя батарейки выну и он сам позволит зайти… [пару часов спустя] слушай, а что ты там про программатор говорил?»


          1. grumbler66rus
            22.12.2015 10:17

            На ноутбуках батарейка CMOS тоже имеется. Обычно она литиевая «технологического исполнения», хотя на одном ноутбуке я видел аккумулятор. Эта батарейка подключена к материнке проводочком с разъёмом.
            Подозреваю, что те знакомые просто не умеют разбирать ноутбуки :)


            1. isden
              22.12.2015 12:05

              К слову, у меня был один ноут, где эта батарейка вообще болталась на проводах в отсеке с HDD / RAM.


            1. JerleShannara
              23.12.2015 16:25

              К слову, она там используется для часов и части настроек. Пароль валяется в флешке =)


    1. d7s2di
      18.12.2015 13:01

      >В общем имея физический доступ к машине — можно все.

      Не всегда. По возможности, стараюсь использовать полнодисковое шифрование: LUKS+LVM со всем этим справляются весьма неплохо.


      1. Kop3t3
        18.12.2015 15:45

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


        1. d7s2di
          18.12.2015 18:31

          >, а если его нет

          То защиты и нет, ага.


  1. Sleuthhound
    18.12.2015 07:30
    +6

    Опять 0-day уязвимость — Вы помешались на них что ли? 0-day — это когда нет патча закрывающего уязвимость, а он есть и доступен уже более месяца, с 13 ноября 2015 года, см. -> http://hmarco.org/bugs/patches/0001-Fix-CVE-2015-8370-Grub2-user-pass-vulnerability.patch
    Если разработчики Grub пропустили факт уведомления об уязвимости мимо ушей, а они это сделали, судя по тому что обновление вышло только пару дней назад, то это их промах.


  1. ValdikSS
    18.12.2015 12:32
    +4

    Ну вы чего? Исследователи, нашедшие уязвимость, написали такое красивое её описание, причины, действительно постарались, а вы все это выкинули и оформили как новость.


    1. ValdikSS
      18.12.2015 14:26
      +1

      Если кратко, то при нажатии backspace, затирается нулями стек. Жмем backspace'ы, доходим до адреса возврата из функции, затираем его нулем, нажимаем enter, перепрыгиваем на 0, где у нас таблица прерываний. Процессор начинает выполнять данные из таблицы прерываний как код (это же загрузчик, тут protected mode, нет виртуальной памяти и NX), и, ВНЕЗАПНО, у нас там что-то вроде цикла копирования памяти через movsl, причем в качестве аргумента «куда» указывается 0, т.е. начало таблицы прерываний. Так мы копируем-копируем, и в конечном итоге попадаем на вызов retw, а в ESP у нас опять ВНЕЗАПНО оказывается адрес из примерно середины функции grub_rescue_run(). Магия!


      1. BuCeFaL
        18.12.2015 16:50

        Более детальное описание.
        У меня воспроизвести так и не вышло.

        $ grub2-install --version
        grub2-install (GRUB) 2.00
        


        1. BuCeFaL
          18.12.2015 17:12
          +1

          Будет работать только если grub собран под 32 битную архитектуру. Если grub собран под 64 уходит на перезагрузку.

          $ rpm -qa grub2
          grub2-2.00-27.fc20.x86_64
          


  1. Cheater
    18.12.2015 14:31

    На машинах с UEFI от загрузчика (Grub, lilo/elilo...) можно отказаться вообще, его роль способен выполнить сам UEFI (в случае линукса). См. «EFI stub».