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

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

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

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

Добавлен: 29.10.2018

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

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

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

9.9. Вредоносные программы   

731

постоянно выбирает второе в качестве своей рыночной стратегии. Если вы считаете 
безопасность более важной вещью, чем простота использования, отложите на время 
чтение книги и настройте свой сотовый телефон на ввод ПИН-кода перед каждым 
звонком — практически любой аппарат имеет подобные настройки. Если не знаете, как 
это сделать, закачайте руководство пользователя с веб-сайта производителя. Понятно, 
о чем идет речь?

В следующих нескольких разделах будут рассмотрены некоторые общие формы вре-
доносных программ, их устройство и методы распространения. Далее в главе будут 
рассмотрены некоторые способы борьбы с ними.

9.9.1. Троянские кони

Одно дело создать вредоносную программу — это можно сделать даже в своей спальне. 
А вот заставить миллионы людей установить ее на свои компьютеры — совсем другое 
дело. Как этот вопрос решает Мэл, создатель вредоносных программ? Самый распро-
страненный прием — создать по-настоящему полезную программу и встроить в нее 
вредоносный модуль. Это могут быть игры, музыкальные плееры, специализирован-
ные программы просмотра «взрослого» контента и еще что-нибудь с привлекательной 
графикой. Люди сами закачают и установят такое приложение. В качестве бесплатного 
бонуса они получат установленную вредоносную программу. Такой подход называет-
ся атакой с помощью троянского коня (Trojan horse attack), в память о деревянном 
коне с греческими воинами внутри из гомеровской «Одиссеи». В мире компьютерной 
безопасности это понятие относится к любому вредоносному коду, спрятанному в про-
грамме или на веб-странице, которую люди загружают добровольно.

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

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

Существует еще один прием, позволяющий заставить жертву выполнить троянскую 
программу. К примеру, многие пользователи UNIX используют переменную среды 
окружения $PATH, которая управляет просмотром каталогов при поиске команды. Ее 
содержимое можно просмотреть, набрав в оболочке следующую команду:

echo $PATH

Возможные настройки для пользователя ast на конкретной системе могут содержать 
следующие каталоги:

:/usr/ast/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/ucb:/usr/man\
:/usr/java/bin:/usr/java/lib:/usr/local/man:/usr/openwin/man


background image

732  

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

У других пользователей, наверное, будут другие пути поиска. Когда пользователь на-
бирает в оболочке команду

prog

оболочка сначала проверяет, нет ли такой программы в 

/usr/ast/bin/prog

. Если она там 

есть, то она выполняется. Если ее там нет, оболочка пытается найти ее в 

/usr/local/bin/

prog

/usr/bin/prog

/bin/prog

 и т. д., просматривая по очереди все 10 каталогов перед 

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

Чаще всего программы находятся в 

/bin

 или в 

/usr/bin

, поэтому помещение троян-

ского коня в файл 

/usr/bin/X11/ls

 не сработает, поскольку первой будет найдена 

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

/usr/bin/X11

 файл 

la

. Если пользователь допустит опечатку и наберет la 

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

/bin/ls

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

именно эта версия.

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

cd /home/mal 
ls –l

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

/home/mal/bin/sh

 с SETUID владельца root. Для этого он совершает два системных 

вызова: chown для изменения владельца файла 

/home/mal/bin/sh

 на root и chmod — для 

установки его бита SETUID. Теперь Мэл, запустив эту оболочку, может стать приви-
легированным пользователем.

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


background image

9.9. Вредоносные программы   

733

конь предписывает ей перевести немного денег на подставной счет (предпочтительно 
в какой-нибудь далекой стране), чтобы в последующем снять с него наличные.

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

9.9.2. Вирусы

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

Так что же такое вирус? Коротко говоря, вирус (virus) — это программа, способная 
размножаться, присоединяя свой код к другим программам аналогично тому, как раз-
множаются биологические вирусы. Кроме этого, вирус способен и на другие действия. 
Черви похожи на вирусы, но они занимаются копированием самих себя. В данный 
момент эти различия нас не интересуют, поэтому термин «вирус» будет употребляться 
для обоих случаев. А черви будут рассмотрены в следующем разделе.

Как работают вирусы

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

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

 (payload). Во многих случаях эти действия могут откладываться 

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

Далее будут рассмотрены семь разновидностей вирусов, отличающихся друг от друга 
объектами заражения. Это «компанейские» вирусы, а также вирусы, заражающие 
исполняемые программы, память, загрузочный сектор, драйвер устройства, макросы 
и исходные тексты программ. Несомненно, в будущем появятся и новые типы вирусов.

Вирус-компаньон

Сам по себе вирус-компаньон (companion virus) программу не заражает, он запускает-
ся, когда предполагается запуск какой-нибудь программы. Эта разновидность очень 


background image

734  

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

стара и относится к тем давним временам, когда на планете царила MS-DOS, но она 
по-прежнему жива. Ее концепцию поясним на примере. Когда в MS-DOS пользователь 
набирает

prog

MS-DOS сначала ищет программу по имени 

prog.com

. Если она не может найти такую 

программу, то ищет программу по имени 

prog.exe

. В Windows, когда пользователь щел-

кает на кнопке 

Пуск

 (Start), а затем на пункте меню 

Выполнить

 (Run) или нажимает 

клавишу с логотипом Windows, а затем, удерживая ее, нажимает клавишу 

R

, он попада-

ет в среду, где возможно то же самое. В наше время большинство программ содержится 
в файлах с расширениями 

.exe

, а файлы с расширением 

.com

 встречаются крайне редко.

Предположим, что Вирджилу известны многие, кто запускает 

prog.exe

 из приглашения 

MS-DOS или из командной строки Windows, вызываемой щелчком на пункте меню 

Выполнить

 (Run). Тогда он может выпустить вирус с именем файла 

prog.com

, который 

будет выполнен в тот момент, когда кто-нибудь попытается запустить 

prog

 (если только 

не будет введено полное имя 

prog.exe

). Когда 

prog.com

 завершит свою работу, он про-

сто выполнит 

prog.exe

 и пользователь останется в неведении.

Это чем-то похоже на атаку, осуществляемую на рабочем столе Windows, в которой 
используются ярлыки программ (символьные ссылки на программы). Вирус может 
изменить объект ярлыка, заменив его указателем на вирус. После того как пользователь 
дважды щелкнет на значке, вирус будет выполнен. Когда вирус отработает, он просто 
запускает исходный объект ярлыка.

Вирусы, заражающие исполняемые файлы

На следующей по сложности ступеньке располагаются вирусы, заражающие исполня-
емые файлы. Самые простые из них просто переписывают исполняемую программу 
своим кодом. Они называются перезаписывающими вирусами (overwriting viruses). 
Логика заражения, закладываемая в такие вирусы, показана в листинге 9.2.

Листинг 9.2. Рекурсивная процедура, отыскивающая исполняемые файлы 
в системе UNIX

#include <sys/types.h>    /* стандартные заголовки POSIX */ 
#include <sys/stat.h> 
#include <dirent.h>
#include <fcntl.h> 
#include <unistd.h> 
struct stat sbuf;         /* для вызова lstat, чтобы определить, */
                          /* не являтся ли файл символьной ссылкой */ 
search(char *dir_name)
{                         /* рекурсивный поиск исполняемых файлов */ 
    DIR *dirp;            /* указатель на открытый каталог */ 
    struct dirent *dp;    /* указатель на запись каталога */ 

    dirp = opendir(dir_name);    /* открытие указанного каталога */ 
    if (dirp == NULL) return;    /* каталог не может быть открыт, */
                                 /* и о нем следует забыть */ 
    while (TRUE) {
        dp = readdir(dirp);      /* чтение следующей записи каталога */
        if (dp == NULL) {        /* NULL означает конец каталога */


background image

9.9. Вредоносные программы   

735

        chdir ("..");            /* возвращение в родителский каталог */ 
        break;                   /* выход из цикла */ 
        }
    }
    if (dp->d_name[0] == ‘.’) continue;  /* пропуск каталогов . и .. */
    lstat(dp->d_name, &sbuf);            /* является ли запись символьной 
                                            ссылкой? */
    if (S_ISLNK(sbuf.st_mode)) continue; /* пропуск символьных ссылок */
    if (chdir(dp->d_name) == 0) { /* если chdir сработала, значит, 
                                     это каталог */
        search(".");              /* да, вход и проведение в нем поиска */
    } else {                      /* нет (это файл), заражение файла */
            if (access(dp->d_name,X_OK) == 0) /* если файл исполняемый, */
                                              /* заражение файла */ 
            infect(dp->d_name);
    }
    closedir(dirp);            /* каталог обработан, закрытие каталога 
                                  и выход */ 
    }

Основная программа этого вируса сначала копирует его двоичную программу в массив, 
открывая argv[0] и считывая его содержимое для большей сохранности. Затем она 
сканирует всю файловую систему, начиная с корневого каталога, сделав его текущим 
и вызвав процедуру search с каталогом 

root

 в качестве параметра.

Рекурсивная процедура search обрабатывает каталог, открывая его, а затем считывая 
записи по одной с помощью функции readdir до тех пор, пока эта функция не вернет 
значение NULL, свидетельствующее о том, что записей больше нет. Если запись отно-
сится к каталогу, то этот каталог обрабатывается за счет превращения его в текущий 
и рекурсивного вызова процедуры search. Если запись относится к файлу, этот файл 
заражается за счет вызова процедуры infect с именем инфицируемого файла в качестве 
параметра. Файлы, начинающиеся с символа «

.

», пропускаются во избежание проблем 

с каталогами «

.

» и «

..

». Пропускаются также символьные ссылки, поскольку программа 

предполагает, что она может войти в каталог, используя системный вызов chdir, а потом 
вернуться на прежнее место, переходя по ссылкам «

..

», которые считаются жесткими 

связями, а не символьными ссылками. Более изощренная программа может также об-
работать и символьные ссылки.

Процедура заражения infect (в листинге отсутствует) должна просто открыть указан-
ный в ее параметре файл, скопировать вирус, хранящийся в массиве поверх файла, 
а затем закрыть файл.

Этот вирус может быть «усовершенствован» разными способами. Во-первых, в про-
цедуру infect может быть включен тест, генерирующий случайное число и в большин-
стве случаев просто возвращающий управление без каких-либо действий. Скажем, 
в одном случае из 128 происходит заражение, так что вероятность раннего обнару-
жения будет понижена и вирус получит неплохие шансы на распространение. У био-
логических вирусов есть такое же свойство: вирусы, быстро убивающие свою жертву, 
не распространяются так же быстро, как те вирусы, которые вызывают постепенную 
гибель организма, давая жертве неплохие шансы на распространение вируса. Другая 
конструкция предусматривает более высокую степень заражения (скажем, 25 %), но 
сокращает количество одновременно заражаемых файлов, чтобы снизить активность 
использования диска и вызвать меньше подозрений.