Философия и архитектура NT против UNIX с точки зрения безопасности

Введение

Степень защищенности вашего компьютера во многом зависит от совершенства установленной на нем операционной системы.Несколько утрируя можно сказать: что максимально достижимаязащищенность узла никогда не превосходит степени защищенности самой ОС(разумеется, при условии, что узел не оснащен никакими внешнимизащитами, такими например, как брандмаузер).

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

а) такого тестирования еще никто не проводил, во всяком случае,материал найденный по этой теме в Сети, носит субъективный иповерхностный характер, сильно завязанный на непринципиальныхнедостатках конкретных реализаций ОС, большая часть из которыхдавным-давно исправлена очередной заплатой;

б) если семейство NT представлено всего тремя операционнымисистемами: самой NT, Windows 2000 и Windows XP с практическиидентичными архитектурами, то пестрота UNIX-подобных систем вообще неподдается описанию;

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

Поэтому мы решили абстрагироваться от особенностей конкретных реализаций, и сравнить потенциальную концептуальную уязвимость операционныхсистем семейств NT и UNIX. Что такое потенциальная уязвимость? Этотакое свойство архитекторы системы, которое при определенныхобстоятельствах с той или иной вероятностью может привести к снижениюстепени ее защищенности. В частности, сложность считается однойиз потенциальных концептуальных уязвимостей и при прочих равныхусловиях менее сложная система объявляется более защищенной и,соответственно, наоборот. Кончено, помимо сложности (кстати, уровеньсложности измеряется не объемом программного кода, а количествомвзаимосвязей между отдельными компонентами программы), большую рольиграет профессионализм разработчиков, качество тестирования и т. д.Однако, поскольку все эти факторы практически не поддаются объективномуучету (только не надо пожалуйста говорить, что LINUX тестируют миллионылюдей по всему миру, – знаем-знаем мы как они ее тестируют), лучше их вообще учитывать, чем учитывать неправильно.

Так же, мы будет рассматривать лишь концептуальные уязвимости, -т. е. такие, которые настолько глубоко зарыты в системе, что безсерьезного хирургического вмешательства в архитектуру ядра их неудалить. (Да и не получим ли мы после такой операции совершенно другую операционную систему?).

Философские концепции

Open Source vs дизассемблер

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

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

Действительно, защитный механизм, принцип действия которогонеизвестен, может быть взломан только грубой силой, то есть имеетвполне предсказуемую степень защищенности. Поэтому, любая мало-мальскисерьезная акция начинается с изучения атакуемого объекта (целенаправленный взлом).Отсюда: при прочих равных условиях степень защищенности системы обратнопропорционально легкости анализа ее кода. А легкость самого анализа впервую очередь определяется доступностью исходных текстов защитногомеханизма!

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

Как следствие: количество дыр, обнаруженных в NT за все времяее существования, можно свободно пересчитать по пальцам одной руки(причем, большая часть из них была обнаружена практически случайно). ВUNIX же, напротив, дыры обнаруживаются постоянно. С другой стороны..

Каждому хакеру – по системе!

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

В результате, могущество хакера, нашедшего дыру в UNIX,оказывается много ниже, чем если бы дыра аналогичных размеров былаобнаружена в NT (в силу не многочисленности своих разновидностей,каждая, отдельно взятая версия NT, установлена на значительно большемколичестве машин, нежели UNIX). Именно поэтому NT все-таки ломают иливо всяком случае пытаются это сделать. Соблазн в самом деленастолько велик, что хакеров не останавливают ни отсутствие исходныхтекстов, ни трудоемкость анализа. К тому же, ядро NT не переписываетсякаждый день и практически все дыры, обнаруженные в NT 4.0 остаютсяактуальными и в Windows 2000, а то и в Windows XP. (Подробнее об этомрассказывается в книге Криса Касперски Техника сетевых атак).

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

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

Неплохая идея: на передний план обороны водрузить какой-нибудьредкоземельный клон UNIX, а на второй – NT. Большинство хакеров, какпоказывает практика, в основном специализируются на одной операционнойсистеме, и лишь в исключительных случаях – на двух сразу.

UNIX – это просто!

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

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

Между тем, ошибки крайне неоднородны по своей природе: однилежат, что называется на поверхности, и обнаруживаются дажеавтоматизированными средствами контроля качества кода; другие же,напротив, зарыты так глубоко, что найти их можно только случайно.Фундаментальная проблема отладки заключается в том, что любая, дажесамая незначительная модификация программного кода, чревата появлениемкаскада ошибок, возникающих в самых неожиданных местах. И потому,внесение каких бы то ни было изменений во внутренности операционнойсистемы и/или сопутствующих ей приложений должно сопровождаться полнымциклом повторного тестирования. Но ведь полное тестирование, как ужебыло показало выше, выполнить просто невозможно!

Чрезмерная сложность NT вкупе с огромным количеством изменений,вносимых в код каждой новой версии, собственно и объясняют скверноекачество ее тестирования. Несмотря на все усилия, предпринимаемыеMicrosoft, уязвимость NT заложена уже в самой политике ее развития, апотому является принципиально неустранимой, т.е. фундаментальной.

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

Удаленный доступ: оружие пролетариата?

Одно из концептуальных отличий философии NT от UNIX заключается втом, что UNIX не делает практически никаких различий между локальным иудаленным доступом к машине. В NT же, напротив, лишь некоторыедействия могут быть выполнены удаленно, а для полноценного управлениясервером администратор вынужден прибегать к физическому доступу.

Никто не спорит – удаленно управлять сервером очень удобно, нодавайте задумаемся – насколько это безопасно? Увы, никакое удобство непроходит даром! Что комфортно администрировать, то комфортно иатаковать! Этому, кстати, будут способность и продвинутые командныеинтерпретаторы, поддерживающие полноценные языки программирования,разительно отличающие от того уродства, что переваривает примитивнаяоболочка NT. Вообще же, в NT удаленным доступом очень мало что можносделать (правда, начиная с Windows 2000 в ней все-таки появилось болееили менее совершенные механизмы удаленного управления).

Тем не менее не стоит впадать в крайности и полностьюотказываться от возможности удаленного администрирования. Конечно,полностью запретив удаленный доступ вы в значительной степени усилитезащищенность своего сервера, но. при этом будете вынуждены постояннонаходится непосредственно рядом с сервером. Спрашиваете: зачем? А ктохакеров будет гонять?! Ведь проникнуть на атакуемую машину можно черезлюбой, установленный на ней сервис (скажем, WEB) и потому крайненежелательно лишать себя всех средств дистанционного мониторинга иуправления сервером.

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

Комплектность штатной поставки

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

Операционные системы семейства NT, укомплектованные более чемскромным набором утилит, в этом отношении выглядят более защищенными.Впрочем, это непринципиальное различие: грамотный администратор и такудалит из UNIX все лишнее.

Архитектурные концепции

Механизмы аутентификации

Механизмы аутентификации пользователей (то есть, попросту говоряалгоритмы проверки правильности пароля) и в UNIX, и в NT построены напрактически идентичных принципах. А именно: эталонный пароль вообщенигде не хранится, – вместо этого используется его хэш (грубо говоря:контрольная сумма). Пользователь вводит пароль, операционная системахэширует его по тому или иному алгоритму и сравнивает полученныйрезультат с хэш-суммой эталонного пароля, хранящейся в специальной базепаролей. Если они совпадают, то все ОК и, соответственно, наоборот.Такая схема (при отсутствии ошибок реализации, конечно) гарантирует,что даже если злоумышленник и получит доступ к базе паролей, он всеравно не сможет проникнуть в систему иначе, чем методом перебора.Впрочем, если спуститься с небес идеализированных математическихконцепций на грешную землю, можно обнаружить, что нормальные героивсегда идут в обход. В частности, в большинстве UNIXов вводимыйпароль открытым текстом передается по сети и при наличии хотя бы одногоуязвимого узла в цепочке передачи, может быть перехвачен хакером. В NTже открытый пароль никогда не передается (ну, разве что администраторне настроит ее соответствующим образом) и используемая в ней схемааутентификации устойчива к перехвату трафика.

С другой стороны, NT крайне небрежно относится к охранепарольной базы от посягательств хакеров. На первый взгляд кажется, чтоникакой проблемы вообще нет, т. к. доступ к базе имеется лишь усистемы, администраторов и ограниченного количества специальноназначенных администратором пользователей (например, операторов архива,периодически сохраняющих базу на резервных носителях). А вот внекоторых, правда, довольно немногочисленных UNIXах файл паролейсвободно доступен всем пользователям системы и зачастую даже виден посети! Ну и что с того? – спросите вы. – Ведь паролей в парольном файлевсе равно нет, а обращение хеша методом перебора занимает слишкоммного времени, пускай хакер перебирает, если ему это занятие такнравится. Хорошо, тогда такой вопрос: возможно ли в одном единственномпереборе взломать все машины в сети? Не спешите отвечать нет, ибоправильный ответ: да! Объем жестких дисков сегодня возрос настолько,что хакер может сохранить хеши всех перебираемых паролей. Неважносколько это займет времени: месяц или даже несколько лет, – ведь теперьу взломщика появится возможность практически мгновенновосстановить пароль по его хешу – была бы только парольная база вруках! Мало того, что в NT резервные копии парольной базы по умолчаниюхранятся в общедоступных каталогах, так алгоритм аутентификации неиспользует привязки (salt), в результате чего хеши одинаковых паролей вNT всегда будет совпадать, значительно упрощая тем самым взлом!Впрочем, от атак данного типа привязка все равно не спасает, разве чтонемного продляет мучения системы.

Повышение своих привилегий

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

а) модель пользователей должна быть достаточно гибкой, удобнойи интуитивно понятной, в противном же случае ошибки администрирования -неизбежны;

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

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

Анализ показывает, что перечисленные выше требования невыполняются ни в одной ОС массового назначения, а потому все они в тойили иной степени заведомо уязвимы. Между тем, степень защищенности UNIXи NT различна.

Модель привилегий пользователей, применяемая в большинстве UNIX, является одноуровневойи допускает существование только двух типов пользователей: обычныепользователи и суперпользователь (он же root или администратор). В NTже, напротив, используется иерархическая схема, причем, помимо rootа вней имеется еще один суперпользователь, – система. Что этоозначает? А то, что в NT, в отличии от UNIX, каждый пользовательполучает минимум необходимых ему прав и никогда не повышает уровеньсвоих привилегий без особой необходимости. Широко распространенноезаблуждение гласит, что правильное администрирование UNIX позволяетдобиться такого же точно распределения прав доступа, как и в NT, пускайи ценой большего времени и усилий. На самом же деле это не так.

Отсутствие системного пользователя в UNIX приводит кневозможности выполнения целого ряда действий иначе, чем временнымповышением привилегий запущенной программы до roota. Взять хотя быклассическую задачу смены пароля. Пользователи могут (и должны!)периодически менять свои пароли. Но ведь в UNIX (как впрочем и в NT)пароли всех пользователей хранятся в одном файле, причем, используемаямодель привилегий не позволяет назначать различным частям файларазличные права доступа. Но ведь должен пользователь как-то изменятьсвой пароль, верно? В UNIX эта задача решается так: утилите,ответственной за смену пароля, присваивается специальный атрибут,позволяющий ей при необходимости получать права rootа, что она,собственно, и делает. Если бы этот механизм использовался только приоперациях с паролями большой беды и не было бы. На самом же деле, такойатрибут необходим очень большому количеству приложений, в частности WEBи e-mail серверам. Задумайтесь, что произойдет, если в одной изпрограмм, исполняющихся с наивысшими привилегиями, обнаружится ошибка,так или иначе приводящая к возможности передачи управления хакерскомукоду? А ведь такие ошибки сыплются из UNIXых программ как из рогаизобилия!

Совершенно иная ситуация складывается в среде NT.Непривилегированные пользователи только в исключительных случаяхвынуждены повышать свои права до уровня администратора, а все остальноевремя они пользуются API-функциями операционной системы, выполняющимипотенциально опасные действия руками самой ОС. Даже если в одном изтаких приложений будет допущена ошибка и хакер захватит управление, -он унаследует минимум прав и причинит система минимум вреда.

Таким образом, NT устойчива к программистским ошибкам, а UNIX чрезвычайно чувствительна к ним.

Угроза переполнения буфера

Переполнение буфера – наиболее популярная и в то же время наиболеековарная ошибка, которой не избежало практически ни одно сколь ни будьсложное приложение. Коротко объясним ее суть: если размера выделенногопрограммистом буфера вдруг окажется недостаточно для вмещения всех,копируемых в него данных, то содержимое памяти за концом буфераокажется разрушено (а точнее – замещено) не вместившимися в буферданными. В зависимости от ситуации за концом буфера могут находится:

а) другие буфера и переменные программы;

б) служебные данные – в частности, адрес возврата из функции;

в) исполняемый код;

г) незанятая или д) отсутствующая страница памяти.

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

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

Все системы: и UNIX, и NT потенциально допускают существованиепунктов а), б), г) и д), исключая лишь единственный из них – пункт в).Следовательно, они в равной мере подвержены угрозе переполнения буфера.Кроме того, и UNIX, и NT имеют исполняемый стек (то есть разрешаютвыполнение кода в стеке) и запрещают его выполнение в сегменте данных.А это значит, что переполнение буферов, содержащихся в автоматических(т.е. стековых) переменных несет в себе угрозу полного захватауправления над уязвимой программой. Правда, для некоторых UNIXсуществуют заплаты, отнимающие у стека право выполнения, но сфера ихприменения весьма ограничена (исполняемый стек необходим множествувполне легальных программ, в частности, компиляторов).

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

Доступ к чужому адресному пространству

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

Полноценной защиты от предумышленного доступа в чужое адресное пространство ни в UNIX, ни в NT на самом деле нет.Собственно, UNIX вообще не представляет никаких средств такоговзаимодействия, кроме разве что разделяемых (т. е. совместноиспользуемых) областей памяти, но это совсем не то. NT же обеспечиваетвесьма гибкий контроль доступа адресному пространству процессоров, новсе-таки значительно проигрывает UNIX в отношении безопасности. И вотпочему:

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

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

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

Межпроцессорные коммуникации

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

а) самостоятельно решать с кем ему взаимодействовать, а с кем нет;

б) уметь определять подлинность процессов отправителей и процессов получателей;

в) контролировать целостность передаваемых/принимаемый данных;

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

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

Неименованные каналы позволяют связывать лишь родственныепроцессы и потому полностью отвечают условию пункта а). Даже еслипосторонний процесс каким-либо образом ухитриться получить дескрипторнеименованного канала не родственного ему процесса, то он (дескриптор)вне контекста своего процесса потеряет всякий смыл и ничего пакостногос ним злоумышленник не сможет сделать. Если же злоумышленник проникнетв родственный процесс и попытается, скажем, облить своего соседатолстой струей информационного мусора, то. ничего не произойдет. Еслипроцесс-читатель не будет успевать заглатывать посылаемые ему данные,система автоматически приостановит процесс передачи, не даваяатакуемому процессу захлебнуться. Причем, жертва вольна сама решать -выносить ли ей такие издевательства дальше или же просто закрыть канали послать невоспитанного хакера куда подальше.

Именованные каналы доступны всем процессам в системе, ав NT и процессам, исполняющимся на остальных узлах сети. Естественно,для открытия именованного канала необходимо иметь соответствующиепривилегии, но вот для создания нового именованного канала такиепривилегии необязательны, причем под NT не существует легальныхспособов определения авторства создателя того или иного канала!Учитывая, что именованные каналы активно используются системой дляпередачи зашифрованных паролей и удаленного управления реестром, угрозавнедрения подложных каналов уже не покажется незначительной. Частичноэта проблема решается установкой соответствующего пакета обновления (вчастности для Windows 2000 это Service Pack 2), который предотвращаетсоздание подложного экземпляра уже существующего именованногоканала, между тем возможность создать подложный канал с нуля попрежнему остается, а механизмов идентификации создателей канала в win32API как не было, так до сих пор и нет. Локальность именованных каналовв UNIX оказывается одновременно и сильной, и слабой ее стороной. Тем неменее, отсутствие удаленного доступа к каналам еще не дает поводарасслабляться, – ведь создать подложный канал может даже гостевойпользователь, что в ряде случаев позволяет ему успешно атаковать болеепривилегированные процессы.

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

Сокеты, использующиеся в основном в межузловыхмежпроцессорных взаимодействиях (хотя в UNIX они широко применяются идля локального обмена данными), так же катастрофически незащищены передпопыткой захвата всех свободных ресурсов и огромное количествопостоянно совершающихся flooding-атак – лучшее тому подтверждение.Кстати, наличие сырых (RAW) сокетов в UNIX делает ее платформой номеродин для любой мало-мальски серьезной TCP/IP-атаки. Системы семействаNT долгое время вообще не позволяли вручную формировать сетевыепакеты и потому атаки типа Land, Teardrop и Bonk осуществить с ихпомощью было невозможно (правда, это еще не означает, что NT устойчивак таким атакам). Не этим ли обстоятельством вызвана патологическаялюбовь большинства хакеров к UNIX? Правда, сегодня только ленивый ненайдет NDIS-драйвер к NT, позволяющий работать с TCP/IP пакетами нанизком уровне, так что репутация UNIX как чисто хакерской платформы вскором будущем обещает пошатнуться.

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

Нашумевшая дыра, связанная с передачей shell-кода в строкуредактирования привилегированного процесса с последующей установкойтаймера, выполняющего этот код в адресном пространстве и с привилегиямиатакуемого процесса, в настоящее время по заверениям Microsoft ужеустранена. Подробности рецепта лечения в момент написания этих строкеще не известны, но по всей видимости они сводятся к проверке адресатаймерной процедуры – она не должна находится в буфера какого бы то нибыло окна. Ну, еще быть может, запретили передавать сообщение WM_TIMERболее привилегированным процессам. Полностью же запретить (илизащитить) межпроцессорную рассылку сообщений невозможно, поскольку онаявляется частью философии оконной подсистемы Windows и любые попыткивнесения каких бы то ни было ограничений не замедлят столкнуться спроблемами совместимости и приведут к неработоспособности большогоколичества прикладных программ.

Оконная подсистема UNIX хороша тем, что, не являетсянеотъемлемой частью системы и при желании от нее можно отказаться,ограничившись надежным и безопасным текстовым режимом. К тому же, обменсообщениями в графических оболочках UNIX обычно осуществляется попротоколам TCP/IP, которые защищают окна и элементы управления одногопроцесса от посягательств всех остальных (если, конечно, сампроцесс-владелец этого не захочет).

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

Сводная таблица

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

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

характеристика

NT

UNIX

качество и полнота документирования

документирована поверхностно

документирована весьма обстоятельно

доступность исходных текстов

исходные тексты недоступны

исходные тексты доступны

сложность анализа

высокая

умеренная

распространенность

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

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

сложность кода

код излишне сложен

код предельно прост

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

частично поддерживает

поддерживает

комплектность штатной поставки

содержит минимум необходимых приложений

содержит огромное количество приложений, в том числе и не протестированных

механизмы аутентификации

устойчив к перехвату паролей

передает открытый пароль

использование привязки

не использует

использует

выполнение привилегированных операций

выполняется операционной системой

выполняется самим приложением со временным повышением привилегий

модель пользователей

иерархическая

одноуровневая

защита от переполнения буфера

отсутствует, причем сама ОС написана на языке провоцирующим такие ошибки

отсутствует, причем сама ОС написана на языке провоцирующим такие ошибки

возможность доступа в адресное пространство чужого процесса

имеется, разрешена по умолчанию

отсутствует

возможность отладки процессов

имеется, разрешена по умолчанию

имеется, но связана с рядом ограничений

возможность отладки активных процессов

имеется, но требует наличия соответствующих привилегий

отсутствует

удаленный доступ к именованным каналам

есть

нет

создание подложных именованных каналов

есть, можно создать и канал, и даже подложный экземпляр уже открытого канала

есть, можно создать лишь подложный канал

защита именованных каналов от нежелательных подключений

отсутствует

отсутствует

защита сокетов от нежелательных подключений

отсутствует

отсутствует

возможность эмуляции ввода в более привилегированный процесс

имеется

отсутствует

Таблица 1 Сравнение основных характеристик UNIX и NT прямо иликосвенно относящихся к безопасности. Неудачные характеристики залитысерым цветом