• Программы, которые во время запуска могут переключаться между пользовательскими или групповыми контекстами (через биты setuid и setgid в исполняемом файле), несут потенциальную опасность передачи прав и информации привилегированного пользователя другому (непривилегированному) пользователю.
• Любая программа, работающая как системный демон, может вызвать проблему безопасности. Подобные программы работают в системе как привилегированные пользователи (довольно часто они выступают в качестве root), поэтому любое взаимодействие с обычными пользователями подвергает систему опасности.
22.1.1. Когда выходит из строя система безопасности?
Дефекты в системе безопасности программ являются причиной четырех обширных категорий атак: удаленная эксплуатация, локальная эксплуатация, удаленные атаки отказа в обслуживании и локальные атаки отказа в обслуживании. Удаленные эксплуатации позволяют пользователям, имеющим доступ к сетевым службам компьютера, запустить на этом компьютере произвольный код. Для того чтобы удаленная атака могла иметь место, в программе, обращающейся к сети, должна быть некоторая неисправность. Обычно такие ошибки встречаются в сетевых серверах, что позволяет удаленному взломщику ввести сервер в заблуждение и получить доступ в систему. С недавних пор начали эксплуатироваться и ошибки в сетевых клиентах. Например, если Web-браузер имеет изъян в способе анализа HTML-данных, то Web-страница, загружаемая этим браузером, может побудить браузер активизировать произвольную последовательность кодов.
Локальная эксплуатация дает пользователям возможность выполнять такие действия, на которые у них обычно нет полномочий (на них часто ссылаются как на разрешение превышения локальных полномочий ), например, нелегально проникать в систему под видом другого пользователя. Такой тип эксплуатации, как правило, направлен на локальных демонов (таких как серверы cron
или sendmail
) и setuid-программы (вроде mount
или passwd
).
Атаки отказа в обслуживании не позволяют взломщику получить контроль над системой, однако они могут помешать законному использованию данной системы. Это наиболее хитрые помехи, многие из них очень трудно ликвидировать. Например, многие программы, использующие файлы блокировок, подвергаются опасности таких атак. Хакер может просто вручную создать файл блокировки и ни одна программа никогда не удалит его. Одна из простейших атак отказа в обслуживании для пользователей заключается в заполнении их домашних каталогов ненужными файлами, тем самым исключая возможность создания новых файлов другими пользователями в той же файловой системе [158] Системные квоты предотвращают возможность успешности такой атаки.
. В общем случае для локальных атак рассматриваемого типа существует гораздо больше удобных случаев, чем для удаленных атак. Мы не будем здесь изучать атаки отказа в обслуживании подробно, поскольку они часто являются следствием всей программной архитектуры, а не одного дефекта.
22.2. Минимизация возможности появления атак
Одной из наилучших стратегий по обеспечению безопасности программ перед попытками несанкционированного использования прав доступа является создание отдельных частей программы, которые чрезвычайно легко атаковать. Подобную стратегию иногда трудно воплотить в сетевых программах и системных демонах, однако в тех программах, которые должны запускаться с особыми правами доступа (через биты setuid и setgid либо при активизации привилегированным пользователем), как правило, можно применить несколько алгоритмов для уменьшения их областей уязвимости.
22.2.1. Передача полномочий
Многие программы, которые требуют определенных прав доступа, используют эти права только во время запуска. Например, некоторые сетевые демоны могут активизироваться только привилегированным пользователем для того, чтобы они имели возможность подключиться к резервному порту с помощью функции listen()
, но после этого никакие особые полномочия не понадобятся. Большинство Web-серверов используют этот прием для усиления защиты от атак путем переключения на другого пользователя (обычно пользователь называется nobody
или apache
) сразу после открытия TCP/IP-порта 80. В это время сервер все еще остается объектом для удаленного использования, но, по крайней мере, такая эксплуатация больше не сможет предоставить взломщику доступ к процессу, активизированному как root. Сетевые клиенты, нуждающиеся в резервных портах (таких как rsh
), могут применять подобную методику. Они запускаются как setuid на root, что позволяет им открывать подходящий порт. Как только порт открыт, необходимость в привилегиях root отпадает, и особые возможности можно отключить.
Читать дальше