В отношении прослушивания сетевого трафика подключаемыми извне устройствами существует следующий список кабельных соединений по возрастанию сложности их прослушивания :
невитая пара – сигнал может прослушиваться на расстоянии в несколько сантиметров без непосредственного контакта;
витая пара – сигнал несколько слабее, но прослушивание без непосредственного контакта также возможно;
коаксиальный провод – центральная жила надежно экранирована оплеткой : необходим специальный контакт, раздвигающий или режущий часть оплетки, и проникающий к центральной жиле;
оптическое волокно – для прослушивания информации необходимо вклинивание в кабель и дорогостоящее оборудование, сам процесс подсоединения к кабелю сопровождается прерыванием связи и может быть обнаружен, если по кабелю постоянно передается какой-либо контрольный блок данных.
Вывод систем передачи информации из строя (атака класса "отказ в сервисе") на уровне среды передачи информации возможен, но обычно он расценивается уже как внешнее механическое или электронное (а не программное) воздействие. Возможны физическое разрушение кабелей, постановка шумов в кабеле и в инфра- и радиотрактах.
Сетевой уровень отвечает за систему уникальных имен и доставку пакетов по этому имени, то есть за маршрутизацию пакетов. Примером такого протокола является протокол Интернета IP. Все атаки, основанные на заведомо неправильной маршрутизации пакетов, мы уже рассмотрели.
Транспортный уровень отвечает за доставку больших сообщений по линиям с коммутацией пакетов. Так как в подобных линиях размер пакета представляет собой обычно небольшое число (от 500 байт до 5 килобайт), то для передачи больших объемов информации их необходимо разбивать на передающей стороне и собирать на приемной. Транспортными протоколами в сети Интернет являются протоколы UDP и TCP. Реализация транспортного протокола – довольно сложная задача, а если еще учесть, что злоумышленник придумывает самые разные схемы составления неправильных пакетов, то проблема атак транспортного уровня вполне объяснима.
Все дело в том, что пакеты на приемную сторону могут приходить и иногда приходят не в том порядке, в каком они были отправлены. Причина обычно состоит в потере некоторых пакетов из-за ошибок или переполненности каналов, реже – в использовании для передачи потока двух альтернативных путей в сети. А следовательно, операционная система должна хранить некоторый буфер пакетов, дожидаясь прихода задержавшихся в пути. А если злоумышленник с умыслом формирует пакеты таким образом, чтобы последовательность была большой и заведомо неполной, то тут можно ожидать как постоянной занятости буфера, так и более опасных ошибок из-за его переполнения.
Сеансовый уровень отвечает за процедуру установления начала сеанса и подтверждение (квитирование) прихода каждого пакета от отправителя получателю. В сети Интернет протоколом сеансого уровня является протокол TCP (он занимает и 4, и 5 уровни модели OSI). В отношении сеансового уровня очень широко распространена специфичная атака класса "отказ в сервисе", основанная на свойствах процедуры установления соединения в протоколе TCP. Она получила название SYN-Flood (зд. flood – англ. "большой поток").
При попытке клиента подключиться к серверу, работающему по протоколу TCP (а его используют более 80% информационных служб, в том числе HTTP, FTP, SMTP, POP3), он посылает серверу пакет без информации, но с битом SYN, установленным в еденицу в служебной области пакета – запросом на соединение. По получении такого пакета сервер обязан выслать клиенту подтверждение приема запроса, после чего с третьего пакета начинается собственно диалог между клиентом и сервером. Одновременно сервер может поддерживать в зависимости от типа сервиса от 20 до нескольких тысяч клиентов.
При атаке типа SYN-Flood злоумышленник начинает на своей ЭВМ создавать пакеты, представляющие собой запросы на соединение (то есть SYN-пакеты) от имени произвольных IP-адресов (возможно даже несуществующих) на имя атакуемого сервера по порту сервиса, который он хочет приостановить. Все пакеты будут доставляться получателю, поскольку при доставке анализируется только адрес назначения. Сервер, начиная соединение по каждому из этих запросов, резервирует под него место в своем буфере, отправляет пакет-подтверждение и начинает ожидать третьего пакета клиента в течение некоторого промежутка времени (1-5 секунд). Пакет-подтверждение уйдет по адресу, указанному в качестве ложного отправителя, в произвольную точку Интернета и либо не найдет адресата вообще, либо чрезмерно "удивит" операционную систему на этом IP-адресе (поскольку она никаких запросов на данный сервер не посылала) и будет просто проигнорирован. А вот сервер при достаточно небольшом потоке таких запросов будет постоянно держать свой буфер заполненным ненужным ожиданием соединений, и даже SYN-запросы от настоящих легальных пользователей не будут помещаться в буфер : сеансовый уровень просто не знает и не может узнать, какие из запросов фальшивые, а какие настоящие и могли бы иметь больший приоритет.
Атака SYN-Flood получила довольно широкое распространение, поскольку для нее не требуется никаких дополнительных подготовительных действий. Ее можно проводить из любой точки Интернета в адрес любого сервера, а для отслеживания злоумышленника потребуются совместные действия всех провайдеров, составляющих цепочку от злоумышленника до атакуемого сервера (к чести сказать, практически все фирмы-провайдеры, если они обладают соответствующим программным обеспечением и квалифицированным персоналом, активно участвуют в отслеживании атакующей ЭВМ по первой же просьбе, в том числе и от зарубежных коллег).
Операционная система является важнейшим программным компонентом любой вычислительной машины, поэтому от уровня реализации политики безопасности в каждой конкретной ОС во многом зависит и общая безопасность информационной системы. В данном параграфе будет приведен краткий обзор основных современных операционных систем. В первую очередь нас будут интересовать безопасное разделение оперативной памяти и файлов между процессами и пользователями и устойчивость ОС к сетевым атакам.
Операционная система MS-DOS является ОС реального режима микропроцессора Intel, а потому здесь не может идти речи о разделении оперативной памяти между процессами. Все резидентные программы и основная программа используют общее пространство ОЗУ. Защита файлов отсутствует, о сетевой безопасности трудно сказать что-либо определенное, поскольку на том этапе развития ПО драйверы для сетевого взаимодействия разрабатывались не фирмой MicroSoft, а сторонними разработчиками.
Семейство операционных систем Windows 95, 98, Millenium – это клоны, изначально ориентированные на работу в домашних ЭВМ. Эти операционные системы используют уровни привилегий защищенного режима, но не делают никаких дополнительных проверок и не поддерживают системы дескрипторов безопасности. В результате этого любое приложение может получить доступ ко всему объему доступной оперативной памяти как с правами чтения, так и с правами записи. Меры сетевой безопасности присутствуют, однако их реализация не на высоте. Более того, в версии Windows 95 была допущена основательная ошибка, позволяющая удаленно буквально за несколько пакетов приводить к "зависанию" ЭВМ, что также значительно подорвало репутацию ОС, в последующих версиях было сделано много шагов по улучшению сетевой безопасности этого клона.
Поколение операционных систем Windows NT, Windows 2000 уже значительно более надежная разработка компании MicroSoft. Они явялются действительно многопользовательскими системами, надежно защищающими файлы различных пользователей на жестком диске (правда, шифрование данных все же не производится и файлы можно без проблем прочитать, загрузившись с диска другой операционной системы, например MS-DOS). Данные ОС активно используют возможности защищенного режима процессоров Intel и могут надежно защитить данные и код процесса от других программ, если только он сам не захочет предоставлять к ним дополнительного доступа извне процесса.
За долгое время разработки было учтено множество различных сетевых атак и ошибок в системе безопасности. Исправления к ним выходили в виде блоков обновлений (англ. service pack). На сегодняшний день для Windows NT 4.0 самым последним является обновление "Service Pack 6", естественно все исправления, включенные в него были, учтены и при разработке Windows 2000. Таким образом, две эти операционные системы имеют примерно равную (и очень высокую) систему безопасности.
Другая ветвь клонов растет от операционной системы UNIX. Эта ОС изначально разрабатывалась как сетевая и многопользовательская, а потому сразу же содержала в себе средства информационной безопасности. Практически все широко распространенные клоны UNIX прошли долгий путь разработки и по мере модификации учли все открытые за это время способы атак. Достаточно себя зарекомендовали : LINUX (S.U.S.E.), OpenBSD, FreeBSD, Sun Solaris. Естественно все сказанное относится к последним версиям этих операционных систем. Основные ошибки в этих системах относятся уже не к ядру, которое работает безукоризненно, а к системным и прикладным утилитам. Наличие ошибок в них часто приводит к потере всего запаса прочности системы.
Ошибки в прикладном программном обеспечении были и остаются основным путем проникновения злоумышленника как на сервера, так и на рабочие станции. Объективная причина этого – разработка подобного ПО различными группами разработчиков, которые просто не в состоянии уделить должного внимания сетевой и локальной безопасности своего продукта. И если фирмы-разработчики операционных систем тратят огромные суммы на тщательные испытания поведения их программ в нестандартных ситуациях, а также активно учитывают многолетний опыт своих же ошибок, то для небольших фирм это просто не под силу, да и крайне невыгодно экономически.
Ошибки активно ищутся группами "хакеров" практически во всем более или менее распространенном ПО, однако наибольшую известность приобретают, конечно, исследования программ, установленных почти у каждого пользователя. Так, например, в одной из недавних версий MicroSoft Internet Explorer'а была обнаружена ошибка, связанная с переполнением буфера, которая приводила к тому, что часть URL-адреса попадала на "исполнение" и трактовалась как последовательность команд процессора. При этом длины этого участка хватало, например, для того, чтобы загрузить на ЭВМ из сети троянскую программу и передать ей управление. В последующей версии ошибка была исправлена. Программа ICQ – самый популярный электронный пейджер в сети Интернет – в очередной своей версии была снабжена своими создателями возможностью поддерживать миниатюрный WWW-сервер. Однако ошибка в его реализации позволяла при добавлении слева точек в имени первого каталога получать доступ ко всем файлам жесткого диска – открывался полный (!) сетевой доступ по чтению.
Многие атаки используют не только непосредственные ошибки в реализации ПО, но и непродуманные разработчиками аспекты использования стандартных возможностей программы. Так, пожалуй, самым ярким примером этого являются MACRO-вирусы в документах системы MicroSoft Office. Возможность исполнения макросов была встроена в эту систему из самых благих побуждений, но тот факт, что макросы могут запускаться на определенные события (например открытие документа) и получать доступ на модификацию к другим документам, сразу же был использован создателями вирусов отнюдь не в благих целях.
К подобным же примерам следует отнести возможность запуска исполнимых DLL-файлов из HLP-файлов. Казалось бы, открывается безобидный текстовый файл справки, а оказывается, он может честно инициировать вызов из прилагающейся DLL-библиотеки, да еще и безо всякого уведомления об этом пользователя.
Моралью этого параграфа является правило "семь раз отмерь – один отрежь" на этапе разработки собственного программного обеспечения.
Двумя основными классами ошибок при разработке программного обеспечения, приводящими к потенциальной возможности проведения атак на информацию, являются интерференция данных и нарушение неявных ограничений.
Интерференция (то есть непредусмотренное взаимодействие) данных между собой и данных с кодом является менее распространенным, но более опасным синдромом, чем описываемая ниже проблема ограничений по умолчанию. Практически единственным способом вызвать наслоение данных друг на друга либо данных на код программы является попытка дойти при операции записи до границы области памяти, отведенной под данный блок информации, и преодолеть ее – то есть умышленное переполнение буфера. Естественно, что это возможно только в тех ситуациях, когда программный код не производит проверки длины записываемого значения.
Для целых и дробных чисел, значений времени и тому подобных типов данных запись производится всегда в фиксированном объеме (2 байта, 4 байта, 10 байт). А вот для строк и массивов данных проверки длины перед операциями записи необходимы. Для того чтобы заставить ЭВМ выполнить код или записать данные туда, куда у него нет прав записи, злоумышленник специально заставляет систему обрабатывать строки очень большой длин, либо помещать в массив количество элементов большее, чем его объем. В случае успеха возможно либо попадание части строки в сегмент кода или стека с последующим исполнением, либо модификация каких-либо служебных данных, что позволит затем злоумышленнику войти в систему в обход системы защиты. Естественно, что содержимое конца строки (оказывающееся после переполнения буфера в ненадлежащей области памяти) подбирается специальным образом. Сами данные или строки могут быть абсолютно бессмысленными.