Windows NT (и все производные от нее системы - Windows 2000, 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 это была очень хорошая штука, но сейчас винчестеры так разжирели, что процедура сканирования отнимает кучу времени, к тому же многие сканеры содержат ошибки, позволяющие заразить файл без изменения его контрольной суммы, не говоря уже о том, что при правильной политике разграничения доступа сводит актуальность сканеров на нет, тем более, начиная с Windows 2000, система сама контролирует целостность жизненно-важных файлов через механизм SFC. Ну вот, сейчас кто-то скажет, что SFC легко обмануть, особенно если вирус стелсируется на уровне ядра или вообще не внедряется ни в какие объекты файловой системы, существуя лишь в виртуальной памяти какого-нибудь процесса.
Контроль над целостностью виртуальной памяти процессоров берут на себя как антивирусы, так и персональные брандмауэры, распознающие и отсекающие все известные способы внедрения в чужое адресное пространство, да вот только работает этот механизм кое-как. Зловредному коду, запущенному с пониженными привилегиями, доступ к чужим процессам можно запретить средствами самой операционной системы, а код, запущенный с правами администратора, пройдет сквозь все уровни защиты, как нож сквозь масло (при условии, что его писал не пионер, а хотя бы комсомолец). Самое неприятное, что существует множество легальных программ, например, мультимедийных клавиатур и мышей, использующих внедрение в чужое адресное пространство для реализации своих мультимедийных возможностей, поэтому слепой запрет брандмауэра/антивируса приведет к их неработоспособности! Значит, необходимо предоставить пользователю возможность выбора. А сможет ли он отличить честную программу от нечестной? Но даже не это самое страшное. Чем глубже внедряется брандмауэр/антивирус в систему, тем сложнее зловредному коду его обойти, но и тем больше конфликтов и глюков он (брандмауэр/антивирус) вызывает.
Получается так, что грамотно настроенной системе никакой антивирус не нужен, а с безграмотной никакой антивирус все равно не справится (брандмауэр стоит ставить только затем, чтобы отделить домашнюю локальную сеть от интернета и следить за сетевой активностью установленных программ, выявляя не только шпионов, но и легальные программы, пытающиеся проверить корректность регистрации).
Никакие, даже самые совершенные антивирусы ни от чего не спасают! При этом они стоят немалых денег, пожирают сетевой трафик частыми обновлениями, вызывают конфликты и тормозят работу системы, между тем система вполне может справиться с вирусами и сама - никакие дополнительные костыли ей не нужны!
Разграничение доступа - отличная защита от вирусов.
В отличие, например, от BSD, Windows NT не является многопользовательской операционной системой, поскольку только один пользователь может работать с компьютером в любой момент времени, и прежде чем переключиться на другого, необходимо завершить текущий сеанс, закрыв все приложения, и лишь потом… А вот в BSD все очень просто: нажал Alt-F#, переключился на соседнюю консоль - и все! В Windows XP наконец-то появилась возможность переключения сеансов разных пользователей без завершения, но механизма взаимодействия между пользователями как не было, так и нет.
Правда, в текущем сеансе можно запускать программы от имени другого пользователя, но это, во-первых, совсем не то, а во-вторых, далеко не все программы соглашаются на такой запуск, и еще меньше из них сохраняют свою работоспособность в полном объеме. Так что без бубна здесь не обойтись. Если нет бубна, то сойдет и обычный оцинкованный таз.
Идея противостояния вирусам заключается в выборе правильной политики разграничения доступа, тогда вирус (или другая зловредная программа) просто не сможет напакостить и нанести значительный урон. А для этого все потенциально опасные программы нужно запускать в своеобразной песочнице. В идеале - на виртуальной машине типа VMware.
Начнем с того, что никогда, ни при каких обстоятельствах не следует постоянно сидеть под "администратором", поскольку любая запущенная программа может делать с системой все, что ей вздумается. Под администратором следует заходить в систему только для выполнения "ремонтных" работ - установки новых драйверов, изменения параметров конфигурации и т.д. А все остальное время проводить под "опытным пользователем" или просто "пользователем" с ограниченным доступом. Чем меньше у вас привилегий, тем меньше их и у каждой запущенной вами программы, однако под обыкновенным пользователем многие программы работать отказываются, поскольку требуют записи в каталог Program Files или в другие "злачные" места. Зато потом наступает тишь да гладь - ни вирусов, ни другого малваре.
Необходимость в периодическом резервировании, естественно, до сих пор существует. Надежнее всего резервироваться на CD-R/RW, DVD-RW, ZIP, стримеры и прочие внешние носители информации, однако это непроизводительно, неудобно, да и надежность у винчестеров все же повыше будет, чем у того же CD-RW. Поступим так. Создадим нового пользователя с администраторскими правами (Пуск -> Панель Управления -> пользователи и пароли -> Имя -> Пароль -> Другой -> Администраторы), назовем его, к примеру, "backup", зайдем под его именем в систему, создадим каталог general-stores (то есть общее хранилище) и скопируем туда все, что необходимо. Затем, щелкнув по каталогу правой кнопкой мыши, в появившемся контекстом меню выбираем вкладку "свойства", а там - "безопасность" со списком допущенных лиц. По умолчанию каталог доступен для всех, что никак не входит в наши планы, поэтому удаляем "всех" напрочь, предварительно сбросив галочку "переносить наследуемые от родительского объекта разрешения на этот объект". Все!!!
Теперь этот каталог недоступен никому, даже системе! И только владелец, создавший его (то есть "backup"), может войти в раздел "безопасность" и вернуть "всех" на место. Внимание! Администратор не сможет этого сделать! Ну вообще-то, чтобы так не извращаться, после удаления "всех" можно добавить пользователя "backup", делегировав ему полный доступ к каталогу. Все же остальные пользователи, включая членов группы, добраться до этого каталога не смогут. Хорошая защита от вирусов и прочих деструктивных программ, неправда ли? Кстати говоря, задумаемся, а что произойдет, если случайно (преднамеренно) удалить пользователя "backup"? Ведь тогда доступ к архиву не сможет получить никто! К счастью, штатная утилита chkdsk распознает такую ситуацию, и, если видит подобный каталог-зомби, она автоматически возвращает "всех", воскрешая информацию из небытия.
Нюансы при создании "песочницы".
Нашей следующей задачей будет постройка "песочницы" для всех тех программ, что могут быть атакованы из сети, к числу которых принадлежит Internet Explorer, FireFox, Outlook Express, The Bat, ICQ и другие. Каждая из них должна быть запущена из-под ограниченного пользователя, не имеющего доступа ни к каким каталогам, кроме тех, которые явно нужны самой программе. В принципе, можно завести одного ограниченного пользователя на всех, обозвав его, к примеру, "sandbox" (то есть песочница), однако в этом случае червь, пробравшийся через Internet Explorer, сможет разрушить почтовую базу, накопленную за многие годы, что будет обидно. Поэтому лучше всего дать каждой программе по пользователю (конечно, это увеличивает потребности системы в памяти, но не столь радикально).
Итак, создан ограниченный пользователь "sandbox", в свойствах "безопасности" каждого каталогов (или всех дисков целиков) "sandbox" добавлен, и доступ ему запрещен (политика запрета имеет приоритет над политикой разрешений, поэтому удалять "всех" совершенно не обязательно). По завершению этой нехитрой операции у sandbox'а останутся только те каталоги, которые ему нужны (как правило, это каталоги самой программы, причем без права записи в исполняемые файлы).
Попробуем запустить в песочнице, например, FireFox. Создаем ярлык с firefox.exe (если только это не сделал инсталлятор), щелкаем по нему правой клавишей, идем в "свойства", затем - в "дополнительно" и там взводим галочку "запускать от имени другого пользователя". Выбираем пользователя "sandbox" (или конкретного, которого мы создали для FireFox), говорим "ОК" и запускаем. Появляется грозное диалоговое окно, требующее ввода имени и пароля. Вводим. И… FireFox не запускается! Между прочим, в Linux/BSD подобная операция протекает без каких бы то ни было проблем. А здесь нужен бубен или более конкретно - файловый монитор, показывающий, на каких именно файловых операциях программа обламывается (вот так, значит, разработчики относятся к сообщениям об ошибках). Скачиваем файловый монитор (он, кстати, занимает меньше трехсот килобайт и распространяется совершенно бесплатно). Запускаем из-под администратора: создаем ярлык и взводим уже известную нам галочку "запускать от…"! В данном случае файловый монитор запускается, потому что запрограммирован правильно, и мы быстрым спортивным шагом идем в Options -> Filter/Highlight или нажимаем . В появившемся диалоговом окне взводим все галочки, кроме "Log Successes", поскольку мониторить успешные операции нам незачем! Нам нужны ошибки! Нажимаем "OK" и перезапускаем программу (фильтр будет действовать только после запуска). Вновь запускаем FireFox. Что мы видим? Сначала идут ошибки поиска динамических библиотек в тех каталогах, где их нет — это нормально. А вот дальше FireFox пытается создать папку Mozilla прямо в каталоге WINNT (в ней он хранит свои настройки, кэш страниц и т.д.), куда его, естественно, не пускают, и он тихо умирает.
Да… задача. Пробуем утилиту командной строки runas, запустив ее так: "runas /user:sandbox firefox.exe" (при этом firefox.exe должен быть в текущей директории). Нас деловито спрашивают пароль и… ничего! Теперь FireFox лезет в "Document and Setting\Default User", куда ему также нет доступа! В чем же дело?! В чем причина?! А в том, что для корректной работы большинства программ необходимо загрузить еще и профиль пользователя, от имени которого мы их запускаем, поэтому правильный вариант выглядит так: "runas /profile /user:sandbox firefox.exe". Теперь запуск проходит без проблем!
Описанная ситуация происходит в Windows 2000, в Windows XP (и далее), или с более поздними версиями ПО, она вполне возможно и не проявит себя, но для того, чтобы Вы знали как её обойти (в случае возникновения), она и была описана. Вот Opera хранит кэш не в профиле пользователя, а непосредственно в своем каталоге (впрочем, это зависит от настроек), поэтому sandbox'у необходимо присвоить права на запись в "program files\opera".
Остальные программы "распутываются" аналогичным образом. Если не помогает файловый монитор, то качаем монитор реестра и смотрим, в каких ветвях нуждается программа. Маленький подводный камень: перенаправить ввод с клавиатуры на файл, увы, не удастся, и пароль придется каждый раз вводить вручную, что напрягает. Впрочем, программисты запросто напишут программу, лишенную этих недостатков. Нам же главное - создать кучу пользователей, распределив права доступа так, чтобы зловредные программы не имели никаких шансов ни для размножения, ни для шпионской деятельности.
Заключение. Создание защищенной системы без использования антивирусов - это реально! Пускай на первоначальном этапе нам придется проделать большой объем работы и очень много думать головой, создавая столько пользователей, чтобы полностью изолировать одно потенциально опасное приложение от всех остальных. Зато будешь знать наверняка, что, другие работая на твоей любимой машине, к примеру домашние, - ничего плохого с ней сделать не смогут.