Федеральная Служба Опасности


Previous Entry Share Next Entry
0-day in GRUB2
manandmoon
malaya_zemlya
Если кто не видел - в популярном загрузчике Grub2 обнаружена уязвимость, позволяющая обходить защиту паролем, и дающая полный доступ к шеллу.

Эксплоит: вместо введения пароля нажать на Backspace ровно 28 раз, а потом Enter

Нет, это не секретный бекдор и не шутка девелоперов. Тут произошло нечто потрясающее. Постараюсь передать вкратце (если кому интересны все детали, то смотрите линк).

Если вместо ввода пароля нажимать на Backspace, то из-за пропущенной проверки программа заезжает за пределы буфера и начинает затирать нулями память с отрицательным смещением. Бывает.
В результате затирается стек, включая адрес возврата из текущей функции. Ок.
Соответственно, процессор прыгает на адрес 0, при чем в регистре esi остается текущая длина пароля, то есть -28.
По адресу 0, как водится, расположена таблица IVT, где лежат адреса обработчиков системных прерываний, но процессор ее сейчас интерпретирует не как адреса, в как исполняемый код. Оказывается, что в такой интерпретации IVT содержит функцию копирования блока памяти, где адрес, куда копировать, берется из регистра edi (он у нас установлен тоже в 0), а адрес откуда - из того самого регистра esi.
Получается, что функция начинает править собственный код и копировать данные из адреса -28 прямо поверх самой себя. Причем в цикле.
На первый раз портятся несколько инструкций в начале, но не критично.
На второй раз добавляются какие-то инструкции, меняющие содержимое стека,
А дальше... дальше появляется инструкция retw. Она берет со стека число и прыгает по обозначенному им адресу. А на стеке в этот момент лежит адрес встроенного шелла.

Занавес.


  • 1
Браво! По-моему машины самоорганизуются )

Edited at 2015-12-16 08:56 pm (UTC)

Да при чём тут машины, линейку к рукам прикладывать надо..

Существует ли язык программирования, пригодный для написания бутлоадеров, в котором подобное было бы невозможно?

Язык тут особо ни при чём, просто никогда нельзя доверять данным, которые вводит пользователь :)

это не язык, эир скорее stdio/stdlib, который вместо чтоб взять std накорябали руками.

Любой высокоуровневый, кроме C/C++. Арифметика указателей — зло.

Мне вот уже очень интересно, как на той же яве написать бутлоадер ;)

Ну не на джаве, а на хаскеле или на расте. Хотя можно и на джаве, если хочется извращений, только это будет такой джавный DSL, компилируемый в ассемблер для бутлодера. Хотя можно и так — stage1 делается DSL, stage2 грузит очень урезанную JVM, stage3 — полную JVM, и дальше пошло-поехало. Эксперименты такие были.

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

Победить — нельзя, а нейтрализовать последствия можно, притом разными способами. Есть языки, где глупый мало что сможет написать (Scala, Haskell — многие надеялись на C++, но он ожиданий не оправдал). Есть языки, которые устраняют наиболее вредные последствия глупости (Java, Go). Есть языки, совмещающие эти два качества (Erlang).

Большего ужаса, чем создают Явописатели придумать сложно. Это и не работает, и не падает, что приводит к продуктам-катастрофам.

Дураков вообще нельзя подпускать к чему-то важному. Пусть лучше поля в формочках равняют.

Так они и равняют. И ничего, не падает. Работает, но низенько, и не падает, а бизнесу этого и надо.

Сейчас вот Go вместо джавы будет использоваться для этих же целей.

А прямую работу с памятью в языках высокого уровня нужно запретить ВООБЩЕ, так как ошибиться можно не только по дурости, но и по невнимательности. А невнимательность и у умных бывает.

Работает, производя ошибки - это "не работает" на самом деле.

На невнимательность что-то сваливать - это только в том случае, если производится одноразовый софт. В нормальных проектах это всё проверяется.

> Работает, производя ошибки - это "не работает" на самом деле.

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

> В нормальных проектах это всё проверяется.

Ну вон, груб сколько людей писало? А OpenSSL? И что?

И то, что проблемы в этой богадельне, а не в языках программирования.

Ну хорошо, проблемы также в Microsoft, SAP, Oracle, Google, и др. Нет богаделен без проблем.

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

И VW.

Вот, кстати, сплошное мимими: http://habrahabr.ru/post/273249/

VW, кстати, с точки зрения выполнения весьма неплох. Что приказали - то и сделали.

Глупости никакой язык устранить не может. Пример: http://dil.livejournal.com/1356265.html

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

Erlang очень способствует написанию глупости. И прекрасно устраняет её последствия — до тех пор, пока звёзды не сойдутся.

Это прекрасно!

какой вообще смысл в пароле на загрузчик? взял лайфсиди/флеш/итп, загрузился, подмонтировал, прочитал что надо

BIOS под паролем

помогает только при административном запрете вскрывать корпус.

(кстати, у половины биосов бутменю неотключаемое. но это уже соседняя проблема)

есть лаптопы, которые выбрасывать приходится при забытом биос-пароле

или флешки программатором читать.

Вытащил диск, вставил в другой комп.

>прочитал что надо
... с шифрованного раздела, угу.

а от шифрования разделов "обход" пароля в загрузчике не поможет.

хорошо, пусть это будет виртуалка в каком-нть хецнере.

и?

там консоль кому попало без доп.защиты дают?

конкретно в хецнере не знаю, а в leasweb'е, с которым иногда имею дело, можно потыкать в вебинтерфейс и там подключат консоль.

так веб-интерфейс тоже защищать надо от злоумышленников, как и физический доступ к физической консоли и физический доступ к носителям.

Edited at 2015-12-17 11:26 am (UTC)

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

Говнокод начинается, когда для автоматического создания файла конфигурации загрузчика изобретают очередной "новый" язык программирования. И все делают вид, что так и надо.А в это время подход к программе меняется. И главным становятся фенечки и автоматика. При этом качество кода упадёт неизбежно. Ну, в таком вот проекте. Который, типа, никому не нужен, кроме создателей ))

Да, этот трюк как раз для хакерских фильмов. :) Напоминает способ, которым Шварц отключил сигнализацию машины в "Близнецах". :)

Дырка, конечно, красивая, но честно говоря, я никогда не пользовался паролем в грубе.
Когда надо защитить машину от несанкционированного физического доступа (например, ноутбук, если он вдруг потеряется или его украдут), я предпочитаю LUKS. Возможно, там тоже есть какие-то дырки, но по-любому, пока не введёшь правильный пароль, который позволит расшифровать ключ, никакого доступа всё равно не получишь.

LUKS, я твой OTETS

  • 1
?

Log in