Файл: Debian Таненбаум Бос.pdf

ВУЗ: Не указан

Категория: Книга

Дисциплина: Операционные системы

Добавлен: 29.10.2018

Просмотров: 48114

Скачиваний: 190

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

756  

 Глава 9. Безопасность 

IP-адрес          Порт          Действие
207.68.160.190    80            Принимать
207.68.160.191    25            Принимать
207.68.160.192    21            Принимать
*                 *             Отказать

Эти правила позволяют пакетам проходить на машину 207.68.160.190, но только в том 
случае, если они адресованы порту 80, все остальные порты на этой машине запрещены 
и отправленные им пакеты будут молчаливо отвергаться брандмауэром. Точно так же 
пакеты могут поступать двум другим серверам, если они адресованы портам 25 и 21 
соответственно. Все остальные информационные потоки отвергаются. Эти правила 
затрудняют для атакующего получение любого доступа к локальной сети, за исключе-
нием трех разрешенных общих служб.

Несмотря на брандмауэр, возможность атаковать локальную сеть сохраняется. На-
пример, если в качестве веб-сервера используется программа apache и взломщик об-
наружил в этой программе дефект, которым можно воспользоваться, у него может по-
явиться возможность отправить очень длинный URL-адрес на IP-адрес 207.68.160.190 
на порт 80 и устроить переполнение буфера, одурачивая таким образом одну из машин, 
находящихся под защитой брандмауэра, которая затем может быть использована для 
перехода в атаку на другие машины сети.

Другая потенциальная атака может заключаться в создании и публикации игры с уча-
стием нескольких игроков и выжидании, пока она не получит широкого признания. 
Программе игры нужен какой-нибудь порт для связи с играющими в нее, поэтому 
разработчик игры может выбрать один из портов, скажем, 9876, и предписать игрокам 
внести изменения в настройки их брандмауэров, разрешающие входящие и исходящие 
информационные потоки, идущие через этот порт. Люди, открывшие этот порт, теперь 
являются мишенью для атаки через него, что можно будет без труда организовать, 
особенно если игра содержит троянского коня, воспринимающего определенные 
 команды издалека и просто слепо их выполняющего. Но даже если в игре нет ничего 
незаконного, она может иметь дефекты в виде потенциальных брешей, которыми 
можно воспользоваться. Чем больше портов открыто, тем больше шансов на успешную 
атаку. Каждая брешь повышает вероятность того, что через нее будет проведена атака.

Кроме брандмауэров, не анализирующих состояние, есть еще брандмауэры, анали-
зирующие состояние

 (stateful firewalls), отслеживающие соединения и то состоя-

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

 (Intrusion Detection System (IDS)), в которой брандмауэр проверяет не 

только заголовки пакетов, но и их содержание для поиска подозрительного материала.

Некоторые брандмауэры, которые иногда называют персональными брандмауэрами 
(personal firewalls), делают то же самое, что и аппаратные брандмауэры, но программны-
ми способами. Это фильтры, присоединяемые к сетевому коду внутри ядра операцион-
ной системы и фильтрующие пакеты тем же способом, что и аппаратные брандмауэры.

9.10.2. Антивирусные и антиантивирусные технологии

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


background image

9.10. Средства защиты   

757

Следующую линию обороны составляют программы противодействия вредоносным 
программам, которые часто называют антивирусными (antivirus programs), хотя многие 
из них воюют также с червями и программами-шпионами. Вирусы стараются спря-
таться, а пользователи стараются их отыскать, что приводит к игре в кошки-мышки. 
В этом отношении вирусы похожи на руткиты, за исключением того, что большинство 
создателей вирусов придают особое значение скорости распространения вируса, а не 
игре в прятки в кустах, больше свойственной руткитам. Теперь давайте посмотрим на 
ряд технологий, используемых антивирусным программным обеспечением, и на то, как 
Вирджил, создатель вирусов, отвечает на их применение.

Программы поиска вирусов

Понятно, что среднестатистический пользователь не собирается заниматься поиском 
множества вирусов, которые прилагают все усилия, чтобы спрятаться от него, поэтому 
на рынке появилось антивирусное программное обеспечение. Далее мы рассмотрим, 
как это программное обеспечение работает. У антивирусных компаний имеются лабо-
ратории, в которых долгими часами преданные своему делу специалисты отслеживают 
новые вирусы и разбираются в их устройстве. Первая стадия заключается в заражении 
ничего не делающей программы, файл которой часто называют козлом отпущения 
(goat file), чтобы получить копию вируса в его самом чистом виде. Следующая стадия 
заключается в получении точной распечатки кода вируса и вводе ее в базу данных из-
вестных вирусов. Компании соревнуются, у кого размер базы данных больше. При этом 
изобретение новых вирусов только для того, чтобы накачать ими свою базу данных, 
считается неспортивным поведением.

Как только антивирусная программа установлена на клиентской машине, она прежде 
всего сканирует на диске каждый исполняемый файл в поиске вирусов, известных по 
ее базе данных. У многих антивирусных компаний есть веб-сайт, с которого клиенты 
могут скачать описания недавно обнаруженных вирусов в свои базы данных. Если 
у пользователя 10 000 файлов и база данных содержит сведения о 10 000 вирусов, то, 
конечно же, для быстрой работы требуется создать толковую программу.

Поскольку постоянно возникают не особо отличающиеся друг от друга разновидности 
известных вирусов, необходим нечеткий поиск, гарантирующий, что определению 
вируса не помешают какие-то трехбайтовые изменения. Но нечеткий поиск не только 
медленнее четкого, он может также поднять ложную тревогу (выдав ошибочный ре-
зультат), то есть выдать предупреждение о том, что вполне нормальный файл содержит 
некий код, частично похожий на вирус, обнаруженный в Пакистане семь лет назад. Как 
вы думаете, что сделает пользователь, получив следующее сообщение: «Внимание! 
В файле xyz.exe может содержаться вирус lahore-9x. Удалить?».

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

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


background image

758  

 Глава 9. Безопасность 

но часто. Поскольку сканирование ведется медленно, эффективнее будет проверять 
только те файлы, которые изменились с даты последнего сканирования. Проблема 
в том, что наиболее изощренные вирусы будут перенастраивать дату последнего из-
менения зараженного файла на ее исходное значение, чтобы избежать обнаружения. 
Антивирусные программы в ответ на это должны проверять дату последнего изменения 
каталога, в котором находится этот файл. Вирус отвечает на это перестановкой даты 
и этого каталога. С этого и начинается вышеупомянутая игра в кошки-мышки.

Другим способом обнаружения антивирусной программой зараженного файла является 
запись и сохранение на диске длины всех файлов. Если файл стал длиннее со времени 
последней проверки, то он может быть заражен. Эта ситуация показана на рис. 9.28, а 
и б. Но хорошо продуманный вирус может избежать обнаружения, сжимая программу 
и приводя файл к его исходному размеру. Чтобы эта схема работала, вирус должен со-
держать процедуры сжатия и распаковки, показанные на (рис. 9.28, в). Другой способ, 
позволяющий вирусу избежать обнаружения, заключается в изменении его внешнего 
вида на диске, чтобы он не был похож на имеющийся в базе данных. Один из путей до-
стижения этой цели — самошифрование с разными ключами для каждого зараженного 
файла. Перед изготовлением новой копии вирус генерирует случайный 32-разрядный 
ключ шифрования, к примеру, применяя операцию исключающего ИЛИ (XOR) к по-
казаниям текущего времени с содержимым, скажем, слов памяти по адресам 72 008 
и 319 992. Затем он проводит пословную операцию XOR над своим кодом, применяя 
этот ключ для получения зашифрованного вируса, хранящегося в зараженном файле 
(рис. 9.28, г). Этот ключ хранится в файле. С точки зрения секретности хранение ключа 
в файле не является идеальным решением, но здесь ставится цель помешать работе ска-
нера вирусов, а не препятствовать специалистам антивирусной лаборатории получить 
код вируса путем обратной операции. Разумеется, чтобы запуститься, вирус сначала 
должен сам себя расшифровать, поэтому ему нужно, чтобы в файле присутствовала 
и функция дешифрования.

Эта схема еще далека от совершенства, поскольку во всех копиях будут присутствовать 
аналогичные процедуры сжатия, распаковки, шифрования, расшифровки и антивирус-

Рис. 9.28. Программа: а — незараженная; б — зараженная; в — сжатая зараженная; 

г — зашифрованный вирус; д — зашифрованный вирус с зашифрованным кодом сжатия


background image

9.10. Средства защиты   

759

ная программа может просто воспользоваться ими в качестве сигнатуры, по которой 
сканируется вирус. Скрыть процедуры сжатия, распаковки и шифрования нетрудно: 
они просто зашифровываются вместе со всем остальным вирусом (рис. 9.28, д). Но код 
расшифровки зашифрован быть не может. Он должен исполняться непосредственно 
на оборудовании, чтобы расшифровать остальную часть вируса, поэтому должен быть 
представлен в незашифрованном виде. Антивирусным программам это известно, по-
этому они охотятся за процедурой расшифровывания.

Но последнее слово за Вирджилом, поэтому он делает следующее. Предположим, что 
процедуре расшифровки необходимо произвести вычисление

X = (A + B + C − 4).

Простой ассемблерный код этого вычисления для обычного двухадресного компью-
тера показан на рис. 9.29, а. Первый адрес — источник, второй — получатель, поэтому 
команда MOV A, R1 помещает значение переменной A в регистр R1. Код на рис. 9.29, б 
делает то же самое, но менее эффективным способом, используя пустую команду NOP 
(no operation) в качестве вкраплений в реальный код.

Но это еще не все. Можно также изменить внешний вид кода расшифровки. Существу-
ет множество пустых команд: к примеру, добавление нуля к содержимому регистра, 
проведение операции ИЛИ над своим собственным содержимым, сдвиг влево на нуль 
разрядов, а также переход на следующую команду. Программа на рис. 9.29, в работает 
точно так же, как программа на рис. 9.29, а. При копировании самого себя вирус может 
вместо программы, показанной на рис. 9.29, а, воспользоваться программой, показанной 
на рис. 9.29, в, сохраняя в дальнейшем свою работоспособность. Вирус, мутирующий 
от копии к копии, называется полиморфным вирусом (polymorphic virus).

Теперь предположим, что регистр R5 в этом фрагменте программы совершенно не ну-
жен. Тогда код, приведенный на рис. 9.29, г, также эквивалентен коду, показанному на 
рис. 9.29, а. И наконец, во многих случаях можно переставить команды без изменения 
работоспособности программы. Таким образом, получается, что код, показанный на 
рис. 9.29, д, — еще один фрагмент кода, логически эквивалентный коду на рис. 9.29, а
Фрагмент кода, способный видоизменять последовательности машинных команд без 
изменения их функциональности, называется мутационным механизмом (mutation 
engine), он содержится в изощренных вирусах для видоизменения процедуры рас-
шифровки от копии к копии. Мутации могут состоять из вставок бесполезного, но 
безопасного кода, перестановки команд, обмена содержимого регистров и замены 
команд на их эквиваленты. Сам мутационный механизм может быть спрятан за счет 
шифрования его вместе с телом вируса.

Рис. 9.29. Примеры полиморфного вируса


background image

760  

 Глава 9. Безопасность 

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

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

До сих пор рассматривалась лишь попытка распознать присутствие вирусов в зара-
женных исполняемых файлах. Кроме этого антивирусный сканер проверяет главную 
загрузочную запись, загрузочные секторы, список сбойных блоков, флеш-память, 
CMOS-память и т. д., но что, если в памяти уже находится резидентный вирус? Он 
не будет обнаружен. Хуже того, представьте себе работающий вирус, отслеживающий 
все системные вызовы. Он запросто может обнаружить антивирусную программу, 
считывающую загрузочный сектор (для проверки на вирусы). Чтобы помешать анти-
вирусной программе, вирус не осуществляет системный вызов. Вместо этого он просто 
возвращает настоящий загрузочный сектор, извлеченный из укромного места в списке 
сбойных блоков. Он также помечает себе на будущее, что нужно снова заразить все 
файлы, уже обработанные сканером вирусов.

Чтобы не быть обманутой вирусом, антивирусная программа может читать с диска, 
обращаясь непосредственно к оборудованию в обход операционной системы. Но по-
требуются встроенные драйверы для устройств с интерфейсами SATA, USB, SCSI 
и для дисков других распространенных стандартов, которые снизят переносимость 
антивирусной программы и приведут к ее отказу на компьютерах, оборудованных 
дисками с редкими стандартами. Более того, если обойти операционную систему при 
чтении загрузочного сектора еще можно, то обойти ее при чтении всех исполняемых 
файлов нельзя, существует также опасность, что вирусы могут выдавать недостоверные 
сведения об исполняемых файлах.

Программы проверки целостности файлов

Совершенно другой подход к обнаружению вирусов заключается в проверке целост-
ности

 (integrity checking). Антивирусная программа, работающая таким образом, 

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