Опубликован: 26.03.2007 | Уровень: для всех | Доступ: платный
Лекция 2:

Теоретические сведения о компьютерных вирусах

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Аннотация: Когда говорят о компьютерных вирусах, всегда подразумевают некий класс программ, обладающих определенными свойствами. Кроме того, для каждого нового вируса существует некая процедура, согласно которой антивирусные эксперты решают - вирус это или нет, прежде чем вносить его сигнатуру в вирусную базу. В лекции рассмотрены теоретические основы задачи выявления вредоносного кода и приведены доказательства невозможности создания общего алгоритма, который бы позволил однозначно определить является программа зараженной (вирусом) или нет.

Введение

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

В связи с этим возникает вопрос о возможности формализовать эту процедуру выяснения относится ли программа к классу вирусов. Этой проблемой занимались многие исследователи еще с первой половины 80-х годов XX века. И самым первым из них был Фред Коэн.

Результат Фреда Коэна

В 1984 г. в своей работе "Computer Viruses - Theory and Experiments" Фред Коэн показал, что задача обнаружения компьютерных вирусов является неразрешимой. При этом он руководствовался следующими рассуждениями.

Отправной точкой был выбор определения вируса:

Определение 2.1. Компьютерным вирусом является программа, способная заражать другие программы изменяя их таким образом, чтобы они включали возможно измененную копию вируса.

Следовательно, чтобы определить, является ли программа P вирусом, необходимо выяснить заражает ли она другие программы. Предположим, существует процедура D, позволяющая по любой программе P сказать вирус это или нет. Но тогда можно составить программу V, которая будет включать процедуру D и будет заражать другие программы только в том случае, когда D не определит V как вирус и не будет заражать в противном случае.

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

Таким образом, гипотетическая процедура D оказывается противоречивой и, следовательно, не существует.

Результат Д. Чесса и С. Вайта

Основные положения

В работе "An Undetectable Computer Virus" Дэвид Чесс и Стив Вайт попытались развить идеи Коэна и показать, что задача обнаружения вирусов остается неразрешимой и при более слабых допущениях. Этой работой они попытались охватить класс полиморфных вирусов.

Рассмотрим множество программ. Множеством значений каждой из программ является одна или несколько других программ. При каждом выполнении программа производит одну программу из своего множества значений (в зависимости от входных данных). Пусть при этом выполнялась программа p, а результатом ее работы стала программа q. В этом случае будем говорить, что p производит q. Будем также говорить, что p со временем производит q, если p производит q либо непосредственно, либо после конечного числа итераций, когда сперва выполняется программа p, затем ее результат и т. д. Отношение "со временем производит" является транзитивным замыканием отношения "производит".

Определение 2.2. Множество V называется вирусным, если это максимальное множество удовлетворяющее условию:
(\forall p, q \in V)
\text{[p со временем производит q,} \\ \text{ и q со временем производит p]} 
\right.

Максимальность понимается в том смысле, что не существует такой программы r \notin  V, чтобы при ее добавлении к множеству V все еще выполнялось указанное условие.

Далее в рамках изложения условимся отождествлять множество V с компьютерным вирусом. Программа p будет называться экземпляром вируса V или же будет говориться, что она заражена вирусом V, т.к. p \in  V.

Программа p будет называться просто зараженной, если: (V - вирус) [p \in  V].

Будем говорить, что программа p размножается, если она производит новый экземпляр вируса (новый в смысле еще один, а не в смысле отличный от предыдущих).

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

Предложенный формализм соответствует перезаписывающим вирусам, которые заменяют собой другие программы, принимая их имена, либо некоторым видам сетевых червей, которые распространяются создавая свои копии и рассылая их по сетевым каналам. Для описания вирусов в классическом определении Коэна необходимо усложнять модель. Однако основные результаты, которые будут получены ниже, могут быть распространены и на классические "паразитирующие" вирусы.

Обнаружение вирусов

Определение 2.3.

Алгоритм A обнаруживает вирус V для любой программы p: A(p) завершает работу и печатает 1 p \in  V.

Аналогично, алгоритм A обнаруживает множество вирусов S для любой программы p: A(p) завершает работу и печатает 1 p \in  V \in  S

По сути это то же определение обнаружения, что и использованное Ф. Коэном в его дебютной работе.

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

Доказательство этого факта строится по той же схеме, что и доказательство Ф. Коэна. Рассмотрим такой полиморфный вирус, что для любого реализуемого алгоритма X программа p:

  • если X(p), то прекратить работу, иначе размножаться
  • будет являться экземпляром этого вируса (при условии, конечно, что такая программа вообще способна размножаться)

Очевидно, не существует алгоритма B, который был бы способен обнаруживать все экземпляры такого вируса, поскольку для любого алгоритма B, претендующего на роль детектора, существует программа q:

  • если B(q), то прекратить работу, иначе размножаться
  • для которой алгоритм B будет возвращать неверный результат. Действительно, если B(q) возвращает 1, значит q никогда не размножается и не является экземпляром описанного или любого другого вируса. Если же B(q) возвращает 0, тогда q в действительности размножается и является экземпляром вируса.

Возникает вопрос о существовании подобного полиморфного вируса и ответ на этот вопрос положительный. Рассмотрим следующий вирус W одним из экземпляров которого является r:

если Sub1(r), то завершить работу, иначе {
  заменить текст подпрограммы Sub1 текстом произвольной программы;
  размножаться;
  завершить работу;
}
Sub1:
  Вернуть 0;

Для любого алгоритма C, претендующего на обнаружение всех экземпляров вируса W, найдется программа s:

если Sub1(s), то завершить работу, иначе {
  заменить текст подпрограммы Sub1 текстом произвольной программы;
  размножаться;
  завершить работу;
}
Sub1:
  Вернуть С(аргумент);

для которой алгоритм С возвращает ошибочный результат. Если С(s) возвращает 1, значит s всегда просто завершает свою работу и не является экземпляром вируса W или любого другого вируса. Если же C(s) возвращает 0, значит s является экземпляром W. Соответственно, не существует алгоритма C, способного безошибочно определять все экземпляры вируса W и только их.

Слабое определение обнаружения

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

Определение 2.4. Будем говорить, что алгоритм A слабо обнаруживает вирус V для любой программы p, A(p) завершает работу и возвращает 1, если p \in  V, и возвращает отличный от 1 результат, если p не является экземпляром никакого вируса. При этом на экземплярах других вирусов алгоритм может возвращать любой результат

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

Сравнение с результатом Ф. Коэна

Полученный результат является дополнением результата Ф. Коэна. Действительно, результат Ф. Коэна можно кратко записать в виде:

  • для любого обнаруживающего алгоритма найдется вирус, который не будет обнаруживаться данным алгоритмом.

Результат Д. Чесса и С. Вайта может быть по аналогии представлен как:

  • существует полиморфный вирус, такой что для любого обнаруживающего алгоритма, алгоритм не будет обнаруживать этот вирус
  • существует полиморфный вирус, такой что для любого обнаруживающего алгоритма, алгоритм не будет слабо обнаруживать этот вирус

Практические следствия

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

если D(t), то завершить работу, иначе размножаться

или

если Sub1(u), то завершить работу, иначе {
  заменить текст подпрограммы Sub1 текстом произвольной программы;
  размножаться;
  завершить работу;
}
Sub1:
  вернуть D(аргумент);

Несмотря на то, что такие программы никогда не размножаются, их существование тесно связано с существованием определенных вирусов.

Здесь важно понимать значение полученного результата. Вывод Ф. Коэна важен в первую очередь тем, что можно без особых разбирательств отметать любые заявления о создании алгоритма точно детектирующего вирусы и только их. Точно так же на основании результата Д. Чесса и С. Вайта можно отметать заявления о создании алгоритма, способного обнаруживать без ложных срабатываний все экземпляры полиморфного вируса по одному его экземпляру.

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

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Евгений Виноградов
Евгений Виноградов

Прошел экстерном экзамен по курсу перепордготовки "Информационная безопасность". Хочу получить диплом, но не вижу где оплатить? Ну и соответственно , как с получением бумажного документа?

Илья Сидоркин
Илья Сидоркин

Добрый день! Подскажите пожалуйста как и когда получить диплом, после сдичи и оплаты?????

Айдар Аскаров
Айдар Аскаров
Россия, Альметьевск, АГНИ, 2009
Айдыс Хертек
Айдыс Хертек
Россия, Кызыл