Глава 10 Безопасность компьютеров в сети
Глава 10
Безопасность компьютеров в сети
В этой главе я хочу поговорить об атаках, совершаемых через Интернет. Такие атаки можно считать компьютерными, тогда их следовало бы рассматривать в главе 8. Можно отнести их и к сетевым нападениям, о которых речь пойдет в главе 11. Но я выделяю эти атаки в самостоятельный класс и посвящаю им отдельную главу.
Разрушительные программы
Самое первое, с чем большинство из нас сталкивается при первом знакомстве с проблемами компьютерной безопасности – это именно разрушительные программы, то есть программы, умышленно причиняющие неприятности. Даже в том случае, если компьютер не подключен к сети и доступ к нему имеется только у вас, вам не следует забывать о вирусах. Ведь вы не знаете точно, какие программы в данный конкретный момент выполняются вашим компьютером, и только можете надеяться, что выполняемые программы работают как надо. Запуская программы, в надежности которых вы не уверены, вы рискуете.
К разрушительным программам кроме вирусов относятся так называемые «троянские кони» и «черви». Они обычно состоят из двух частей: «полезной нагрузки» и механизма распространения. «Полезная нагрузка» – это та составляющая, которая, собственно, и вызывает сбои. Традиционно нагрузка была не очень разнообразна – прототипы вирусов выводили на экран какое-либо надоедливое сообщение, переформатировали жесткий диск компьютера жертвы либо не делали вообще ничего. Но в некоторых случаях нагрузка способна причинить и большие неприятности: изменить установки контроля доступа компьютера, украсть секретный ключ и отправить его по электронной почте и т. п. Результат таких действий может оказаться опасным, и я считаю, что следует ожидать появления более коварных нагрузок в ближайшие годы[30]. В этой книге для нас наибольший интерес будут представлять механизмы распространения, по которым мы и классифицируем разрушительные программы.
Компьютерные вирусы
Биологический вирус представляет собой невидимый в оптический микроскоп инфекционный агент, вызывающий болезни растений, животных и бактерий. По существу, он состоит из белковой оболочки, содержащей РНК или ДНК. Вирусы не способны воспроизводиться вне клетки-хозяина, поэтому их, как правило, не относят к живым организмам. Таким образом, налицо прямая аналогия с вирусами компьютерными. Компьютерный вирус представляет собой фрагмент компьютерного кода, который может прикрепляться к другой компьютерной программе (сам по себе этот фрагмент существовать не может). Прикрепившись, он воспроизводится, делает новые собственные копии, которые внедряются в другие программы. И так далее.
В 1983 году студент Фред Коэн (Fred Cohen) написал первый компьютерный вирус. Он сделал это, только чтобы создать прецедент (удивительно, но большинство людей не верили, что это возможно). Многие скопировали этот вирус, большинство этих людей хотели просто досадить окружающим. В настоящее время насчитывают от 10 000 до 60 000 вирусов (в зависимости от критериев подсчета), большинство которых написаны для IBM-совместимых персональных компьютеров. По некоторым оценкам, которые мне встречались, ежедневно создаются шесть новых вирусов, но я считаю, что это – ложь и паникерство. Всего несколько сотен вирусов встречаются «в диком виде» (имеется в виду «на жестком диске у людей, не принимающих непосредственного участия в исследованиях компьютерных вирусов»), но те, которые встречаются, могут быть разрушительными.
Вирусы можно подразделить на три основных класса: файловые вирусы, загрузочные вирусы (вирусы, поражающие загрузочный сектор) и макровирусы.
Долгое время наиболее распространенными были файловые вирусы. Они работали, присоединяясь к программным файлам, например к текстовому редактору или компьютерным играм. При запуске инфицированной программы этот вирус размещается в памяти так, чтобы заразить другие приложения, запускаемые пользователем. Таким способом вирус распространяется по компьютеру пользователя, а если пользователь даст кому-то дискету с инфицированным приложением (или пошлет это приложение по сети), то зараженным окажется и другой компьютер.
Большинство файловых вирусов уже вышли из употребления. Изменения в устройстве компьютеров привели к тому, что вирусы потеряли способность запускаться; программное обеспечение часто требует обновления при установке новой операционной системы или нового процессора. Многие файловые вирусы вымерли после того, как в 1992 году была выпущена Windows 3.1; вирусы просто рушили эту операционную систему и в результате не могли распространяться.
Загрузочные вирусы менее распространены. Эти вирусы размещаются на специальном участке диска (дискеты или жесткого диска), данные с которого загружаются в память при загрузке компьютера. После того как этот вирус внедряется в память, он может заразить соответствующие секторы всех имеющихся жестких Дисков и гибких дисков, вставленных в дисковод, и таким образом распространиться на другие системы. Загрузочные вирусы чрезвычайно эффективны, и, даже несмотря на гораздо меньшее количество штаммов (различных разновидностей), они какое-то время преобладали над файловыми вирусами.
Загрузочные вирусы могут мирно сосуществовать с Windows 3.1, но большинство из них не пережили появления Windows 95. Несовместимость при загрузке и появляющиеся на экране предупреждения сильно затруднили распространение вирусов. Были вирусы, созданные специально для Windows 95, но ни один из них не получил широкого распространения, поскольку никто уже не загружается с гибкого диска.
Последний класс вирусов – это макровирусы. Они написаны на языке сценариев и заражают не программы, а файлы данных. Во многих текстовых процессорах, электронных таблицах и программах, работающих с базами данных, используются специальные языки разработки сценариев. Такие сценарии (программы на макроязыке, или просто макросы) используются для автоматизации задач и хранятся вместе с данными. Первый макровирус для Microsoft Word – Concept – впервые обнаружили в «диком виде» в 1995 году; в текстовом редакторе Emacs такие вирусы существовали уже в 1992 году.
Макровирусы могут распространяться существенно быстрее других, поскольку люди гораздо чаще обмениваются данными, чем программами. А поскольку программное обеспечение электронной почты и передачи файлов делается все проще в обращении, эти вирусы станут распространяться еще быстрее. Бывают макровирусы, способные существовать в различных операционных средах: некоторые макровирусы для Microsoft Office могут заражать как компьютеры Windows, так и Macintosh.
Макровирусы – это будущее компьютерных вирусов. Все вирусы, которые быстро распространяются по Интернету, – это макровирусы. Лучшие из вирусов используют психологические приемы, побуждающие пользователя установить, запустить или размножить их.
Антивирусное программное обеспечение – это более выгодный бизнес, чем написание вирусов. (Я полагаю, это очевидно: за вирусы никто денег не платит.) Большинство антивирусных программ сканируют файлы, выискивая вирусы. В программах есть база данных, содержащая «отпечатки пальцев» вирусов – фрагменты кода, про которые известно, что они являются частью вирусов. Когда программа находит такой же отпечаток, она получает информацию, что файл заражен, и, чтобы «дезинфицировать» его, удаляет вирусный код. Метод сканирования «отпечатков» работает только после того, как компания, создавшая антивирусную программу, выделила вирус в лаборатории и включила в список новый отпечаток. Поэтому усовершенствование антивирусного программного обеспечения – бойкий бизнес.
Все вирусы, которые встречались до сих пор, были направлены против крупных вычислительных машин, а не против периферийных или встроенных систем. Однако можно написать вирус на языке PostScript. Он мог бы распространяться от документа к документу. Он мог бы воздействовать на принтеры. Можно создать вирус, заражающий сотовые телефоны и распространяющийся по сотовой сети. Нам уже встречался вирус, специализирующийся на устройствах WebTV. Можно создать вирус, заражающий практически любую компьютерную систему. Если его еще нет, то только потому, что люди, которые обладают необходимыми знаниями и не отягощены строгой моралью, до сих пор не удосужились его создать.
Чтобы обнаружить ранее не известные вирусы, полиморфные вирусы (видоизменяющиеся при каждом инфицировании) и зашифрованные вирусы (скрывающие свои «отпечатки» при помощи криптографии), некоторые антивирусные программы тестируют компьютерную систему, выискивая подозрительное поведение. (Обычные программы поиска вирусов довольно глупы – чтобы их обмануть, иногда достаточно просто изменить какую-нибудь мелочь.) Такие программы работают довольно хорошо, однако они перекладывают на пользователя бремя принятия решения: вирус это или ложная тревога?
«Лекарства» от вирусов не существует. Математически доказано, что всегда можно написать вирус, который не сможет нейтрализовать ни одна из существующих антивирусных программ. (Даже модель Белла-Лападулы не предохраняет от вирусных атак.) Я не буду вдаваться в подробности, но основная идея в том, что если создатель вируса знает, что именно ищет антивирусная программа, он всегда имеет шанс разработать свой вирус, незаметный для нее. Конечно, после этого программисты, борющиеся с вирусами, могут усовершенствовать свою программу, которая будет определять уже и новый вирус.
Черви
Червями называют те разрушительные программы, которые специализируются на компьютерах, подключенных к сети. Это самовоспроизводящиеся программы, которые, в отличие от вирусов, не прячутся в других программах. Они существуют самостоятельно, блуждают по компьютерным сетям, причиняя повреждения.
Роберт Т. Моррис (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. Это очень полезное свойство, если не пускать дело на самотек. В противном случае вы можете обнаружить, что среди ночи ваш компьютер автоматически подсоединяется к Интернету. Как может на это отреагировать пользователь, видно по следующему отрывку из программы новостей:
«Ранним утром я полез в холодильник, и вдруг услышал, что компьютер сам подключился к Интернету, – рассказал один пользователь, занимающийся бета-тестированием
???
повредить его рабочим взаимоотношениям с Microsoft. – Я очень испугался и вытащил телефонную вилку из розетки».
Здесь нет ничего постыдного – пользователь просто не осознал, что происходит. Но большинство компьютерных пользователей не имеют ни малейшего представления, что происходит внутри их компьютеров. И если они привыкли, что их компьютер куда-то звонит среди ночи, они могут однажды с удивлением обнаружить, что какая-то гнусная программа резко увеличила сумму телефонного счета, позвонив по 900 номерам в Молдавии.
Переносимый код
Если задуматься, использование программ, написанных кем-то другим, – это всегда риск. Вы принимаете на веру, что программист не злоумышленник и что программы, которые вы запускаете, работают так, как надо. (Мы снова вернемся к проблемам человеческого фактора в главе 17.) На заре существования вычислительной техники пользователи просто не имели возможности пользоваться чужими программами. Программы нужно было писать или, по крайней мере, компилировать для каждого компьютера особо.
Появление персональных компьютеров и таких программ, как VisiCalc, вынуло компьютеры из рук инженеров и поместило их на столы пользователей. Пользователи стали доверять готовым прикладным программам, они, не задумываясь, запускали программу, не имея представления о ее содержимом, поскольку не обладали достаточной для этого квалификацией.
Я уже говорил о вирусах и троянских конях; они распространились потому, что люди обменивались копиями готовых программ (иногда нелегально), не беспокоясь о проблемах безопасности. Антивирусные средства помогли решить проблему, и на протяжении последних 20 лет пользователи безоговорочно доверяли программному обеспечению.
Однако с появлением Интернета эта прочно укоренившаяся вера стала создавать крупные проблемы.
В предыдущем разделе я объяснил, почему появление сетей сделало разрушительные программы более опасными. Там приведены и примеры переносимого кода и связанные с ними проблемы. К сожалению, существуют и более серьезные неприятности.
С появлением модульных программ все больше фрагментов программного обеспечения рассылается по Интернету. Сейчас любое ваше приобретение с большой вероятностью получено с веб-сайта: новый дополнительный модуль для браузера, драйвер для принтера, блестящая утилита или апплет на Java, который делает какие-то классные штучки. Поэтому вам следует задать себе следующие важные вопросы. Надежна ли эта программа? Надежен ли этот веб-сайт? Можно ли быть уверенным, что эта программа будет правильно взаимодействовать с остальным содержимым компьютера? И какая есть защита на случай, если эта программа окажется разрушительной? Редко встречаются пользователи, которые задаются подобными вопросами, но еще реже – те, которые могут на них ответить.
JavaScript, Java и ActiveX
JavaScript, Java, ActiveX и загружаемые дополнительные модули – все они имеют различные модели защиты. Я по очереди расскажу о каждом из них.
JavaScript – это язык сценариев Netscape, при помощи которого можно вставлять фрагменты кода на веб-страницу. Его поддерживают все основные браузеры. Его сходство с Java исчерпывается первыми четырьмя буквами. При помощи программы на JavaScript можно проделывать обычные простые действия: открывать и закрывать окна, изменять формы на веб-страницах, настраивать параметры браузера и т. п. Все, чем докучают некоторые веб-сайты при попытке закрыть их страницы, – это тоже JavaScript[32].
Сам по себе JavaScript достаточно безвреден, но именно он лежит в основе множества атак всех видов, предпринятых за последние несколько лет. Приведу несколько примеров: 1997 год – контроль посещаемости сайтов пользователями; 1998 – чтение случайно выбранных файлов на машине пользователя; тот же 1998 – перехват адреса электронной почты пользователя. Для большинства этих атак требуется слегка обмануть пользователя, заставив его сделать незначительную глупость, но это и не сложно. Недостатки в обеспечении безопасности браузеров, допускавшие такие атаки, были выявлены довольно быстро и устранены. Но регулярно обнаруживаются новые «дыры».
В ActiveX применяется защита при помощи подписывания кода. По сути, у каждого фрагмента кода ActiveX, называемого «control», проверяется цифровая подпись. (Microsoft вводит для этого понятие кода аутентичности.) После этого браузер открывает диалоговое окно и показывает пользователю имя программиста или компании, которые подписали код. Если пользователь соглашается принять код, программа загружается в браузер.
Любой подросток, к которому на вечеринку заявлялись случайные гости не лучшего сорта, знаком с этой проблемой. Безопасность системы полностью находится в руках пользователя. Как только код ActiveX проникает на машину пользователя, он может сделать все что угодно: переформатировать жесткий диск, изменить ваши однодолларовые ставки в тотализаторе на стодолларовые, собрать все ваши полные чувств любовные письма и послать их кинопродюсеру в Лос-Анджелес и пр. и пр.
Microsoft возразила, что подписи, конечно, будут указывать на автора, но это знание будет небольшим утешением человеку, у которого только что «рухнул» компьютер. Это все равно, что обязать преступников носить визитные карточки и перестать запирать двери на замок. «Мы сожалеем, что они вошли в ваш дом, съели всю вашу еду, сломали всю вашу мебель и унесли все ваши ценности. Но, по крайней мере, мы знаем, кто они». Причем в случае Интернета может быть такое уточнение: «Это были два подростка из страны, с которой у США нет договора об экстрадиции. Вам стало легче?» Кроме того, предполагается, что вы сможете определить, какая именно программа из десятков имеющихся у вас на жестком диске вызвала проблемы. Один исследователь показал, что при соединении двух безвредных средств управления ActiveX они способны стать разрушительными; и кто будет виноват в этом случае?
Существуют и более серьезные проблемы. В главе 17 подробно рассказывается о том, насколько сомнительно, что пользователи примут правильное и безопасное решение, здесь же достаточно сказать, что большинство людей не беспокоятся о том, каким средствам ActiveX можно доверять, а каким – нет. А это предполагает наличие инфраструктуры открытого ключа (PKI), поддерживающей подписи, о чем я еще буду сокрушаться в главе 15. Существует много возможностей обмануть PKI и заставить ее поверить, что средство управления подписано, когда это не так.
На самом деле ActiveX – это расширение старой системы компонентов Microsoft, так называемой DCOM. Это система, при помощи которой, например, Internet Explorer открывает и показывает таблицы Excel. Большинство используемых программами DLL на самом деле служат только транспортным средством для объектов DCOM. Explorer просто вставляет внутреннее содержимое книги Excel посредством DCOM и ActiveX. Это – невероятно мощная система, более гибкая, более доступная, более интересная архитектурно и невообразимо более опасная, чем аналогичные способы в других операционных системах.
В Java применяется совершенно иная модель. Это – просто язык программирования, специально разработанный для переносимого кода, создатели которого не забывали и о безопасности. Программы Java, запускаемые при помощи веб-браузера, называются апплетами, и им для работы отводится определенный участок памяти, «песочница», которая позволяет ограничить возможные повреждения. «Песочницы» защищаются по трем схемам.
Во-первых, существует так называемый верификатор байтового кода. При каждой загрузке апплета Java верификатор байтового кода сначала проверяет программу. Верификатор гарантирует, что байтовый код имеет правильный формат и не создаст каких-либо общих проблем.
Во-вторых, имеется загрузчик класса. Этот компонент определяет, как и когда апплет может быть добавлен к среде Java. Его задача – убедиться, что апплет не заменит уже существующую важную программу.
И в-третьих, есть администратор безопасности. Это устройство чем-то похоже на мониторы обращений, о которых шла речь в главе 8; к нему обращаются всякий раз, когда апплеты Java пытаются проделать что-то потенциально опасное: открыть файл, установить связь с сетью и т. д. В зависимости от способа установки апплета эти операции будут или разрешены, или запрещены. (Например, апплет, загруженный по Сети, имеет больше ограничений, чем апплет, установленный на компьютер при покупке операционной системы.)
Модель «песочницы» слишком сложна, но это лучшее, что у нас есть в настоящее время. Последние версии Java имели две модификации – хорошую и плохую. В Java 1.1 реализовано подписывание кода, что роднит его с ActiveX. Апплеты, которым пользователи доверяют, могут выходить за пределы «песочницы» и без ограничений работать на машине пользователя. Нужно ли говорить, насколько при этом делаются актуальными все проблемы безопасности модели ActiveX?
В Java 2 усовершенствована модель «песочниц». Вместо подхода «все или ничего» – или в «песочнице», или за ее пределами – Java 2 обеспечивает большую гибкость модели безопасности. Апплеты получают именно такие полномочия, которые необходимы для выполнения их работы. Например, один апплет может иметь доступ к файловой системе компьютера, но не иметь сетевого доступа. Другому разрешен сетевой доступ, но запрещен доступ к файловой системе. Третий апплет может иметь только доступ к определенной части файловой системы. То есть каждому апплету предназначается своя «песочница». Такая система работает намного лучше, но, как оказалось, она сложна в использовании.
Дополнительные модули хуже всего, поскольку они автоматически считаются надежными. Это – программные модули, которые вы можете добавить к своему браузеру, чтобы расширить его функциональные возможности, например средства просмотра файлов формата PDF, медиапроигрыватели или что-нибудь еще. У них нет никакой системы безопасности. Если вы их загружаете и устанавливаете, значит, вы им доверяете. Точка.
Безопасность Веб
HTTP (протокол, используемый в Веб), как и большая часть информации, блуждающей в Интернете, незашифрован и неаутентифицирован. Многие боятся доверять номера своих кредитных карт незашифрованной веб-связи. (Я не думаю, что в этом есть смысл, но кое-что я бы посылать по Сети незашифрованным не стал.) Чтобы решить эту проблему, в ранние версии Netscape Navigator включали специальный протокол, так называемый SSL. Этот протокол, который был со временем переименован в TLS, обеспечивает шифрование и аутентификацию веб-связи. SSL довольно хорош, и все его проблемы касаются сертификатов и их применения (подробности – в главе 15). Некоторые веб-сайты предоставляют вам возможность выбрать защищенный SSL сеанс связи с браузером. (Веб-страница должна иметь этот параметр; браузер не будет использовать SSL, если на сервере нет соответствующих установок.) Браузер и веб-сервер применяют шифрование открытым ключом для обмена ключами и симметричное шифрование для кодирования данных. Присутствие в нижней части браузера зеленого ключа или желтого замка дает пользователю возможность почувствовать себя намного свободнее.
Однако нельзя упускать из виду, что пока пользователь не проверит вручную присланный сервером сертификат, он не имеет ни малейшего представления о собеседнике. Я повторяю, SSL устанавливает безопасную связь между браузером и кем-то на другом конце соединения. Если пользователь не проверит, кто находится на другом конце соединения, он не будет знать, с кем он секретничает. Представьте себе, что двое незнакомых друг с другом людей входят в абсолютно темную комнату со звуконепроницаемыми стенами. Они знают, что их разговор никто не подслушает. Но кто доверит свои секреты незнакомцу? Это одна из проблем, возникающих при использовании SSL-сертификатов.
Кроме того, SSL не обеспечивает защиты данных на сервере. В начале 2000 года хакеры неоднократно взламывали веб-сайты и крали информацию: номера кредитных карт, информацию о лицевых счетах и многое другое. SSL не в состоянии это предотвратить.
Взлом URL
На унифицированный указатель информационного ресурса (URL) направлен целый ряд атак, некоторые из них рассчитаны на ошибку пользователя, а некоторые – просто на его необразованность. Первый класс – это атаки, при которых разные серверы крадут трафик друг у друга. Может быть, на ваш взгляд, это ерунда – зачем веб-сайту, продающему водопроводное оборудование, трафик веб-сайта финансовых новостей, – но некоторые сайты, например порнографические, таким образом хотят повысить посещаемость своих страниц.