
Полная версия:
Секреты и ложь. Безопасность данных в цифровом мире
Чтобы обнаружить ранее не известные вирусы, полиморфные вирусы (видоизменяющиеся при каждом инфицировании) и зашифрованные вирусы (скрывающие свои «отпечатки» при помощи криптографии), некоторые антивирусные программы тестируют компьютерную систему, выискивая подозрительное поведение. (Обычные программы поиска вирусов довольно глупы – чтобы их обмануть, иногда достаточно просто изменить какую-нибудь мелочь.) Такие программы работают довольно хорошо, однако они перекладывают на пользователя бремя принятия решения: вирус это или ложная тревога?
«Лекарства» от вирусов не существует. Математически доказано, что всегда можно написать вирус, который не сможет нейтрализовать ни одна из существующих антивирусных программ. (Даже модель Белла-Лападулы не предохраняет от вирусных атак.) Я не буду вдаваться в подробности, но основная идея в том, что если создатель вируса знает, что именно ищет антивирусная программа, он всегда имеет шанс разработать свой вирус, незаметный для нее. Конечно, после этого программисты, борющиеся с вирусами, могут усовершенствовать свою программу, которая будет определять уже и новый вирус.
ЧервиЧервями называют те разрушительные программы, которые специализируются на компьютерах, подключенных к сети. Это самовоспроизводящиеся программы, которые, в отличие от вирусов, не прячутся в других программах. Они существуют самостоятельно, блуждают по компьютерным сетям, причиняя повреждения.
Роберт Т. Моррис (Robert T. Morris) «выпустил» самого известного червя в 1988 году. Это был интернет-червь, который вывел из строя более 6000 компьютеров: 10% всех серверов Интернета. Червь появлялся на одной машине. Затем он предпринимал попытку проникнуть по сети в другие машины, используя несколько основных приемов. Когда это удавалось, червь засылал на новый компьютер копию своего кода. А затем эта копия повторяла весь процесс, пытаясь проникнуть в очередную машину. Обычно черви работают именно так. Тот червь мог бы причинить более крупные неприятности, если бы не счастливая ошибка. Изначально не планировалось, что 6000 зараженных компьютеров будут выведены из строя; червь должен был заразить их тайно, не привлекая всеобщего внимания. Ошибка в программе червя вызвала повреждение зараженных компьютеров. В главе 13 я более подробно расскажу о том, как работал тот червь и в чем конкретно заключалась ошибка.
Еще один червь известен под названием Pretty Park. Эта программа, функционирующая в среде Windows, приходит по электронной почте как вложение в сообщение. Если вы запускаете эту программу, она рассылает свои копии всем адресатам вашей записной книги в Outlook Express. Кроме того, она пытается подсоединиться к серверу IRC (Internet relay chat)[31] и отправить сообщения участникам чата. Автор червя может к тому же использовать это соединение, чтобы получать информацию из вашего компьютера. ILOVEYOU и все его варианты по сути своей – тоже черви.
Троянские кониТроянские кони – это разрушительные фрагменты, которые встроены в какие-то «нормальные» программы, чтобы одурачить пользователя, который будет думать, что это нечто полезное. Помните, откуда появилось это название? Греки десять лет осаждали Трою, но она не сдавалась. То ли от отчаяния, то ли от скуки Одиссей приказал греческим воинам построить большого деревянного коня, внутри которого могли бы спрятаться несколько человек. Этот сюрприз греки оставили троянцам как признание поражения, а затем сделали вид, что уплывают. Троянцы привезли деревянного коня в город – все художники изображают коня стоящим на платформе с колесами, – несмотря на предсказание Кассандры о том, что это приведет к гибели Трои. Ночью греки вылезли из коня, открыли ворота и впустили внутрь остальную греческую армию. После этого греки истребили троянцев, варварски разграбили и сожгли город. (По крайней мере, Гомер все описал именно так. Никто не знает, правда это или нет. Даже сам город считали мифом, пока Генрих Шлиман не обнаружил Трою в конце XIX века.)
Аналогично, цифровой троянский конь – это код, преднамеренно помещенный в вашу систему, который маскируется под безвредную (или полезную) программу, но делает что-то неожиданное или нежелательное. (С формальной точки зрения код, который вы сознательно размещаете в вашей системе, – это троянский конь, а код, который вводит в вашу систему кто-то другой, называют логической бомбой). Программист вписывает такой код в крупное программное приложение, которое в результате может начать работать неправильно, если, например, программист будет исключен из платежной ведомости. Тимоти Ллойд (Timothy Lloyd), диспетчер сети в Omega Engineering, в 1996 году установил логическую бомбу, которая подорвала производственные мощности его бывших работодателей и обошлась им более чем в 12 миллионов долларов.
Троянским конем может быть программа, которая тайно устанавливается в вашем компьютере, следит за буфером клавиатуры до тех пор, пока не обнаружит нечто, напоминающее номер кредитной карты, – правильное количество цифр, совпадение контрольной суммы, – и посылает этот номер кому-нибудь при помощи TCP/IP. Это также и приложение Java, которое прерывает соединение вашего модема и соединяет вас с 900 номерами в Молдавии (такой троянский конь на самом деле существовал).
Атака троянского коня коварна и опасна, поскольку вы можете и не догадываться о его работе. Один из популярных троянских коней для Microsoft Windows называется Back Orifice. Если он имеется на вашем диске, удаленный пользователь может эффективно подсоединиться к вам через Интернет и хозяйничать в вашем компьютере. Он может загружать себе ваши файлы, а вам – свои, удалять файлы, запускать программы, изменять конфигурации, захватывать управление клавиатурой и мышью, видеть все, что отображается на экране сервера. Тот же удаленный пользователь может вести более разрушительную деятельность: перезагружать компьютер, показывать произвольные диалоговые окна, включать и отключать микрофон или камеру, перехватывать нажатия клавиш (и пароли). А кроме того, существует расширяемый язык, позволяющий писать модули. (Я все жду, что кто-нибудь распространит модуль, который будет автоматически выискивать и записывать закрытые ключи PGP или последовательности регистрации для Всемирной паутины.)
Кроме Back Orifice и других хакерских инструментов по принципу троянских коней могут работать многие программы удаленного администрирования. DIRT (Data Interception by Remote Transmission, перехват данных с помощью удаленной передачи) – это троянский конь, разработанный правительством США и находящийся в распоряжении полиции.
Это все грубо действующие троянские кони, но бывают и более коварные. Некоторые из них собирают и отсылают автору имена и пароли пользователей. Другие незаметно изменяют шифровальную программу так, что выбор ключей становится ограничен. (Мне встречались измененные таким образом версии PGP.) Вас могут заставить поверить во что угодно, подсунув на ваш компьютер фальшивый сертификат. (Эта идея использовалась для лабораторных демонстраций нападений на систему кодовых обозначений Microsoft.) Эти троянские кони не делают ничего такого, о чем вы могли бы легко догадаться, но они способны на многое, что никогда не придет вам в голову. Распределенные атаки, приводящие к отказу в обслуживании, осуществлявшиеся с помощью Интернета, используют троянских коней для заражения промежуточных компьютеров.
Наиболее сложный этап при подобных атаках – это помещение троянского коня на компьютер ничего не подозревающей жертвы. Один из вариантов – проникнуть в офис жертвы и установить троянца на нужный компьютер; в следующей главе мы обсудим некоторые способы защиты от атак такого рода. Можно убедить жертву собственными руками установить троянского коня; о манипулировании людьми мы поговорим в главе 17. Можно атаковать компьютер через Интернет – мы вернемся к этому в главе 11. И наконец, можно проникнуть в компьютер при помощи самих разрушительных программ, создавая вирусы.
Современные разрушительные программыДля программного обеспечения, призванного причинять неприятности, 1999 год стал переломным. Различные типы – вирусы, черви и троянские кони – слились и перемешались. И стали в результате еще более опасными. Новизна состояла не в автоматической пересылке разрушительных программ по электронной почте – до этого были Christma exec в 1987 году (через систему электронной почты PROFS (Professional Office System, профессиональная офисная система)) и ShareFun в 1997 году, – но 1999 год стал первым годом, когда распространяющиеся по электронной почте «вредные» программы смогли заразить крупные зоны Интернета. Новые типы этих программ игнорировали средства корпоративной защиты и тонеллировали сквозь брандмауэры. Это действительно значительный шаг.
Вирус продолжает существовать, если он воспроизводится на новых компьютерах. До Интернета компьютеры сообщались в основном при помощи гибких дисков. Следовательно, большинство вирусов передавались при помощи дискет, и лишь изредка через электронные доски объявлений (bulletin board system, BBS).
Дискеты как переносчики инфекции имеют свои особенности. Во-первых, заражающие программы распространяются довольно медленно. Компьютер инфицирует через дискету другой компьютер, с него переходит на пять других, и по истечении недель или месяцев этот процесс приведет к эпидемии. Хотя возможно, что кто-то поместит инфицированную вирусом программу на электронную доску объявлений, тогда тысячи компьютеров заразятся за одну-две недели.
Во-вторых, перенос программ при помощи дискет легко блокировать. Большинство антивирусных программ могут автоматически сканировать все гибкие диски. Опасные программы на входе блокируются. Электронная доска объявлений способна все же доставить некоторые проблемы, но большинство пользователей приучили себя к тому, что не следует загружать программы с ненадежных BBS. А кроме того, антивирусные программы могут автоматически сканировать новые файлы в поисках опасного кода.
И в-третьих, при таком способе распространения вирусов антивирусные программы справляются со своей задачей. Написать программу, блокирующую известные опасные программы, в общем, не сложно. Она будет работать по принципу сканирующего поиска кода, характерного для вируса (так называемых сигнатур). Найдя зараженный участок, программа автоматически удалит вирус и вернет все в нормальное состояние. Процедура удаления уникальна для каждого вируса, но разработать ее сравнительно нетрудно. Антивирусные программы включают десятки тысяч сигнатур, каждая из которых характерна для определенного вируса. Компании выпускают новые программы в тот же день, как узнают о новом вирусе. И при условии, что вирус распространяется медленно, такая защита работает. Ежемесячно происходит автоматическое обновление большинства антивирусных программ. До 1999 года такая защита была вполне удовлетворительна.
Все изменилось с распространением электронной почты. 1999 год принес нам макровирус Melissa для Microsoft Word и червя Worm.ExploreZip, a 2000 год – червя ILOVEYOU и массу его разновидностей, не говоря обо всем остальном. Разрушительные программы такого типа размножаются по электронной почте и используют ее особенности. Эти программы отправляют себя по почте людям, с которыми переписывается хозяин инфицированного компьютера, обманом заставляя получателей открыть или запустить их. В таком случае процесс распространения вирусов занимает не недели и не месяцы, а считанные секунды.
Антивирусные компании по мере возможности выпускают усовершенствованные версии программ, которые умеют ловить определенные вирусы, но если вирус может заразить 10 миллионов компьютеров в течение нескольких часов (так оценивают скорость распространения ILOVEYOU), то прежде, чем его удастся зафиксировать, он вызывает множество повреждений. А что если вирус постарается «спрятаться», чтобы его код не обнаружили в течение нескольких дней? Что, если червь нацелен на конкретную машину и удаляет свой код из всех компьютеров, у которых идентификатор пользователя не соответствует заданному? Сколько времени потребовалось бы на то, чтобы его обнаружить? Что, если этот червь отправляет по электронной почте в анонимный почтовый ящик копию регистрационного имени пользователя (в большинстве случаев содержащего пароль) и лишь затем самоуничтожается? Что, если такой код способен автоматически обновляться? Что, если он автоматически зашифровывает свои распространяющиеся копии при помощи системы PGP? А если он видоизменяется и ускользает от антивирусных программ? Или неделями прячется в системе? Даже минутные размышления на эту тему заставляют нас нарисовать себе довольно жуткую картину.
Поскольку электронная почта встречается повсеместно, путешествующие с ее помощью опасные программы в силах проникнуть куда угодно. Они могут просочиться через такое интернет-соединение, через которое больше ничего не проходит. Их нельзя остановить брандмауэром; они проникают сквозь него, неожиданно оказываются внутри системы и производят повреждения. Эффективность брандмауэров будет снижаться по мере того, как мы будем расширять перечень используемых служб (e-mail, Веб и т. п.) и добавлять все более сложные приложения во внутреннюю сеть, а авторы разрушительных программ будут принимать все это во внимание. Такой метод «проникновения внутрь с последующей работой» еще более ухудшит ситуацию.
В настоящее время, разрабатывая средства для защиты от вирусов, червей и троянов, стараются подражать биологическим принципам борьбы с вирусами. Тем не менее я настроен скептически по двум причинам. Прежде всего биологические вирусы эволюционируют медленно: удачные новые мутации со временем могут закрепиться, а затем медленно распространиться по виду. Биологические иммунные системы приспособлены именно к атакам такого рода. А компьютерные вирусы, в отличие от биологических, специально создают «смертельными».
Вторая причина моего скепсиса в том, что биологические иммунные системы ориентированы на то, чтобы защищать вид за счет отдельной особи. Относительно генофонда – это правильная стратегия, но для защиты конкретного компьютера от разрушительных программ она не годится.
Мне кажется более интересным такое решение: связать компьютеры с центром автоматического выявления вирусов. Если какой-нибудь компьютер замечает подозрительный код, он отсылает его для последующего анализа. Такой подход имеет помимо перспективы и ряд новых опасностей. Кроме того, он все-таки не сможет обеспечить необходимую скорость обнаружения вирусов. Любая крупная рассредоточенная система в любом случае допускает возможность заражения вирусами. Если система безопасности не продумана снизу доверху, мы должны быть постоянно готовы к борьбе с попытками установить контроль над системой.
Легко критиковать Microsoft за усугубление проблемы. Языки сценариев Microsoft являются довольно мощным средством, однако они созданы в предположении, что все, с чем вы работаете, заслуживает доверия. Эти языки позволяют иметь доступ ко всем ресурсам операционной системы (сравните с моделью безопасности Java). Они позволяют разрушительным программам использовать свойства Microsoft Outlook для автоматической рассылки своих копий корреспондентам пользователя. Microsoft, безусловно, заслуживает порицания за то, что созданные ею мощные средства – Word и Excel – размывают границы между исполняемыми файлами, которые потенциально таят опасность, и файлами данных, бывшими до сих пор безопасными. Он заслуживает осуждения и за то, что интегрированная в Outlook 2000 поддержка языка HTML допускает возможность внедрения основанной на HTML разрушительной программы при простой загрузке электронного сообщения (оно автоматически открывается в режиме предварительного просмотра). А также за то, что разрушительная программа может использовать интеграцию ActiveX в Internet Explorer 5.0, чтобы распространяться без участия пользователя. Microsoft создала операционную среду, в которой разрушительные программы легко создаются, легко распространяются и могут причинять множество неприятностей. Но основная проблема, состоящая в том, что мобильный код не заслуживает доверия, намного более остра.
Модульная программаВ прежние времена (в 1970-х) компьютерные программы были крупными и громоздкими, их было трудно писать, и еще труднее использовать. Затем кому-то пришла идея поделить большие программы на мелкие, более простые для понимания компоненты. Объектно-ориентированное программирование, C++, подключаемые модули – все это различные реализации этой идеи. Проблема в том, что современное программное обеспечение, в основе которого лежат небольшие компоненты, намного сложнее защитить.
Рисунок 10.1 иллюстрирует принцип, по которому построены старые программы: большие приложения опираются на небольшую операционную систему. Большинство современных программ похожи на Приложение 1 – приложения с компонентами – или на Приложение 2 – приложения с компонентами, состоящими из компонентов (рис. 10.2).

Рис. 10.1. Устройство старого программного обеспечения

Рис. 10.2. Современная структура компонентно-ориентированного программного обеспечения
Представьте себе, как устроен браузер. Одним из компонентов является виртуальная машина Java (Java Virtual Machine). Апплеты Java запускаются на самом верху этой конструкции. Некоторые апплеты Java могут заменяться. Имеются все виды макросов для вашего текстового редактора и электронных таблиц. Вы можете загружать сменные PGP для Eudora. He исключено, что каждую неделю вы загружаете те или иные сменные модули для своего браузера.
В действительности, хотя браузер и продается как единая программа, он состоит из множества работающих вместе разнообразных компонентов. Так же устроены текстовый редактор и электронные таблицы; в Microsoft Word свыше тысячи компонентов. Таким образом, вы имеете дело со схемой Приложение 3: небольшое приложение-основа, к которой крепится множество компонентов, состоящих, в свою очередь, из компонентов. Даже операционная система построена по тому же принципу; на рис. 10.3 представлена модель Windows NT: компоненты состоят из компонентов.

Рис. 10.3. Архитектура Windows NT
Безопасность страдает из-за применения динамической компоновки. В старых программах фрагменты программы соединялись вместе изготовителем (так называемая линковка, сборка – на программистском жаргоне) еще до того, как вы ее купили. Программисты связывали части программ и проверяли, что все работает как надо. Сейчас компоненты часто связываются динамически при запуске приложения. Пользователи Windows знают о так называемых библиотеках динамической компоновки (Dynamic Link Libraries, DLL); пользователям UNIX и Macintosh они известны как библиотеки коллективного доступа (shared libraries).
Проблемы безопасности нужно рассматривать одновременно с нескольких точек зрения. Во-первых, вы не можете быть уверены, что все модули надежны. В предыдущем разделе я рассказывал о «вредных» программах; возможно, что один или несколько модулей являются разрушительными или просто неисправными. Во-вторых, вы не должны допускать, что все модули написаны настолько хорошо, что будут работать во всех возможных конфигурациях. Достоинством крупных компьютерных программ было то, что они тестировались как единое целое. Браузер, работающий на вашем компьютере, со всеми дополнительными модулями, которые вы загружали в произвольном порядке, может быть совершенно уникален. Маловероятно, что это сочетание кто-то уже тестировал.
И в-третьих, еще не существует такой операционной системы, которая помогла бы решить две вышеуказанные проблемы. При старом принципе построения программ различные части программного обеспечения сообщались только через операционную систему. Хорошая операционная система могла обеспечивать взаимодействие программ и не допускать, чтобы одна программа повреждала другую. Современные компоненты непосредственно обращаются друг к другу, без посредничества операционной системы, поэтому применяемые в последних меры безопасности могут не работать.
Эти проблемы безопасности пытались решать с применением некоторых общих методов, одни из которых принесли больший, другие – меньший успех. Но все эти подходы лучше выглядят в теории, чем работают на практике.
Автономность (Isolation) и защита памяти. Эта мера направлена на то, чтобы помешать одному из компонентов умышленно или случайно воздействовать на остальную систему: читать или вносить изменения в память другого компонента, выходить за пределы отведенной ему памяти и приводить к поломке системы или доставлять другие неприятности. Автономное использование памяти предполагает, что каждому компоненту отводится свой участок памяти, за пределами которого этот компонент не может ни читать, ни записывать. Время от времени контролирующие программы (program checkers), установленные на машине пользователя, проверяют коды компонентов, чтобы убедиться, что не происходит ничего недозволенного. Примером реализации этой идеи служит «песочница» (sandbox) Java: все компоненты вынуждены «играть» в отдельных «песочницах», из которых они не могут повредить друг друга. Этот принцип защиты работает хорошо, но некоторые ошибки он не позволяет обнаружить, кроме того, за него приходится расплачиваться скоростью работы программ.
Контроль доступа в интерфейсе. Сделав компонент полностью изолированным, мы не решаем проблему полностью: ведь ему необходимо взаимодействовать с другими компонентами (а также с экраном, клавиатурой, мышью и т. д.). На рис. 10.2 показаны пути взаимосвязей между компонентами. Устанавливая правила контроля доступа в точках соприкосновения, мы можем надеяться, что компоненты правильно взаимодействуют друг с другом. Проблема в том, что вы должны выбрать политику контроля доступа, которая должна быть достаточно жесткой, чтобы приносить действительную пользу. «Песочницы» Java позволяют добиться хороших результатов, однако недостаток их политики состоит в том, что она либо чересчур бескомпромиссная, либо излишне либеральная – «золотой середины» в реальности не существует. (Java 2 имеет мелкомодульный контроль, но он недостаточно используется.)
Подписывание кода (Codesigning). Представьте себе закрытую частную вечеринку, попасть на которую реально, только предъявив какой-нибудь солидный документ (например, водительские права). При таком подходе в дом смогут пройти только друзья хозяина. Такой же смысл имеет подписывание кода. Программист подписывает отдельные компоненты. На основании этих подписей пользователь принимает решение, какие компоненты допустить на свой компьютер, а какие – нет. (В случае ActiveX подписывание кода – основной способ защиты от злонамеренного кода.) В своем сегодняшнем виде подписывание кода имеет массу проблем. Во-первых, непонятно, исходя из каких соображений пользователь должен решать, заслуживает ли доверия автор подписи. Во-вторых, сам факт существования подписи у компонента не означает, что он безопасен. В-третьих, то, что каждый из двух компонентов имеет подписи, не означает, что их можно использовать вместе: совместная работа чревата множеством непредвиденных опасных ситуаций. В-четвертых, к проблеме безопасности не следует подходить с позиции «все или ничего»: существуют разные степени безопасности. И в-пятых, фиксирование компьютером нападения (сохранение подписи кода) практически бесполезно с точки зрения атаки: при ее осуществлении злоумышленник может удалить или изменить подпись или просто переформатировать диск, на котором она была сохранена. Чем больше приходится размышлять о подписывании кода, тем меньше смысла видится в этой процедуре.
Новые технологии, зарождающиеся в университетских лабораториях, помогут когда-нибудь найти лучшее решение, но это произойдет не ранее, чем через несколько лет. Тем временем модульная программа, вероятно, станет еще большей проблемой безопасности. Все больше и больше программных пакетов обладают способностью к самоусовершенствованию, то есть регулярно загружают новые модули. Например, Internet Explorer 4.0 и последующие версии дают возможность подписаться на обновление программного обеспечения. Если вы этим пользуетесь, то программа автоматически обновляется, загружая новые модули с веб-страницы корпорации Microsoft. Это очень полезное свойство, если не пускать дело на самотек. В противном случае вы можете обнаружить, что среди ночи ваш компьютер автоматически подсоединяется к Интернету. Как может на это отреагировать пользователь, видно по следующему отрывку из программы новостей:
«Ранним утром я полез в холодильник, и вдруг услышал, что компьютер сам подключился к Интернету, – рассказал один пользователь, занимающийся бета-тестированием
Вы ознакомились с фрагментом книги.