av-test-drive

защищенная ось без антивирусов и тормозов

крис касперски ака nezumiakasourizakaelratonakalaoshuaka толстый нутряк

некоторые воспринимают антивирус как неотъемлемую часть операционной системы и просто не мыслят свое существование без кучи защитных пакетов от разных производителей, свободно пропускающих заразу, но вызывающих жуткие тормоза и целый ворох конфликтов, вплоть до выпадения в BSOD. самый лучший антивирус — это сама ось! нужно только научиться правильно ею пользоваться!

Windows NT (и все производные от нее системы — W2K, XP, и частично Longhorn) изначально проектировалась как защищенная оси, способные постоять за себя и дать вирусам решительный отпор без каких-либо дополнительных средств, в том числе и широко разрекламированного MicrosoftAnti-Spy-Ware. Но, чтобы не увязнуть в терминах, прежде чем продолжить повествование, необходимо уточить ряд определений.

av-test-drive_image_0.jpg

Рисунок 1 твоя операционная система — это твоя крепость, а всякие там антивирусы идут лесом

Условимся называть вирусами саморазмножающийся программы, паразитирующие на исполняемых файлах, динамических библиотеках, драйверах и других объектах подобного рода. Эпоха вирусов закончилась вместе с крушением MS-DOS. Сеть тогда только зарождалась и единственным средством добычи свежих программ были дискеты товарища, отдельные счастливчики имели доступ к FIDO и BBS. Все это создавало крайне напряженную обстановку с эпидемиологической точки зрения. Копировать программы друг у друга — все равно что ширяться из одного шприца. Немногие помнят то светлое время, когда вирусов было всего семь, а антивирус годичной давности считался вполне свежим и актуальным. Фактически, основными носителями вирусов были люди, а не файлы, поэтому масштабы эпидемии определялись исключительно интенсивностью копирования программ.

С появлением Сети, пользователи перешли на централизованную скачку дистрибутивов с официальных серверов, а вирусам для размножения перестали требоваться люди. Используя дыры в подсистемах безопасности и ошибки типа переполнения буфера, любой вирус буквально за несколько часов может заразить практически все уязвимые узлы, при этом ему совершенно необязательно внедряться в исполняемые объекты. Зачем привлекать к себе лишнее внимание, когда можно ограничиться временным проживанием в оперативной памяти. Если заражен хотя бы 1% всех машин в сети, то вирус, умирая при перезагрузке, через незаткнутые дыры будет возвращаться вновь и вновь, ведя кочевой образ жизни. Такие вирусы принято называть червями и это один из наиболее распространенных типов компьютерной заразы на сегодняшний день.

Еще существуют «психологические» вирусы, представляющие обыкновенные исполняемые файлы и распространяющийся через вложения электронной почты, ICQ, в меньшей степени web и ftp. Свою историю они ведут от «крякеров Интернета», завлекающих бесплатным доступом в Сеть, а на самом деле форматирующим жесткий диск. Этот подкласс заразы назвали Троянскими Конями. Сейчас же времена первобытного варварства остались позади и большинство троянов не уничтожают информацию, поскольку это сделает их пребывание слишком заметным, а скрыто устанавливает шпионскую закладку, похищающую пароли, содержимое электронных кошельков или позволяющую управлять компьютером по сети — такие компьютеры называются зомби или дронами. Собрав огромную армию дронов, хакер может совершать распределенные атаки и делать кучу других антисоциальных вещей, например, рассылать спам.

av-test-drive_image_1.jpg

Рисунок 2 вирусы — такие колючие и разные!

Антивирусы в настоящее время практически полностью утратили былую значимость и усиленно пытаются отойти от пропасти на дне которой они находятся. Вирусы, заражающие исполняемые файлы, за последние несколько лет фактически перевелись, к тому же запретить запись в исполняемые файлами средствами операционной системы намного проще, дешевле, быстрее и надежнее, чем устанавливать антивирусный пакет. И уж совсем бессмысленно пытаться лечить зараженные объекты, ведь в любой момент их можно переустановить с дистрибутивной копии, хранящейся на CD-R/RW или скаченной их Сети. Но автономный сканер — это еще туда-сюда. Лично я примерно раз в год скачиваю демонстрационную версию какого-нибудь антивируса и проверяю свое хозяйство на предмет: «а вдруг?» Впрочем, до сих пор все было чисто и никаких «авдругов» со мной не случалось.

Антивирусный монитор, следящий за всеми создаваемыми/открываемыми файлами, и проверяющий их «на лету» это дополнительные тормоза (под час _очень_ значительные), конфликты, критические ошибки, голубые экраны смерти и прочий ничем неоправданный геморрой. Вся проблема в том, что антивирус может ловить только те вирусы, о которых знает, а вирусы сейчас пишут все кому не лень, так что даже при экстраординарной степени оперативности, никакой гарантии, что вся зараза будет распознана, у нас нет. Больше того! Вирус, упакованный слегка подправленной версий крутого протектора, имеет 100% шансы остаться незамеченным! Сложные протекторы уже не распаковываются на эмуляторе ЦП (так же называемом виртуальной машиной) и для их снятия требуется статических распаковщик, входящий в «движок» антивирусной базы и справляющийся только со строго конкретными версиями протекторов и очень болезненно относящийся даже к незначительным изменениям структуры упакованного файла. Да что там структура! Обычно бывает достаточно внедрить в точку входа jump на инструкцию неизвестную эмулятору (например, что-нибудь из набора SSE/SSE2) и антивирус идет лесом, поскольку переменная длинна x86 инструкций не позволяет ему определить начало следующей машинной команды!

av-test-drive_image_2.jpg

Рисунок 3 голубой экран смерти, вызванный антивирусным монитором

Реально, антивирусы могут отлавливать только не модифицированные версии Троянских Коней, да и то с оговорками. Просто смешно видеть, как на какой-нибудь файлопомойке типа www.download.ru пишут: «все программы проверены последними версиями антивирусов X и Y». Вы либо доверяете своему поставщику, либо нет. Как нельзя быть чуть-чуть беременной, так и нельзя доверять наполовину. Если разработчик (или дистрибьютор) задастся целью внедрить закладку — будьте уверены, он внедрит ее так, что никакой антивирус не поможет. Запускайте программы, полученные только из надежных источников, и только с минимально необходимым уровнем привилегий. Криво спроектированная программа, запущенная с администраторскими привилегиями, способна уронить всю систему так, что «ремонт» последней (в плане времени) обойдется дороже полной переустановки, но… никакого отношения к вирусам такая программа не имеет, поэтому антивирус скромно пропускает ее между ног, а вот правильно настроенная ось способна предотвратить свое обрушение, причем совершенно бесплатно и без тормозов!

Что же касается червей (и, в частности, нашумевшего MS BLAST, известного так же под кличкой Love San), то это вообще песня. Удаляют его антивирусы, не удаляют — что толку? Пока есть дыра, он словно феникс из пепла будет появляться вновь и вновь. К тому же всегда существует вероятность, что кто-то умный напишет свой собственный shell-код, не имеющий с MS BLAST'ом ничего общего, а потому и не детектируемый _никаким_ антивирусом! Некоторые дыры можно закрыть брандмауэром, но в общем случае, для этого необходимо установить заплатку от производителя уязвимого продукта, которым может быть как сама ось, так и один из ее компонентов: IE, FireFox и т. д.

Еще существует такой тип антивирусов как ревизоры, в задачу которых входит проверка целостности существующих файлов и контроль за вновь созданными. Некоторые ревизоры так же контролируют и реестр, особенно ветки, прямо или косвенно ответственные за автоматический запуск программ. Во времена MS-DOS это была очень хорошая штука, но сейчас… винчестеры так разжирели, что процедура сканирования отнимает кучу времени (а если работает в фоне, то это уже тормоза), к тому же многие сканеры содержат ошибки, позволяющие заразить файл без изменения его контрольной суммы (см. статью «как подделывают CRC16/32», опубликованную в хакере), не говоря уже о том, что при правильная политика разграничения доступа сводит актуальность сканеров на нет, тем более, что начиная с W2K система сама контролирует целостность жизненно-важных файлов через механизм SFC. Ну вот, сейчас кто-то скажет, что SFC легко обмануть, там ведь и сканер обмануть ничуть не сложнее, особенно если вирус стелсируется на уровне ядра или вообще не внедряется ни в какие объекты файловой системы, существуя лишь в виртуальной памяти какого-нибудь процесса.

Контроль за целостностью виртуальной памяти процессоров берут на себя как антивирусы, так и персональные брандмауэры, распознающие и отсекающие все известные способы внедрения в чужое адресное пространство, да вот только… работает этот механизм кое-как. Зловредному коду, запущенному с пониженными привилегиями, доступ к чужим процессам можно запретить средствами самой операционной системы, а код, запущенный с правами администратора, пройдет сквозь все уровни защиты, как нож сквозь масло (при условии, что его писал не пионер, а хотя бы комсомолец). Самое неприятное, что существует множество легальных программ, например, мультимедийных клавиатур и мышей, использующих внедрение в чужое адресное пространство для реализации своих мультимедийных возможностей, поэтому, слепой запрет брандмауэра/антивируса приведет к их неработоспособности! Значит, необходимо предоставить пользователю возможность выбора. А сможет ли он отличить честную программу от нечестной? Но даже не это самое страшное. Чем глубже внедряется брандмауэр/антивирус в систему, тем сложнее зловредному коду его обойти, но и тем больше конфликтов и глюков он (брандмауэр/антивирус) вызывает.

Получается так, что грамотно настроенной системе никакой антивирус не нужен, а с безграмотной никакой антивирус все равно не справиться (брандмауэр стоит ставить только затем, чтобы отделить домашнюю локальную сеть от Интернет и следить за сетевой активностью установленных программ, выявляя не только шпионов, но и легальные программы, пытающиеся проверить корректность регистрации).

Эвристика это одно из многих buzzwords конца XX — начала XXI века, то есть ученое или специальное словечко, способное произвести впечатление на непосвящённого. Это усилительное (часто бессмысленное) слово, используемое в профессиональном жаргоне для придания продукту тех черт, которыми он не обладает, или обладает, но совсем не в той мере.

Идея эвристики уходит корнями в эпоху ранней юности MS-DOS и в общих чертах сводится к выявлению признаков, часто встречающихся в вирусах, но практически никогда — в легальных программах. Тогда это было легко! Код вируса писался на чистом ассемблере и укладывался в линейную структуру, которую легко «переваривал» эмулятор, распознающий ряд заложенных в него шаблонов. Например, если функция FindFist вызывалась с маской *.comили *.exe, это давало основание предположить, что мы имеем дело с программой внедряющейся в исполняемые файлы. Но стоило зашифровать маску, использовать самомодифицирующийся код или другие хитрые приемы, как эвристик шел лесом. Шаблонный поиск уже не работал, а на полный анализ не хватало вычислительной мощности и хотя существовали эвристики, срабатывающие в 90% случаев (реальных 90%, а не «макетоидных»), большого распространения они не получили, поскольку требовали огромного времени на анализ, а пользователь он, как известно, ждать не любит.

Сейчас вычислительные мощности многократно возросли, но вместе с ними возросла и сложность вирусов. На место ассемблера пришли языки высокого уровня, линейный код распался и вирус превратился в запутанный клубок функций, взаимодействующих друг с другом самым невероятным образом. Сравните структуру вируса Boot/Brain.A, написанного в далеком 1984 году с червем W32/Bagle.AG@mm, созданным десять лет спустя — в 2004.

Рисунок 4 структура вируса Boot/Brain.A, написанного в 1984 году

av-test-drive_image_4.jpg

Рисунок 5 структура червя W32/Bagle.AG, написанного в 2004 году

Даже если антивирусу удастся побороть упаковщик и передать эвристику распакованный код… никаких вирусных признаков ему все равно там ни за что не обнаружить, ну разве что это будет совсем пионерский вирус. Наличие незашифрованных текстовых строк с ключами реестра, ответственными за автозапуск, имен исполняемых файлов антивирусных программ, команд в стиле «rm -rf /» с высокой степенью указывает на зловредную программу, но… их очень легко зашифровать.

Еще эвристик может анализировать таблицу импорта и аргументы, переедаемые функции GetProcAddress, и, если там встретиться WriteProcessMemory, VirtualAllocEx, CreateRemoteThread или что-то еще в этом роде, антивирус сделает вывод, что имеет дело с программой, способной внедряться в другие процессы — верный признак червей и… отладчиков. Причем, черви сплошь и рядом используют свою собственную реализацию GetProcAddress, принимающую не имя функции, а ее хэш!

Что касается классических вирусов, внедряющихся в исполняемые файлы, эвристик может проанализировать адрес точки входа, проверив, не указывает ли он в последнюю секцию файла или в PE-заголовок и если да, то забить тревогу. Но это всего лишь два способа внедрения из… очень многих! В моей книге («компьютерные вирусы снаружи и изнутри») собрана неплохая коллекция методов внедрения, большинство из которых с точки зрения антивируса вполне законны и визуально ничем не отличаются от нормальных программ.

Ситуация осложняется тем, что многие вирусные приемы сейчас активно используются протекторами и если эвристик не утихомирить, он отправит в топку добрую половину легальных программ, чего допускать ни в коем случае нельзя!

Конечно, иногда эвристик все-таки срабатывает (особенно в свете того, что все больше и больше вирусов пишутся пионерами, научившимся программировать раньше, чем читать), но возлагать на него какие-то надежды — это все равно, что пытаться обыграть казино. Если создатель вируса не лось, он многократно прогоняет его через различные эвристики, добиваясь их полной и безоговорочной капитуляции. В смысле молчания.

Кстати говоря, еще во времена MS-DOS мыщъх носился с идей антивируса, распознающего не вирусы, а… легальные программы! Уже тогда количество существующих вирусов и их модификаций на несколько порядков (не двоичных!) превысило число популярных программ! В антивирусной базе содержатся контрольные суммы легальных программ, рассчитанные по алгоритму MD5, который очень сложно подделать, в результате чего факт заражения распознается влет независимо от алгоритма внедрения, а все неизвестные антивирусы программы попадают в категорию потенциально зараженных. При тесной кооперации разработчиков ПО с антивирусными компаниями, «потенциально зараженных» программ будет немного и это (в основном) будет программы, написанные на коленке неизвестно кем и неизвестно как. Ошибки, допущенные при их создании, зачастую несут ничуть не меньший ущерб чем вирусы. Забавно, но к этой идеи антивирусная индустрия начала подходить только сейчас, предлагая услуги по сертификации ПО, однако, сама сертификация — чисто формальная процедура и даже если цифровую подпись напрямую подделать нельзя (криптография не велит), можно подкупить (ввести в заблуждение) выдающего его человека, то есть круг замыкается.

Никакие, даже самые совершенные антивирусы ни от чего не спасают! При этом они стоят немалых денег, пожирают сетевой трафик частыми обновлениями, вызывают конфликты и тормозят работу системы, между тем система вполне может справиться с вирусами и сама — никакие дополнительные костыли ей не нужны!

Я сейчас скажу кое-что, но только если вы пообещаете, что не будете кидать в меня камни. Ага, это вы сейчас говорите, что не будете…. ну да ладно, мне уже все равно. Короче, в отличии от, например, BSD, Windows NT _не_ является многопользовательской операционной системой, поскольку только один пользователь может работать с компьютером в любой момент времени и, прежде чем переключиться на другого, необходимо завершить текущий сеанс, закрыв все приложения и лишь потом… А вот в BSD все очень просто: нажал Alt-F# и переключился на соседнюю консоль и все! В Windows XP наконец-то появилась возможность переключения сеансов разных пользователей без завершения, но… механизма взаимодействия между пользователи как не было, так и нет. Да и неудобно это все равно…

Правда, в текущем сеансе можно запускать программы от имени другого пользователя, но это во-первых, совсем не то, а, во-вторых, далеко не все программы соглашаются на такой запуск, и еще меньше из них сохраняют свою работоспособность в полном объеме. Так что без бубна здесь не обойтись. Если нет бубна, на худой конец сойдет и обычный оцинкованный таз.

Идея противостояния вирусам в общих чертах заключается в выборе правильной политики разграничения доступа, тогда вирус (или другая зловредная программа) просто не сможет напакостить и нанести сколь ни будь значительный урон. А для этого все потенциально опасные программы нужно запускать в своеобразной песочнице. В идеале — на виртуальной машине типа VM Ware, однако, про VM Ware мы уже неоднократно писали, а вот про разграничение доступа — материалов практически нет.

Начнем с того, что никогда, ни при каких обстоятельствах не следует постоянно сидеть под «администратором», поскольку при этом любая запущенная программа может делать с системой все, что ей вздумается. Под администратором следует заходить в систему только для выполнения «ремонтных» работ — установки новых драйверов, изменения параметров конфигурации и т. д. А все остальное время проводить под «опытным пользователем» или просто «пользователем» с ограниченным доступом. Чем меньше у вас привилегий, тем меньше их и у каждой запущенной вами программы, однако, под обыкновенным пользователем многие программы работать отказываются, поскольку требуют записи в каталог 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'а останутся только те каталоги, которые ему нужны (как правило, это каталоги самой программы, причем без права записи в исполняемые файлы).

Попробуем запустить в песочнице ну… например, Fire Fox. Создаем ярлык с firefox.exe (если только это не сделал инсталлятор), щелкаем по нему правой клавишей, идем в «свойства» и там взводим галочку «запускать от имени другого пользователя». Говорим «ОК» и запускаем. Появляется грозное диалоговое окно, требующее ввода имени и пароля. Вводим. И… ни хрена Горящий Лис не запускается! Между прочим, в Linux/BSD подобная операция протекает без каких бы то ни было проблем. А здесь нужен бубен или более конкретно — файловый монитор Марка Руссиновича, показывающий на каких именно файловых операциях программа обламывается (вот так, значит, разработчики относятся к сообщениям об ошибках). Качаем файловый монитор: http://www.sysinternals.com/Utilities/Filemon.html (он, кстати, занимает меньше двухсот килобайт и распространяется совершенно бесплатно). Запускаем из-под администратора (создаем ярлык и взводим уже известную нам галочку «запускать от…»), запускаем! В данном случае файловый монитор запускается (потому что запрограммирован правильно) и мы быстрым спортивным шагом идем в Options  Filter/Highlight или нажимаем <CTRL-L>. В появившимся диалоговом окне взводим все галочки, кроме «Log Successes», поскольку мониторить успешные операции нам на хрен не нужно! Нам нужны ошибки! Нажимаем «OK» и перезапускаем программу (фильтр будет действовать только после запуска). Вновь запускаем Горящего Лиса. Что мы видим? Сначала идут ошибки поиска динамических библиотек в тех каталогах, где их нет — ну это нормально. А вот дальше… дальше, Горящий Лис пытается создать папку Mozilla прямо в каталоге WINNT (в ней он хранит свои настройки, кэш страниц и т.д.), куда его, естественно, не пускают и он тихо умирает.

Рисунок 6 файловый монитор показывает на чем обламывается запуск Горящего Лиса

Да… задача. Пробуем утилиту командной строки runas, запустив ее так: «runas /user:sandbox firefox.exe» (при этом firefox.exe должен быть в текущей директории). Нас деловито спрашивают пароль и… Ни хрена! Теперь, Горящий Лис лезет в Document‑n‑Setting\Default User, куда ему доступа так же нет! В чем же дело?! В чем причина?! А в том, что для корректной работы большинства программ необходимо загрузить еще и профиль пользователя, от имени которого мы их запускаем, поэтому правильный вариант выглядит так: «runas /profile /user:sandbox firefox.exe». Теперь запуск проходит без проблем!

А вот Опера хранит кэш не в профиле пользователя, а непосредственно в своем каталоге (впрочем, это зависит от ее настроек), поэтому sandbox'у необходимо присвоить права на запись в «program files\opera».

Остальные программы «распутываются» аналогичным образом. Если не помогает файловый монитор, качаем монитор реестра (http://www.sysinternals.com/Utilities/Regmon.html) и смотрим в каких ветвях нуждается программа. Маленький подводный камень — перенаправить ввод с клавиатуры на файл, увы не удастся и пароль придется каждый раз вводить вручную, что напрягает. Впрочем, программисты запросто напишут программу лишенную этих недостатков. Нам же главное — создать кучу пользователей, распределив правда доступа так, чтобы зловредные программы не имели никаких шансов ни для размножения, ни для шпионской деятельности.

Создание защищенной системы без использования антивирусов — это реально! Пускай, на первоначальном этапе нам придется проделать большой объем работы и очень много думать головой, создавая столько пользователей, чтобы полностью изолировать одно потенциально опасное приложение от всех остальных, но и с другой стороны, не запутаться какой пользователь на что отвечает. Зато какая благодать давать своим домашним играть на вашей машине, зная, что они _ничего_ плохо с ней не смогут сделать, ну разве что очень-очень сильно захотят.

av-test-drive_image_6.jpg

Рисунок 7 после предварительной настройки политики доступа женщинам компьютер тоже можно доверять!