Исследователи безопасности Гектор Марко (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)
J_o_k_e_R
17.12.2015 23:21+3Пароль на груб — секрет Полишинеля. Злоумышленик может обойти его, поменяв настройки биоса, загрузившись с флешки и т.п. В общем имея физический доступ к машине — можно все. Если только разделы на машине не зашифрованы. Хотя если зашифрованы, то подкладываем ядро с кейлогером и снимаем пароль. Если только ядро не подписано… короче продолжать долго можно.
rPman
18.12.2015 00:36+1На биос тоже можно ставить пароль, так что нет
torf
18.12.2015 02:39+1батарейку можно в любой момент вытащить, так что да
JerleShannara
18.12.2015 04:13+4Ага, особенно на ноуте, сколько у меня знакомых так обожглось «та ну тебя нафик, я щя батарейки выну и он сам позволит зайти… [пару часов спустя] слушай, а что ты там про программатор говорил?»
grumbler66rus
22.12.2015 10:17На ноутбуках батарейка CMOS тоже имеется. Обычно она литиевая «технологического исполнения», хотя на одном ноутбуке я видел аккумулятор. Эта батарейка подключена к материнке проводочком с разъёмом.
Подозреваю, что те знакомые просто не умеют разбирать ноутбуки :)isden
22.12.2015 12:05К слову, у меня был один ноут, где эта батарейка вообще болталась на проводах в отсеке с HDD / RAM.
JerleShannara
23.12.2015 16:25К слову, она там используется для часов и части настроек. Пароль валяется в флешке =)
d7s2di
18.12.2015 13:01>В общем имея физический доступ к машине — можно все.
Не всегда. По возможности, стараюсь использовать полнодисковое шифрование: LUKS+LVM со всем этим справляются весьма неплохо.Kop3t3
18.12.2015 15:45В том-то и вопрос: если есть LVM, то обход пароля на GRUBe ни чем не поможет, а если его нет, то злоумышленник просто вывинтит винт, (как бы это ни звучало), подключит его к сумочке с, например, Banana PI (клон Raspbery PI, но с поддержкой SATA), запишет малварь, и ввинтит на место — GRUB опять не при делах.
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 пропустили факт уведомления об уязвимости мимо ушей, а они это сделали, судя по тому что обновление вышло только пару дней назад, то это их промах.
ValdikSS
18.12.2015 12:32+4Ну вы чего? Исследователи, нашедшие уязвимость, написали такое красивое её описание, причины, действительно постарались, а вы все это выкинули и оформили как новость.
ValdikSS
18.12.2015 14:26+1Если кратко, то при нажатии backspace, затирается нулями стек. Жмем backspace'ы, доходим до адреса возврата из функции, затираем его нулем, нажимаем enter, перепрыгиваем на 0, где у нас таблица прерываний. Процессор начинает выполнять данные из таблицы прерываний как код (это же загрузчик, тут protected mode, нет виртуальной памяти и NX), и, ВНЕЗАПНО, у нас там что-то вроде цикла копирования памяти через movsl, причем в качестве аргумента «куда» указывается 0, т.е. начало таблицы прерываний. Так мы копируем-копируем, и в конечном итоге попадаем на вызов retw, а в ESP у нас опять ВНЕЗАПНО оказывается адрес из примерно середины функции grub_rescue_run(). Магия!
BuCeFaL
18.12.2015 16:50Более детальное описание.
У меня воспроизвести так и не вышло.
$ grub2-install --version grub2-install (GRUB) 2.00
BuCeFaL
18.12.2015 17:12+1Будет работать только если grub собран под 32 битную архитектуру. Если grub собран под 64 уходит на перезагрузку.
$ rpm -qa grub2 grub2-2.00-27.fc20.x86_64
Cheater
18.12.2015 14:31На машинах с UEFI от загрузчика (Grub, lilo/elilo...) можно отказаться вообще, его роль способен выполнить сам UEFI (в случае линукса). См. «EFI stub».
Meklon
Туплю. А gdm, kdm, lightdm что спрашивают? У меня груб не спрашивает пароль. Только грузит ОС.
thatsme
Вы не сталкивались с ситуацией, когда grub2 не может подмонтировать root? Если сталкивались, то наверняка помните, что он требует ввести рутовый пароль, для того что-бы можно было сделать с этим что-то вручную (например указать альтернативный root).
Если Вы ввели пароль верно, то становитесь пользователем root со смонтированым в read-only initramfs, который обычно имеет достаточно инструментов, что-бы поднять систему, или спасти данные с разделов, которые ещё живы.
Так вот, в данная уязвимость, позволяет получить рутовый доступ к Вашей системе, без загрузки с LiveCD… При загрузке с LiveCD таких плясок с бубнами не потребуется.
aml
Господи, какая каша. Пароль загрузчика (grub2) спрашивается до загрузки ядра. Его и только его можно обойти в результате бага.
Потом грузится ядро, монтирует корневую фс, и только после этого загрузочные скрипты могут спросить пароль root. Перед монтированием корневой фс часто сначала монтируется initramfs, которая может например пароль на расшифровку фс спросить.
Вообще я не понимаю, почему уязвимость критической назвали. Чтобы это хоть какой-то вред нанесло, надо чтобы у злоумышленника был физический доступ к клавиатуре, но при этом не было возможности загрузить компьютер с другого носителя (флешки, cd/dvd, другого жёсткого диска и т.д.) Защита от младшего братика?
thatsme
Вы правы, однако в статье это не отражено, к сожалению.
Нашёл в оригинале:
То есть, эта уязвимость, — всеголишь обход паролей menu-entries.
Скриншот, с загруженым initramfs, сбивает с толку…
P.S. Капитанить о процессе загрузки и хамить, было не обязательно.
aml
Вы правы, прошу прощения.
mihaild
Например, защита машин в общественном пользовании (элементарно в универах). Физический доступ к клавиатуре есть, но загрузку с внешних носителей можно запретить, а разобрать корпус и подключить свой жесткий диск (или забрать имеющийся и на него что-то записать) — уже нельзя.
maxim_0_o
Да, уязвимости с непосредственным доступом к машине — это не так страшно, как удаленные атаки. Но пароль на грабе, насколько мне известно, единственный способ избежать вот этой проблемы. А теперь оказывается, что и он уязвим. Получается, что если ты используешь grub2 — ты даешь рутовый доступ любому, что получил непосредственный доступ к твоей машине.
thatsme
Эта уязвимость критична для тех у кого есть зашифрованные разделы и одновременно разделы меню grub2 защищены паролем.
Если в grub2 есть пароль, то злоумышленник может установить руткит, и в последствии (после загрузки) получить доступ к уже расшифрованной информации. Если у Вас есть защищённый раздел, и нет пароля в меню grub2, то Вы и так уязвимы.
thatsme
Если root партиция зашифрована, то эта уязвимость, вряд-ли кому-то поможет достать Ваши данные.
P.S. За что минусуем? Я наступил на мину хабрасуицида?
monah_tuk
Пароль, что бы не сказать в опции ядра
что дасть uid 0 без лишних вопросов :) У меня на Mint 17 64bit, кстати, не сработало, не знаю, когда обновилось, но патчик CVE-2015-8370.patch там есть (в debian/patches/)