Автор: (c)Крис Касперски ака мыщъх
OpenBSD - самая защищенная операционная система, Server 2003 - самая распространенная (речь, разумеется, идет о серверной нише), поэтому представляет интерес сравнить двух лидеров на предмет (не)безопасности, проанализировав их устойчивость как к удаленным, так и к локальным атакам, поскольку инсайдеры представляют ничуть не меньшую угрозу, чем хакеры, находящиеся за периметром охраняемой зоны.
Главным образом, мы будем говорить о Microsoft Server 2003 SP2 и OpenBSD 4.2. Важно отметить, что "девственно чистый" Server 2003 без установленных пакетов обновлений очень слабо защищен и совершенно непригоден для "промышленной" эксплуатации, поскольку будучи подключенным к глобальной Сети, мгновенно превращается в рассадник вирусов, червей и прочей заразы, чего нельзя сказать об OpenBSD, выбор версии которой, в общем-то, некритичен и даже древние дистрибутивы уверенно держат удар, а вредоносные программы под них либо вообще отсутствуют, либо носят "лабораторный" характер, совершенно нежизнеспособный в условиях "дикой" сети.
По данным компании Secunia (http://secunia.com/) за период 2003-2008 г. в OpenBSD было обнаружено всего 10 дыр, из которых только две - критические. Количество дыр в Server 2003 за то же самое время перевалило за полторы сотни и свыше половины из них - критические (см. рис. 1). Комментарии, как говорится, излишни. Цифры отличаются на пару порядков и никакие оправдания не спасут Server 2003 от позора.
Рисунок 1. Кол-во дыр в OpenBSD (слева) и Server 2003 (справа) за период 2003-2008 г. по данным компании Secunia.
Кто контролирует ядро, тот контролирует систему. Ядро - это своеобразная Мекка, в которую каждый уважающий себя хакер должен совершить хадж, засадив туда rootkit или другую нехорошую программу, активно сопротивляющуюся своему обнаружению и удалению из системы.
Ни в OpenBSD, ни в Server 2003 целостность ядра не проверяется. Почему? В x86/x86-64 процессорах нет адекватных аппаратных средств, позволяющих реализовать такую проверку без значительного падения производительности. И хотя в x86-64 редакции Server 2008 появился механизм PatchGuard, периодически проверяющий критические ядерные структуры, его настолько просто обойти, что этого не сделает только ленивый. Если говорить кратко: PatchGuard - компонент ядра, запускающийся приблизительно раз в секунду, следовательно, у зловредного кода имеется предостаточно времени для его "нейтрализации" путем прямой модификации памяти ядра с ядерного уровня, запрещенной по умолчанию, но "отмыкаемой" всего тремя машинными командами!
С другой стороны, разработчики OpenBSD предприняли ряд шагов, существенно затрудняющих атаку на ядро. Скомпилировав монолитное ядро (без возможности загрузки модулей или в терминологии Windows - драйверов) и запретив модификацию ядерной памяти с прикладного уровня, администратор предотвратит вторжение зловредного кода в область ядра (и хотя ошибки в ядерных компонентах, например, TCP/IP-драйверах, позволяют атаковать систему, подобные дыры затыкаются в оперативном порядке, а вот небезопасность Windows носит концептуальный характер, существенно исправленный в Server 2008, но все равно остающийся порочным и уязвимым).
Нерелигиозные люди хаджей не совершают, в ядро не стремятся и вполне комфортно чувствуют себя на прикладном уровне, преимущественно используя для атаки ошибки переполнения буферов, которые в языке Си носят фундаментальный характер и потому вездесущи. Разработчики UNIX- и Windows-компиляторов предпринимают определенные усилия для предотвращения атак, но это относится только к вновь создаваемым программ, собранными новейшими компиляторами со всеми ключами безопасности. Но как показывает статистика, даже программы, выпущенные за последние несколько лет, не используют этих возможностей и потому приходится надеяться только на операционную систему - сумеет ли она постоять за себя или нет?
В OpenBSD запрещено исполнение кода в стеке и куче, причем целостность кучи тщательно проверяется и хакер может воздействовать лишь на указатели на функции, расположенные в памяти процесса, посредством подмены которых можно, в частности, отключить защиту от исполнения кода и чтобы этого не произошло, адресное пространство процесса рандомизировано, т.е. хакер заранее не знает, по каким адресам окажутся расположены интересующие его функции, а потому атаки на переполняющие буфера в OpenBSD не выходят за рамки лабораторных экспериментов.
А что мы имеем в Windows? Запрет на исполнение кода появился только в Server 2003 SP1, рандомизация - в Server 2008 (точнее - некоторая пародия на рандомизацию). А сама по себе защита стека/кучи от исполнения кода без рандомизации элементарно обходится классической атакой return2libc и ни от чего не спасает, к тому же целостность кучи реально никак не проверяется и что самое противное - обработчики структурных исключений (SEH) находятся в стеке и могут быть легко атакованы. Механизм SafeSEH, призванный предотвратить атаку на SEH, остается уязвимым даже в Server 2008. Операционная система OpenBSD использует совсем другой механизм обработки исключений, не подверженный подобным угрозам.
UNIX-подобные операционные системы издавна поддерживают множество шифрованных файловых систем, существенно затрудняющих атаку даже при физическом доступе к компьютеру. В Server 2003 также имеется что-то подобное, но увы - приносящее больше вреда, чем пользы. Microsoft Encrypted File System, во-первых, легко взламывается при наличии достаточных вычислительных мощностей, во-вторых, ключи шифрования хранятся в пользовательском профиле, откуда их легко "вытащить" зловредной программе, а в-третьих, эти ключи генерируются системой самостоятельно и при утере пользовательского профиля (например, в результате сбоя), теряется доступ и ко всем зашифрованным данным, а механизмы резервирования ключей появились только в Server 2008 и все еще слишком сырые и создающие много проблем при попытке их использования.
К тому же, ряд файлов (например, системный реестр или файл подкачки) вообще не могут быть зашифрованы, что существенно ослабляет безопасность. А вот OpenBSD шифрует все подряд - от системных файлов до подкачки.
В любую UNIX-подобную систему изначально входит надежный брандмауэр, вполне устраивающий подавляющее подавляюще большинство администраторов. В Server 2003 имеется что-то подобное, но уж слишком функционально ущемленное, поэтому приходится приобретать продукты сторонних разработчиков, что, в принципе, не создает проблемы.
Проблема в другом - разработчики Server 2003 сделали все возможное, чтобы администратор не мог удалить ненужные ему протоколы, а поскольку TCP/IP-стек - грандиозное сооружение, содержащее миллионы строк кода, ошибки там неизбежны и обнаруживаются с завидной регулярностью. Причем, Server 2003 использует предсказуемые идентификаторы в IP/RPC-заголовках и DNS-запросах, существенно упрощая многие виды удаленных атак. В OpenBSD для этих целей используются надежные генераторы псевдослучайных чисел, оставляющих лишь теоретическую возможность атаки.
Как мы видим, Server 2003 - катастрофически небезопасная система, причем большинство дефектов носит фундаментальный характер, требует для своего исправления радикального редизайна ядра и потому Server 2008 в этом плане не сильно лучше. Все это - соломенные домики, разваливающиеся при маленьком дуновении ветерка.
OpenBSD напоминает неприступную крепость, стойкую ко всем погодным явлениям (включая даже такие стихийные бедствия как землетрясения и цунами), но означает ли это, что всем нам нужно немедленно сносить Server 2003 и мигрировать на OpenBSD?! Ответ отрицательный. Перенос сложившейся инфраструктуры даже небольшого предприятия с Server 2003 на OpenBSD требует существенных финансовых вложений, а вероятность пасть жертвой атаки, сидя под Server 2003, не так уж и велика...
Другими словами, переход с Server 2003 на OpenBSD в общем случае нецелесообразен. Бесплатность дистрибутива OpenBSD еще не означает бесплатности владения им.
OpenBSD | Server 2003 | |
Проверка целостности ядра | Не поддерживается | Не поддерживается |
Запрет загрузки модулей ядра | Поддерживается | Не поддерживается |
Удаление символьной информации о ядре | Поддерживается | Не поддерживается |
Отключение защиты памяти ядра от записи | Не поддерживается | Поддерживается |
Запрет модификации памяти ядра с прикладного уровня | Поддерживается | Поддерживается, начиная с SP1 |
"Люки" к ядру с прикладного режима | Отсутствуют | Имеются в изобилии |
Запрет на исполнение кода в стеке и куче | Поддерживается | Поддерживается, начиная с SP1 |
Контроль целостности кучи | Поддерживается | Не реализован должным образом |
Рандомизация адресного пространства | Поддерживается | Не поддерживается |
Защита обработчиков исключений | Поддерживается | Не реализована должным образом |
Шифрованная ФС | Поддерживается | Не реализована должным образом |
Автоматическое затирание удаляемых файлов | Поддерживается | Не поддерживается |
Шифрование файла подкачки | Поддерживается | Не поддерживается |
Системный диск только на чтение | Поддерживается | Не поддерживается |
Встроенный брандмауэр | Поддерживается | Не реализован должным образом |
Рандомизация ID в IP,RPC,DNS... | Поддерживается | Не поддерживается |
Загрузка в однопользовательском режиме | Поддерживается | Не поддерживается |
Таблица 1. Сравнительные характеристики основных параметров безопасности OpenBSD и Server 2003.