Защищенная ось без антивирусов и тормозов
Некоторые воспринимают антивирус как неотъемлемую часть операционной
системы и просто не мыслят свое существование без защитных пакетов от
разных производителей, свободно пропускающих заразу, но вызывающих
жуткие тормоза и целый ворох конфликтов, вплоть до выпадения в 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) и смотрим, в каких ветвях
нуждается программа. Маленький подводный камень: перенаправить ввод с
клавиатуры на файл, увы, не удастся, и пароль придется каждый раз
вводить вручную, что напрягает. Впрочем, программисты запросто напишут
программу, лишенную этих недостатков. Нам же главное — создать кучу
пользователей, распределив права доступа так, чтобы зловредные
программы не имели никаких шансов ни для размножения, ни для шпионской
деятельности.
Заключение
Создание защищенной системы без использования антивирусов — это
реально! Пускай на первоначальном этапе нам придется проделать большой
объем работы и очень много думать головой, создавая столько
пользователей, чтобы полностью изолировать одно потенциально опасное
приложение от всех остальных. Зато будешь знать наверняка, что, работая
на твоей любимой машине, домашние ничего плохого с ней сделать не
смогут.
Другие материалы по теме
|