Десятка самых-самых Докучаев Дмитрий aka Forb Спецвыпуск Xakep, номер #045, стр. 045-040-1 (forb@real.xakep.ru) Обзор хитовых переполнений Время от времени мир узнает о потрясной уязвимости в каком-нибудь юзабельном продукте. Ущерб от бага может составлять от нескольких миллионов до миллиарда зеленых президентов, хотя уязвимость представляет собой не что иное, как простое переполнение буфера. Бесспорно, что даже самый очевидный баг можно узреть только после длительного тестирования продукта. Самый талантливый программист – и тот не в состоянии проконтролировать длину и корректность всех переменных в своем коде. Как правило, этим занимаются багоискатели, старательно изучая исходники подозрительного приложения. Позволь представить тебе 10 хитовых переполнений, которые имели место в компьютерной истории и потрясли весь мир. 1. RPC-DCOM overflow Лето прошлого года ознаменовалось мрачным известием: все NT-системы от Microsoft оказались уязвимыми. Баг приводил к полному имперсонированию системы с правами «SYSTEM». 16 июля, в день обнаружения уязвимости, на сайте lsd.pl появилась информация о загадочном переполнении. Что интересно, суть ошибки никто раскрывать не собирался. Говорилось лишь о том, что в коде форточек юзается некорректное обращение к интерфейсу __RemoteGetClassObject, которое может подменить именованный канал epmapper. Несколько дней спустя, когда MS выложила все необходимые патчи, команда Xfocus раскрыла миру суть уязвимости в RPC, причем оказалось, что Винда имела не одну, а две бреши – локальную и удаленную. Когда происходил локальный запрос к API-функции CoGetInstanceFromFile(), контроль над параметром, отвечающий за длину файла, не производился. При удаленном обращении длина строго контролировалась. Если же заюзать RPC, то нетрудно составить запрос вида "\\servername\c$\itsverylongfilename.txt", который мог бы привести к переполнению буфера. Но здесь не все так гладко, как кажется на первый взгляд. Для того чтобы передать аргумент API-функции, требуется подменить "\\servername" на что-либо другое (изначально это имя машины, к которой осуществляется реквест). Кроме того, необходимо учесть, что shell-код не должен иметь определенных символов, по которым происходит проверка в функции GetMachineName(). Это реализуется с помощью специально подобранных адресов возврата. Они зависят от версии операционной системы, и, если они сгенерированы неверно, RPC-сервис аварийно завершит работу. Бьюсь об заклад, что ты баловался RPC-DCOM эксплоитом и ощутил, что значит не угадать адрес возврата: удаленная система сразу же уходила в даун. Когда таргет был верным, ты получал командный shell. Подобное переполнение юзалось вирмейкерами в детище msblast. Этот чудесный червь сумел попасть в тысячи машин и совершить глобальную атаку на windowsupdate.com. 2. Ptrace stack overflow in kernel По цифрой два выступает брешь в линуксовом ядре. Конечно, она имеет лишь локальный характер стекового переполнения, но ошибку содержат практически все ветки ядер 2.2 и 2.4. Так же, как и в случае с DCOM, никто не собирался раскрывать суть уязвимости. В багтраке говорилось, что ptrace() содержит компрометирующую уязвимость, ведущую к локальному руту. Однако через несколько дней некий Анджей Шомберски из Польши посчитал своим долгом раскрыть подробности этой уязвимости. Удачное переполнение возможно, если: |