Для кого-то ушедший год запомнился финансовым кризисом, для кого-то - эпидемией гриппа. Для меня же год выдался необычайно богатым на различного рода малварь, как совершенно шаблонную, так и действительно стоящую, вырвавшую меня из привычного круговорота событий. В любом случае, самое время подвести итоги "работы" вирусописателей в 2009 году и сделать прогнозы на будущее.
Начну, как водится, с неприятного: миф о неуязвимости компьютеров от Apple, а, соответственно, и их операционной системы ( для индивидов, которые последние десять лет провели в бомбоубежище, делаю ремарку - ОС для "Макинтошей" носит название MacOS) развеян. В 2009 году был создан первый "яблочный" ботнет, найдены множественные уязвимости как в самой операционной системе, так и в сторонних приложениях.
Сами атаки, скажу прямо, не представляли собой ничего интересного - Unix архитектура консервативна, и, при желании, покопавшись в Интернете, можно легко переписать эксплойт пятилетней давности под "современную" MacOS. Если обратить свой взор в прошлое, то мы обязательно наткнемся на уязвимость во FreeBSD, обнаруженную аж в 2005-м. И вот, спустя четыре года, подобная ошибка найдена и в MacOS 10.5.6. Множественные целочисленные переполнения позволяют злоумышленнику при помощи специальных системных вызовов, i386_set_ltd и i386_get_ltd, повысить привилегии локального пользователя компьютера. Уязвимы к этой напасти оказались только владельцы Macintosh с процессорами фирмы Intel: ведь, как известно, чипы семейства Pentium предтечью своей виртуальной памяти считают две таблицы дескрипторов, а если точнее - LDT и GDT.
Вообще в мире существуют три вида таблиц дескрипторов, а именно: таблица дескрипторов прерываний, локальная таблица дескрипторов и глобальная таблица дескрипторов. Локальная таблица (LDT - Local Descriptor Table) несет в себе лишь шлюзы задачи, вызовов и дескрипторы сегмента. Любой сегмент недоступен задаче, если его описания нет ни в GDT, ни в LDT, так как локальная таблица дескрипторов описывается дескриптором в глобальной таблице (GDT - Global Descriptor Table). Соответственно, задействовав вышеописанную функцию i386_get_ltd и сообщая в описании (см. листинг) вызова параметр максимально возможного размера, мы в состоянии скопировать дамп памяти ядра в пользовательское окружение.
#include <machine/segments.h> #include <machine/sysarch.h> int i386_get_ltd (int start_sel, union descriptor *descs, int num_sels);
Забавно, ведь в ушедшем году на компанию Intel неудачи валились комом: скандал о нечестной конкуренции с AMD, относительно слабый старт Core i7 (но, как мне кажется, пик продаж новых процессоров придется на конец весны будущего года - Windows 7 к этому времени успеет завоевать значительную часть потребительского рынка, а требованиям ОС, хоть и демократичным, соответствует сравнительно небольшое количество персональных компьютеров). И все бы ничего, если бы в 2008 году известный российский хакер Крис Касперски не представил широкой публике уязвимость абсолютно во всех процессорах компании. (А Крис, между прочим, молодец - помимо вышеописанного открытия, он обнаружил прямо-таки неприличное количество ошибок, вплоть до фундаментальной ошибки в DNS(!)) О его докладе на HITB не писал разве что ленивый - действительно, как же быть, если даже процессоры содержат ошибки? Причем, по словам Криса, половину из них компания чинить не собирается.
Linux, окруженный ореолом неприступности, также был вдоль и поперек исследован. Брэд Спенглер (Brad Spengler) обнаружил уязвимость в модуле ядра grsecurity, доступного в ядрах ветки 2.6.30 и ниже. Интересно сие событие по двум причинам: первая, и самая банальная - не часто нас радуют уязвимостями в самой пролетарской ОС (связано это с тем, что Linux-based дистрибутивы не так распространены, как ОС семейства Windows, и внимания, естественно, им уделяется гораздо меньше, причем лишь узким кругом специалистов), и вторая - это практически незаметная ошибка, т.к. Брэд, по его собственному признанию, нашел ее совершенно случайно, когда детально изучал код, копая в абсолютно другом направлении.
Баг обнаружен в разыменовании указателя в функции tun_chr_pool() файла /drivers/net/tun.c, и заключается в инициализации некой переменной sk (см. листинг), в которую можно установить значение, равное нулю. Затем это проверяется компилятором так, что если оно действительно равно нулю, то при сборке нам возвращается ошибка. В процессе оптимизации GCC преспокойно вырежет блок с if(!tun), посчитав, что значение данной переменной уже давно присвоено, что и позволит злоумышленнику прочесть и записать данные по адресу 0х000000000.
struc sock *sk = tun->sk; ... if(!tun) return POLLER //тут компилятор выводит сообщение об ошибке
Но отойдем на время от правильных операционных систем и рассмотрим нашумевшего в начале года червя Conflicker (он же downadup, kido, etc), который за четыре дня, если верить статистике, заразил 10 млн (!) компьютеров. С точки зрения вирусописателя, код, прямо скажем, не блещет, однако нестандартный подход создателей к задаче распространения червя, его оригинальнейшая методика защиты и взаимодействия с "хозяевами", безусловно, заслуживают уважения.
Корпорация Microsoft в октябре 2008 года выпустила заплатку, закрывающую ошибку переполнения буфера MS08-067 в службе "Сервер". Естественно, что люди, нерегулярно обновляющие ОС, стали первыми жертвами атаки. Также не удивило меня и то, что очаги эпидемии пришлись на страны постсоветского пространства - ведь, как известно, у нас абсолютно легально можно купить любую версию Windows за десять тысяч белорусских рублей, лишая тем самым себя возможности своевременно получать критические обновления. Червь удачно этим воспользовался - он отсылал на компьютер пользователя специально сформированный RPC-запрос, вызывая переполнение буфера при вызове функции wcspy_s в библиотеке netapi32.dll. Дальше - дело техники: на компьютере запускается код-загрузчик, успешно сливающий малварь. Далее червь путем перехвата API-вызовов, отвечающих за обращение к DNS, блокировал практически все известные антивирусные URL (содержащие в названии sophos, kaspersky, nod, avira, etc.) и распространял себя на компьютеры других пользователей частной интрасети (если таковая у жертвы имелась) путем брутфорса пароля к стандартной системной шаре $ADMIN, после чего преспокойно рассылал себя ничего не подозревающим пользователям.
Давний прием переноса вирусов на внешних flash-накопителях также претерпел изменения - downadup обфусифицировал файл autorun.inf, заполняя его "мусором", что позволяло удачно проходить защиту большинства антивирусов. Лишний "код" немного увеличивал файл в размере, что позволяло незаметно запихнуть туда единственную строчку, запускающую зловредный код на машину пользователя.
Большинство вирусописателей допускают серьезную ошибку, жестко фиксируя IP адрес домена, куда червяк должен отсылать всю собранную им информацию. Создатель conflicker поступил оригинальнее, а именно - научил червя использовать 250 разных доменных имен, естественно, не записанных в тело вируса. Заранее нельзя сказать, куда именно червь отправляет информацию: специальный алгоритм, в зависимости от текущей даты, генерирует название новых управляющих доменов, куда и направляется впоследствии. Действует он по следующей схеме: вначале червь идет прямиком в google.com (либо иной поисковой сервис), где получает текущее число и месяц. В это же время генерируется список доменов, откуда червяк скачивает дополнительные файлы, необходимые ему для дальнейшей "жизни". Если текущая дата переходила за первое января 2009, то червяк выполнял следующую команду: http://%PredictableDomainsIPAdress%/search?q=%d. Как видно, червь использует вполне стандартные приемы, и остается только удивляться, как же до этого не додумались раньше.
Также год выдался удачным и на красивые взломы. Известнейший ресурс Рунета vkontakte.ru подвергся аж двум взломам, итогом которых была утеря конфиденциальной информации. Злоумышленник воспользовался ошибкой в модных нынче flash-приложениях, после чего успешно "слил" порядка 150 тыс. логинов и паролей от экаунтов пользователей. А в начале года ресурс преспокойно распространял всем желающим троян, опять же, ворующий e-mail-адрес жертвы. Что делать с такой огромной базой электронных адресов, объяснять, думаю, не надо.
На мой взгляд, в недалеком будущем основной мишенью для хакеров, "хацкеров" и прочих представителей "прогрессивной молодежи" (о том, как пишут вирусы серьезные дядьки, было написано выше) станут мобильные телефоны. Развитие систем беспроводного доступа (ну вот скажите, кого нынче удивишь wi-fi или 3G? А в ближайшем будущем нас еще и wimax порадуют...), слабая защита коммуникаторов и беспечность пользователей, считающих, что "мобильник" взломать невозможно, станут хорошим тому поводом. Тем более, что порядка 46% обращений к приснопамятному "ВКонтакте" генерируются именно с мобильных платформ. А недавно созданный ботнет из Apple iPhone яркое тому подтверждение. Время прикупить Kaspersky Antivirus Mobile или другое антивирусное решение для портативного устройства, удвоить бдительность (читай: стать параноиком) и тщательно следить за своим телефоном, проверяя его на наличие подозрительного контента.
В качестве эпилога расскажу вам презабавную историю: в России (впервые в мире!) обнаружили троян в банкомате (да, вы не ошиблись, именно в банкомате), который собирал конфиденциальную информацию о пользователях. Как все доходило до злоумышленника, так и осталось тайной, однако, принимая во внимание тот факт, что банкомат - это своеобразный сейф, к которому имеют доступ лишь представители банка и сотрудники техподдержки компании-изготовителя, можно сделать вывод о наличии инсайдера, тесно знакомого с своеобразной архитектурой компьютера (код был идеально заточен под данную платформу, что говорит о наличии определенных спецификаций) и передававшей всю собранную информацию злоумышленнику. Поэтому будьте бдительны, паранойя в наше время никому не помешает.
Кристиан КАРМАК
Комментарии
А Касперскі пустаслоў.
И
>паранойя в наше время никому не помешает.
:))
Поэтому в Инет Линем через линевый файрволл.
Если помните, Дэн Камински, сообщивший всему миру о дыре в DNS, вызвал бурный интерес, подогреваемый сообществом, ожидавшим подробностей по реализации атаки. Но сделаем ремарку, и задумаемся: а стоило ли раздувать “мыльный пузырь” вокруг дыры десятилетней давности?
Если капнуть глубже (я надеюсь, что Вы в курсе, как работает DNS протокол), то обнаружим, что латать DNS сервера стали задолго до “дыры” Каминского. Давным-давно, когда компьютеры были большими, а я еще маленьким, ОС использовали инкрементный TXID, увеличивающийся на единицу с каждым DNS запросом, а так же фиксированный порт источника. Не нужно было быть Нострадамусом, чтоб угадать пару шеснадцатибитных чисел. Далее TXID стал генерироваться на основе системных часов, но, опять же, энтропия, в этом случае, ниже злополучных 16-ти бит…
До Каминского большинство систем использовало простой инкрементный алгоритм, но это касалось исключительно workstations с DNS резолверами. По умолчанию сей порт – 53, хотя разработчики BIND предоставили возможность его рандомизации, и именно тут и появляются первые проблемы – как вам сервер с рандомными портами? Межсетевые экраны, трансляторы адресов и прочее идут лесом, открывая дорогу зловредам. А Каминский, бедняга, даже не знает, что в Сети везде понатыканы датчики; что сервера, атакованные им, это банальные honey-pots.
Ежели Вам нужна более подробная информация по этому вопросу, советую обратиться к материалам сайтов http://www.sensepost.com и http://www.metasploit.com. Если Вам не лень, изучите exploit’ы Каминского, и покажите мне, что же реально нового придумал Дэн. Заранее спасибо.