Грустные записки на полях эволюции ИТ

Если кто не видел — недавно в самом популярном на Linux загрузчике Grub2 обнаружена уязвимость, позволяющая обходить защиту загрузки паролем, в итоге дающая полный доступ к шеллу.

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

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

Записки на полях эволюции ИТ истории

1.

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

Бывает.

2.

В результате затирается стек, включая адрес возврата из текущей функции.

Ладно, Ок.

3.

Соответственно, после ввода процессор прыгает на адрес 0, причем в регистре esi остается текущая длина пароля, то есть −28.

4.

По адресу 0 в RAM, как это водится, расположена таблица IVT, где лежат адреса обработчиков системных прерываний, но процессор ее сейчас интерпретирует не как адреса, в как исполняемый код.

5.

Оказывается, что в такой интерпретации IVT содержит функцию копирования блока памяти, где адрес, куда копировать, берется из регистра edi (напомню, он у нас установлен тоже в 0), а адрес откуда — из того самого регистра esi.

Синтез

  • Получается, что функция начинает править собственный код и копировать данные из адреса −28 прямо поверх самой себя. Причем в цикле.
  • На первый раз портятся несколько инструкций в начале, но не критично.
  • На второй раз добавляются какие-то инструкции, меняющие содержимое стека,
  • А дальше… дальше появляется инструкция retw. Она берет со стека число и прыгает по обозначенному им адресу.
  • А на стеке в этот момент лежит адрес встроенного шелла.

Всё это какая-то нелепая случайность, да? А может логичней предположить что машины самоорганизуются? Главное не пропустить момент…

Если вы хотите больше образного представления о том, как там всё внутри работает — примерно так:

История номер два

Ребёнок попросил поставить игрушку, случайно увиденную у подруги. В интернете игрушка нашлась быстро, оказалась она кроссплатформенная. Написана на Джаве, работает под виндой, линуксом, MacOS, iOS, андроидом и даже во FreeBSD. Во как!

Скачал с сайта производителя. Ну, она, правда, под опенсорсным JRE не заработала, захотела родной оракловый. Ладно, преодолевая брезгливость поставил. Завелась, но только в демо-режиме. А чтоб в нормальном режиме поиграть, надо заплатить производителю денюжек. А это уже напрягает.

Покопавшись в интернетах, обнаружил офигенный рецепт. Оказалось, что рекомендованный производителем метод запуска java -jar игрушка.jar запускает не саму игрушку, а только её launcher. А этот launcher, в свою очередь, запускает уже саму игрушку в виде ещё одного экземпляра Джавы с явно указанным классом из другого jar«а, маршрутами к библиотекам, ресурсам, логам и прочими параметрами.

И вот когда она запустилась, с помощью ps ax можно посмотреть все эти стартовые параметры, записать их в файлик и использовать его вместо родного launcher«а, запуская напрямую.

А хитрость вся в том, что если из ентого списка параметров убрать ключ —demo, то игрушка внезапно начинает работать в нормальном режиме. Офигенная защита! Похоже, Java влияет на моск почище, чем PHP.

Эх, ностальгия…

А вот помнится в наши времена черных экранов и дизассемблеров, хитрющих антритрассировочных приемов и голого отладчика наперевес, всё это делалось куда более мудрено и высококвалифицированней, как со стороны писателей-защитников софта, так и со стороны его пользователей. Это были времена до предела, по-байтово оптимизированного кода. Вот пример такой старой гвардии в моем былом посте: Рядовая математическая утилита оказалась виртуальной машиной с генератором полиморфного кода. Рынок перемолол её окончательно?

Соединяя два этих примера из жизни — что происходит с индустрией, а?

В качестве развития темы для генерации ещё больших больших волн говен — вот внешняя ссылка с обилием текста: Дебилизация населения «для чайников». Ныне нет никакой надежды на новое поколение, вся надежда на умные машины, которые успеем создать ещё мы.

Текст по ссылке оканчивается так:

Их полно и среди взрослого населения. Все они социализированы и практически неотличимы от недебилов. Это не только не считается чем—то особенным и выходящим из ряда вон, а является вариантом нормы.Причина повальной безграмотности и дремучего невежества не в засилье компьютеров и «избытке информации», а в нарастающей дегенерации русскоязычного населения, то есть, по — простому говоря, в вырождении нации.

Как было принято говорить в перестроечные времена (во время очередного фейла применительно к правительству, милиции, военным и т.д.) — ИТ невозможно отделить от общества и негативных процессов в нем протекающих. «Не мы такие, жизнь такая». Этим типичным оправданием какбэ мягко настраивая на безысходность происходящего: остается только терпеть.

Записки на полях эволюции ИТ истории

См. в тему настроя другой мой пост: Вся эволюция ИТ — это безнадежная борьба со сложностью кода.

(*) При написании поста использованы эти два линка: 1, 2.

© Blogerator