Антивирус на помойку
Защищенная ось без антивирусов и тормозов
Некоторые воспринимают антивирус
как неотъемлемую часть операционной системы и просто не мыслят свое
существование без защитных пакетов от разных производителей, свободно
пропускающих заразу, но вызывающих жуткие тормоза и целый ворох
конфликтов, вплоть до выпадения в BSOD. Самый лучший антивирус — это сама ось! Нужно только научиться правильно ею пользоваться!
Терминологические войны Windows NT (и все производные от нее
системы — W2K, XP и частично Vista) изначально проектировались как
защищенные оси, способные постоять за себя и дать вирусам решительный
отпор без каких-либо дополнительных средств, в том числе и широко
разрекламированного Microsoft Anti-Spy-Ware. Но, чтобы не увязнуть в
терминах, необходимо уточнить ряд определений.
Условимся называть вирусами саморазмножающиеся программы, паразитирующие на
исполняемых файлах, динамических библиотеках, драйверах и других
объектах подобного рода. Эпоха вирусов закончилась вместе с крушением
MS-DOS, когда единственным средством добычи новых программ были дискеты
товарища или, в лучшем случае, FIDO и BBS. С эпидемиологической точки
зрения, все это создавало крайне напряженную обстановку. Копировать
программы друг у друга — все равно что ширяться из одного шприца. С
другой стороны, антивирус годичной
давности считается вполне свежим и актуальным. Основными носителями
вирусов были люди, а не файлы, поэтому масштабы эпидемии определялись
исключительно интенсивностью копирования программ. С появлением
сети пользователи стали закачивать дистрибутивы программ из инета, а
вирусам для размножения перестали требоваться люди. Используя дыры в
подсистемах безопасности и ошибки типа переполнения буфера, любой вирус
буквально за несколько часов может заразить практически все уязвимые
узлы, при этом ему совершенно не обязательно внедряться в исполняемые
объекты. Зачем привлекать к себе лишнее внимание, когда можно
ограничиться временным проживанием в оперативной памяти. Если заражен
хотя бы 1% всех машин в сети, то вирус, умирая при перезагрузке, через
незаткнутые дыры будет возвращаться вновь и вновь. Такие вирусы принято
называть червями, и это один из наиболее распространенных типов
компьютерной заразы на сегодняшний день.
Еще существуют «психологические» вирусы, представляющие собой
обыкновенные исполняемые файлы и распространяющиеся через вложения
электронной почты, ICQ, web и ftp. Свою историю они ведут от «крэкеров
интернета», завлекающих бесплатным доступом в сеть, а на
самом деле, форматирующим жесткий диск. Этот подкласс заразы назвали
Троянским Конем. Сейчас же времена первобытного варварства остались
позади, и большинство троянов не уничтожают информацию, поскольку это
сделает их пребывание слишком заметным, а скрыто устанавливают
шпионскую закладку, похищающую пароли и содержимое электронных
кошельков. Такие компьютеры принято называть зомби или дронами. Собрав
огромную армию дронов, хакер может совершать распределенные атаки и
делать кучу других антисоциальных вещей. Например, рассылать спам.
Антивирусы — за гранью возможного…
Антивирусы в настоящее время практически полностью утратили былую значимость и усиленно пытаются отойти от пропасти, на
дне которой они находятся. Вирусы, заражающие исполняемые файлы, за
последние несколько лет фактически перевелись, к тому же запретить
запись в исполняемые файлы средствами операционной системы намного
проще, дешевле, быстрее и надежнее, чем устанавливать антивирусный
пакет. И уж совсем бессмысленно пытаться лечить зараженные объекты,
ведь в любой момент их можно переустановить с дистрибутивной копии,
хранящейся на CD-R/RW или скачанной из сети.
Антивирусный монитор, следящий за всеми создаваемыми/открываемыми файлами и проверяющий их на
лету, — это дополнительные тормоза (подчас очень значительные):
конфликты, критические ошибки, голубые экраны смерти и прочий ничем не
оправданный геморрой. Вся проблема в том, что антивирус
может ловить только те вирусы, о которых знает, а вирусы сейчас пишут
все кому не лень, так что даже при экстраординарной степени
оперативности никакой гарантии, что вся зараза будет распознана, у нас
нет. Более того, вирус, упакованный слегка подправленной версией
крутого протектора, имеет 100% шансы остаться незамеченным! Сложные
протекторы уже не распаковываются на
эмуляторе ЦП, и для их снятия требуется статический распаковщик,
входящий в «движок» антивирусной базы и справляющийся только со строго
конкретными версиями протекторов и очень болезненно относящийся даже к
незначительным изменениям структуры упакованного файла. Да что там
структура! Обычно бывает достаточно внедрить в точку входа jump на инструкцию, неизвестную эмулятору (например, что-нибудь из набора SSE/SSE2), и антивирус идет лесом, поскольку переменная длина x86 инструкций не позволяет ему определить начало следующей машинной команды!
Впрочем, даже если антивирусу удастся побороть упаковщик и передать
эвристику, распакованный код никаких вирусных признаков все равно там
ни за что не обнаружит, ну разве что это будет пионерский вирус.
Наличие незашифрованных текстовых строк с ключами реестра,
ответственными за автозапуск, имен исполняемых файлов антивирусных
программ, команд в стиле «rm -rf/» с высокой степенью указывает на
зловредную программу, но их очень легко зашифровать. Еще эвристик может
анализировать таблицу импорта и аргументы, передаваемые функции
GetProcAddress. А если там встретится WriteProcessMemory,
VirtualAllocEx, CreateRemoteThread или что-то еще в этом роде, он
сделает вывод, что имеет дело с программой, способной внедряться в
другие процессы. Верный признак червей и отладчиков. Ситуация сильно
осложняется тем, что многие вирусные приемы сейчас активно используются
протекторами, и, если эвристик не утихомирить, он отправит в топку
добрую половину легальных программ, чего допускать ни в коем случае
нельзя! Да и вообще, если создатель вируса неглупый человек, то он
многократно прогонит его через различные эвристики, добиваясь их полной
и безоговорочной капитуляции. Что же касается червей (и, в
частности, нашумевшего MS BLAST, известного также под кличкой Love
San), то это вообще песня. Удаляют его антивирусы, не удаляют — что
толку? Пока есть дыра, он словно феникс из пепла будет появляться вновь
и вновь. К тому же всегда существует вероятность, что кто-то умный
напишет свой собственный shell-код, не имеющий с MS BLAST'ом ничего
общего, а потому и не детектируемый никаким антивирусом! Некоторые дыры
можно закрыть брандмауэром, но в общем случае для этого необходимо
установить заплатку от производителя уязвимого продукта, которым может
быть как сама ось, так и один из ее компонентов: IE, FireFox и т.д.
Еще существует такой тип антивирусов, как ревизоры, в задачу которых
входит проверка целостности существующих файлов и контроль за вновь
созданными. Некоторые ревизоры также контролируют и реестр, особенно
ветки, прямо или косвенно ответственные за автоматический запуск
программ. Во времена MS-DOS это была очень хорошая штука, но сейчас
винчестеры так разжирели, что процедура сканирования отнимает кучу
времени, к тому же многие сканеры содержат ошибки, позволяющие заразить
файл без изменения его контрольной суммы (см. статью «Как подделывают
CRC16/32», опубликованную в «Хакере»), не говоря уже о том, что при
правильной политике разграничения доступа сводит актуальность сканеров на
нет, тем более, начиная с W2K, система сама контролирует целостность
жизненно-важных файлов через механизм SFC. Ну вот, сейчас кто-то
скажет, что SFC легко обмануть, особенно если вирус стелсируется на
уровне ядра или вообще не внедряется ни в какие объекты файловой
системы, существуя лишь в виртуальной памяти какого-нибудь процесса.
Контроль над целостностью виртуальной памяти процессоров берут на
себя как антивирусы, так и персональные брандмауэры, распознающие и
отсекающие все известные способы внедрения в чужое адресное
пространство, да вот только работает этот механизм кое-как. Зловредному
коду, запущенному с пониженными привилегиями, доступ к чужим процессам
можно запретить средствами самой операционной системы, а код,
запущенный с правами администратора, пройдет сквозь все уровни защиты,
как нож сквозь масло (при условии, что его писал не пионер, а хотя бы
комсомолец). Самое неприятное, что существует множество легальных
программ, например, мультимедийных клавиатур и мышей, использующих
внедрение в чужое адресное пространство для реализации своих
мультимедийных возможностей, поэтому слепой запрет
брандмауэра/антивируса приведет к их неработоспособности! Значит,
необходимо предоставить пользователю возможность выбора. А сможет ли он
отличить честную программу от нечестной? Но даже не это самое страшное.
Чем глубже внедряется брандмауэр/антивирус в систему, тем сложнее
зловредному коду его обойти, но и тем больше конфликтов и глюков он
(брандмауэр/антивирус) вызывает.
Получается так, что грамотно настроенной системе никакой антивирус не нужен, а с безграмотной никакой антивирус
все равно не справится (брандмауэр стоит ставить только затем, чтобы
отделить домашнюю локальную сеть от интернета и следить за сетевой
активностью установленных программ, выявляя не только шпионов, но и
легальные программы, пытающиеся проверить корректность регистрации).
Никакие, даже самые совершенные антивирусы ни от чего не спасают! При
этом они стоят немалых денег, пожирают сетевой трафик частыми
обновлениями, вызывают конфликты и тормозят работу системы, между тем
система вполне может справиться с вирусами и сама — никакие
дополнительные костыли ей не нужны!
Разграничение доступа — попробуй пробей В отличие, например,
от BSD, Windows NT не является многопользовательской операционной
системой, поскольку только один пользователь может работать с
компьютером в любой момент времени, и прежде чем переключиться на
другого, необходимо завершить текущий сеанс, закрыв все приложения, и
лишь потом… А вот в BSD все очень просто: нажал Alt-F#, переключился на
соседнюю консоль — и все! В Windows XP наконец-то появилась возможность
переключения сеансов разных пользователей без завершения, но механизма
взаимодействия между пользователями как не было, так и нет. Правда,
в текущем сеансе можно запускать программы от имени другого
пользователя, но это, во-первых, совсем не то, а во-вторых, далеко не
все программы соглашаются на
такой запуск, и еще меньше из них сохраняют свою работоспособность в
полном объеме. Так что без бубна здесь не обойтись. Если нет бубна, то
сойдет и обычный оцинкованный таз. Идея противостояния вирусам
заключается в выборе правильной политики разграничения доступа, тогда
вирус (или другая зловредная программа) просто не сможет напакостить и
нанести значительный урон. А для этого все потенциально опасные
программы нужно запускать в своеобразной песочнице. В идеале — на
виртуальной машине типа VMware, но про VMware мы уже неоднократно
писали, а вот про разграничение доступа материалов практически нет.
Начнем с того, что никогда, ни при каких обстоятельствах не следует
постоянно сидеть под «администратором», поскольку любая запущенная
программа может делать с системой все, что ей вздумается. Под
администратором следует заходить в систему только для выполнения
«ремонтных» работ — установки новых драйверов, изменения параметров
конфигурации и т.д. А все остальное время проводить под «опытным
пользователем» или просто «пользователем» с ограниченным доступом. Чем
меньше у вас привилегий, тем меньше их и у каждой запущенной вами
программы, однако под обыкновенным пользователем многие программы
работать отказываются, поскольку требуют записи в каталог Program Files
или в другие «злачные» места. Зато потом наступает тишь да гладь — ни
вирусов, ни другого малваре.
Необходимость в периодическом резервировании, естественно, до сих пор существует. Надежнее всего резервироваться на
CD-R/RW, DVD-RW, ZIP, стримеры и прочие внешние носители информации,
однако это непроизводительно, неудобно, да и надежность у винчестеров
все же повыше будет, чем у того же CD-RW. Поступим так. Создадим нового
пользователя с администраторскими правами (Пуск -> Панель Управления
-> пользователи и пароли -> Имя -> Пароль -> Другой ->
Администраторы), назовем его, к примеру, «backup», зайдем под его
именем в систему, создадим каталог general-stores (то есть общее
хранилище) и скопируем туда все, что необходимо. Затем, щелкнув по
каталогу правой кнопкой мыши, в появившемся контекстом меню выбираем
вкладку «свойства», а там — «безопасность» со списком допущенных лиц.
По умолчанию каталог доступен для всех, что никак не входит в наши
планы, поэтому удаляем «всех» напрочь, предварительно сбросив галочку
«переносить наследуемые от родительского объекта разрешения на
этот объект». Все!!! Теперь этот каталог недоступен никому, даже
системе! И только владелец, создавший его (то есть «backup»), может
войти в раздел «безопасность» и вернуть «всех» на
место. Внимание! Администратор не сможет этого сделать! Ну вообще-то,
чтобы так не извращаться, после удаления «всех» можно добавить
пользователя «backup», делегировав ему полный доступ к каталогу. Все же
остальные пользователи, включая членов группы, добраться до этого
каталога не смогут. Хорошая защита от вирусов и прочих деструктивных
программ, неправда ли? Кстати говоря, задумаемся, а что произойдет,
если случайно (преднамеренно) удалить пользователя «backup»? Ведь тогда
доступ к архиву не сможет получить никто! К счастью, штатная утилита
chkdsk распознает такую ситуацию, и, если видит подобный каталог-зомби,
она автоматически возвращает «всех», воскрешая информацию из небытия.
Песочница — не только детская радость Нашей следующей задачей
будет постройка «песочницы» для всех тех программ, что могут быть
атакованы из сети, к числу которых принадлежит IE, Fire Fox, Outlook
Express, The Bat, ICQ и другие. Каждая из них должна быть запущена
из-под ограниченного пользователя, не имеющего доступа ни к каким
каталогам, кроме тех, которые явно нужны самой программе. В принципе,
можно завести одного ограниченного пользователя на
всех, обозвав его, к примеру, «sandbox» (то есть песочница), однако в
этом случае червь, пробравшийся через IE, сможет разрушить почтовую
базу, накопленную за многие годы, что будет обидно. Поэтому лучше всего
дать каждой программе по пользователю (конечно, это увеличивает
потребности системы в памяти, но не столь радикально). Итак, создан
ограниченный пользователь «sandbox», в свойствах «безопасности» каждого
каталогов (или всех дисков целиков) «sandbox» добавлен, и доступ ему
запрещен (политика запрета имеет приоритет над политикой разрешений,
поэтому удалять «всех» совершенно не обязательно). По завершению этой
нехитрой операции у sandbox'а останутся только те каталоги, которые ему
нужны (как правило, это каталоги самой программы, причем без права
записи в исполняемые файлы).
Попробуем запустить в песочнице, например, Firefox. Создаем ярлык с
firefox.exe (если только это не сделал инсталлятор), щелкаем по нему
правой клавишей, идем в «свойства», затем — в «дополнительно» и там
взводим галочку «запускать от имени другого пользователя». Говорим «ОК»
и запускаем. Появляется грозное диалоговое окно, требующее ввода имени
и пароля. Вводим. И… Горящий Лис не запускается! Между прочим, в
Linux/BSD подобная операция протекает без каких бы то ни было проблем
(в XP и выше проблем с конкретной Firefox также не возникает. — Прим.
редактора). А здесь нужен бубен или более конкретно — файловый монитор
Марка Руссиновича, показывающий, на
каких именно файловых операциях программа обламывается (вот так,
значит, разработчики относятся к сообщениям об ошибках). Качаем
файловый монитор: www.sysinternals.com/Utilities/Filemon.html
(он, кстати, занимает меньше двухсот килобайт и распространяется
совершенно бесплатно). Запускаем из-под администратора: создаем ярлык и
взводим уже известную нам галочку «запускать от…»! В данном случае
файловый монитор запускается, потому что запрограммирован правильно, и
мы быстрым спортивным шагом идем в Options -> Filter/Highlight или
нажимаем <CTRL-L>. В появившемся диалоговом окне взводим все
галочки, кроме «Log Successes», поскольку мониторить успешные операции
нам незачем! Нам нужны ошибки! Нажимаем «OK» и перезапускаем программу
(фильтр будет действовать только после запуска). Вновь запускаем
Горящего Лиса. Что мы видим? Сначала идут ошибки поиска динамических
библиотек в тех каталогах, где их нет — это нормально. А вот дальше
Горящий Лис пытается создать папку Mozilla прямо в каталоге WINNT (в
ней он хранит свои настройки, кэш страниц и т.д.), куда его,
естественно, не пускают, и он тихо умирает. Да… задача. Пробуем
утилиту командной строки runas, запустив ее так: «runas /user:sandbox
firefox.exe» (при этом firefox.exe должен быть в текущей директории).
Нас деловито спрашивают пароль и… ничего! Теперь Горящий Лис лезет в
Document n Setting\Default User, куда ему также нет доступа! В чем же
дело?! В чем причина?! А в том, что для корректной работы большинства
программ необходимо загрузить еще и профиль пользователя, от имени
которого мы их запускаем, поэтому правильный вариант выглядит так:
«runas /profile /user:sandbox firefox.exe». Теперь запуск проходит без
проблем!
А вот Опера хранит кэш не в профиле пользователя, а непосредственно в
своем каталоге (впрочем, это зависит от ее настроек), поэтому sandbox'у
необходимо присвоить права на запись в «program files\opera».
Остальные программы «распутываются» аналогичным образом. Если не помогает файловый монитор, то качаем монитор реестра (www.sysinternals.com/Utilities/Regmon.html) и смотрим, в каких ветвях нуждается программа. Маленький подводный камень: перенаправить ввод с клавиатуры на
файл, увы, не удастся, и пароль придется каждый раз вводить вручную,
что напрягает. Впрочем, программисты запросто напишут программу,
лишенную этих недостатков. Нам же главное — создать кучу пользователей,
распределив права доступа так, чтобы зловредные программы не имели
никаких шансов ни для размножения, ни для шпионской деятельности.
Заключение
Создание защищенной системы без использования антивирусов — это реально! Пускай на
первоначальном этапе нам придется проделать большой объем работы и
очень много думать головой, создавая столько пользователей, чтобы
полностью изолировать одно потенциально опасное приложение от всех
остальных. Зато будешь знать наверняка, что, работая на твоей любимой машине, домашние ничего плохого с ней сделать не смогут…
Удачи тебе, твори и создавай!!!
Автор - Крис Касперски.
|