Антивирусы — за гранью возможного
Антивирусы в настоящее время практически полностью утратили былую значимость и усиленно пытаются отойти от пропасти на дне которой они находятся. Вирусы, заражающие исполняемые файлы, за последние несколько лет фактически перевелись, к тому же запретить запись в исполняемые файлами средствами операционной системы намного проще, дешевле, быстрее и надежнее, чем устанавливать антивирусный пакет. И уж совсем бессмысленно пытаться лечить зараженные объекты, ведь в любой момент их можно переустановить с дистрибутивной копии, хранящейся на CD-R/RW или скаченной их Сети. Но автономный сканер — это еще туда-сюда. Лично я примерно раз в год скачиваю демонстрационную версию какого-нибудь антивируса и проверяю свое хозяйство на предмет: "а вдруг?" Впрочем, до сих пор все было чисто и никаких "авдругов" со мной не случалось.
Антивирусный монитор, следящий за всеми создаваемыми/открываемыми файлами, и проверяющий их "на лету" это дополнительные тормоза (под час _очень_ значительные), конфликты, критические ошибки, голубые экраны смерти и прочий ничем неоправданный геморрой. Вся проблема в том, что антивирус может ловить только те вирусы, о которых знает, а вирусы сейчас пишут все кому не лень, так что даже при экстраординарной степени оперативности, никакой гарантии, что вся зараза будет распознана, у нас нет. Больше того! Вирус, упакованный слегка подправленной версий крутого протектора, имеет 100% шансы остаться незамеченным! Сложные протекторы уже не распаковываются на эмуляторе ЦП (так же называемом виртуальной машиной) и для их снятия требуется статических распаковщик, входящий в "движок" антивирусной базы и справляющийся только со строго конкретными версиями протекторов и очень болезненно относящийся даже к незначительным изменениям структуры упакованного файла. Да что там структура! Обычно бывает достаточно внедрить в точку входа jump на инструкцию неизвестную эмулятору (например, что-нибудь из набора SSE/SSE2) и антивирус идет лесом, поскольку переменная длинна x86 инструкций не позволяет ему определить начало следующей машинной команды!
Рисунок 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 году
Рисунок 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) и смотрим в каких ветвях нуждается программа. Маленький подводный камень — перенаправить ввод с клавиатуры на файл, увы не удастся и пароль придется каждый раз вводить вручную, что напрягает. Впрочем, программисты запросто напишут программу лишенную этих недостатков. Нам же главное — создать кучу пользователей, распределив правда доступа так, чтобы зловредные программы не имели никаких шансов ни для размножения, ни для шпионской деятельности.
Терминологические войны
Условимся называть вирусами
саморазмножающийся программы, паразитирующие на исполняемых файлах, динамических библиотеках, драйверах и других объектах подобного рода.
Эпоха вирусов закончилась вместе с крушением MS-DOS. Сеть тогда только зарождалась и единственным средством добычи свежих программ были дискеты товарища, отдельные счастливчики имели доступ к FIDO и BBS. Все это создавало крайне напряженную обстановку с эпидемиологической точки зрения. Копировать программы друг у друга— все равно что ширяться из одного шприца. Немногие помнят то светлое время, когда вирусов было всего семь, а антивирус годичной давности считался вполне свежим и актуальным. Фактически, основными носителями вирусов были люди, а не файлы, поэтому масштабы эпидемии определялись исключительно интенсивностью копирования программ.
С появлением Сети, пользователи перешли на централизованную скачку дистрибутивов с официальных серверов, а вирусам для размножения перестали требоваться люди. Используя дыры в подсистемах безопасности и ошибки типа переполнения буфера, любой вирус буквально за несколько часов может заразить практически все уязвимые узлы, при этом ему совершенно необязательно внедряться в исполняемые объекты. Зачем привлекать к себе лишнее внимание, когда можно ограничиться временным проживанием в оперативной памяти. Если заражен хотя бы 1% всех машин в сети, то вирус, умирая при перезагрузке, через незаткнутые дыры будет возвращаться вновь и вновь, ведя кочевой образ жизни. Такие вирусы принято называть червями и это один из наиболее распространенных типов компьютерной заразы на сегодняшний день.
Еще существуют "психологические" вирусы, представляющие обыкновенные исполняемые файлы и распространяющийся через вложения электронной почты, ICQ, в меньшей степени web и ftp. Свою историю они ведут от "крякеров Интернета", завлекающих бесплатным доступом в Сеть, а на самом деле форматирующим жесткий диск. Этот подкласс заразы назвали Троянскими Конями. Сейчас же времена первобытного варварства остались позади и большинство троянов не уничтожают информацию, поскольку это сделает их пребывание слишком заметным, а скрыто устанавливает шпионскую закладку, похищающую пароли, содержимое электронных кошельков или позволяющую управлять компьютером по сети — такие компьютеры называются зомби или дронами. Собрав огромную армию дронов, хакер может совершать распределенные атаки и делать кучу других антисоциальных вещей, например, рассылать спам.
Рисунок 2 вирусы — такие колючие и разные!
и все производные от нее
Windows NT ( и все производные от нее системы — W2K, XP, и частично Longhorn) изначально проектировалась как защищенная оси, способные постоять за себя и дать вирусам решительный отпор без каких-либо дополнительных средств, в том числе и широко разрекламированного Microsoft Anti-Spy-Ware. Но, чтобы не увязнуть в терминах, прежде чем продолжить повествование, необходимо уточить ряд определений.
Рисунок 1 твоя операционная система — это твоя крепость, а всякие там антивирусы идут лесом
Создание защищенной системы без использования
Создание защищенной системы без использования антивирусов — это реально! Пускай, на первоначальном этапе нам придется проделать большой объем работы и очень много думать головой, создавая столько пользователей, чтобы полностью изолировать одно потенциально опасное приложение от всех остальных, но и с другой стороны, не запутаться какой пользователь на что отвечает. Зато какая благодать давать своим домашним играть на вашей машине, зная, что они _ничего_ плохо с ней не смогут сделать, ну разве что очень-очень сильно захотят.
Рисунок 7 после предварительной настройки политики доступа женщинам компьютер тоже можно доверять!
Защищенная ось без антивирусов и тормозов
крис касперски ака nezumi aka souriz aka elraton aka laoshu aka толстый нутряк
некоторые воспринимают антивирус как неотъемлемую часть операционной системы и просто не мыслят свое существование без кучи защитных пакетов от разных производителей, свободно пропускающих заразу, но вызывающих жуткие тормоза и целый ворох конфликтов, вплоть до выпадения в BSOD. самый лучший антивирус — это сама ось! нужно только научиться правильно ею пользоваться!