Грустные записки на полях эволюции ИТ
Если кто не видел — недавно в самом популярном на 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.