Чтение онлайн

на главную

Жанры

19 смертных грехов, угрожающих безопасности программ

Виега Джон

Шрифт:

Еще один аспект ACL, порождающий дополнительные сложности, – это наследование. В UNIX файлы иногда наследуют группу от объемлющего контейнера, а в Windows любой объект, который может содержать другие объекты, – каталог, ключ реестра, объект Active Directory и некоторые другие, – скорее всего, наследует часть записей АСЕ от родительского объекта. Не всегда безопасно предполагать, что унаследованные записи управления доступом подходят для вашего объекта.

Греховность элементов управления доступом

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

мы ограничимся лишь высокоуровневым обзором.

Самая серьезная – и при этом самая распространенная – ошибка заключается в создании чего–то, что дает полный доступ кому угодно (в Windows это группа Everyone, в UNIX – «мир») . Чуть менее греховный вариант той же ошибки – это предоставление полного доступа непривилегированным пользователям или группам. Нет ничего хуже создания исполняемого файла, в который могут писать обычные пользователи, а уж если вы хотите внести полный хаос, тогда создайте исполняемый файл с правами на запись, который запускается от имени root или LocalSystem. Немало эксплойтов добились успеха, потому что кто–то создал suid–сценарий, работающий от имени root, и забыл закрыть доступ на запись в него группе и миру. В Windows того же эффекта можно добиться, установив сервис, работающий от имени высокопривилегированной учетной записи, и включить для ее исполняемого файла такую запись АСЕ:

Everyone(Write)

На первый взгляд, это кажется полной нелепостью, но антивирусные программы снова и снова впадают в такой грех, a Microsoft выпустила на эту тему специальный бюллетень, поскольку в 2000 году подобная ошибка была обнаружена в одной из версий Systems Management Server (MS00–012). В описании бюллетеня CVE–2000–0100 в разделе «Примеры из реальной жизни» есть дополнительная информация по этому поводу.

Исполняемый файл с разрешением на запись – это самый прямой путь облегчить жизнь противнику, но нанести немалый вред можно, разрешив записывать в файл с конфигурационной информацией. В частности, возможность изменить путь к программе или библиотеке – это по существу то же самое, что разрешить запись в исполняемый файл. Примером такой проблемы в Windows может служить сервис, позволяющий непривилегированным пользователям изменять конфигурационные данные. Опасность тут двойная, поскольку один и тот же бит управляет и заданием пути к исполняемому файлу, и учетной записью, от имени которой работает сервис. Поэтому можно вместо непривилегированного пользователя сделать владельцем сервиса учетную запись LocalSystem и выполнить произвольный код. Для пущей забавы можно разрешить изменять конфигурационные данные по сети; это очень удобно для системного администратора, но если ACL сконфигурован неправильно, то не менее полезно и для противника.

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

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

Следующий великий грех – разрешить непривилегированным пользователям читать информацию «для служебного пользования». В качестве примера можно назвать протокол SNMP (Simple Network Management Protocol – простой протокол управления сетью; впрочем, эту аббревиатуру еще расшифровывают и так: Security Not My Problem – безопасность не моя проблема) в ранних вариантах Windows 2000 и предыдущих версиях ОС. В протоколе используется разделяемый пароль, который называется сообществом (community string).

Он определяет, какие параметры можно читать или модифицировать, и передается по сети по существу в открытом виде. В зависимости от установленных агентов можно прочитать или изменить массу интересной информации. Один забавный пример: можно отключить сетевой интерфейс или «интеллектуальный» источник бесперебойного питания. Но мало того что даже корректная реализация SMNP может стать источником бед, так еще многие производители, включая и Microsoft, допустили ошибку, сохраняя имена сообществ в ключах реестра, которые мог читать кто угодно. Локальный пользователь мог прочитать имя сообщества и начать администрировать не только свою систему, но и значительную часть сети в целом.

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

Отметим, что в системах, поддерживающих ACL, обычно не стоит применять записи АСЕ, запрещающие доступ к объектам. Предположим, например, что АСЕ содержит такие АСЕ:

Guests: Deny All

Administrators: Allow All

Users: Allow Read

Это будет работать до тех пор, пока кто–то не поместит администратора в группу Guests (что вряд ли имеет смысл). Теперь у администратора нет доступа к ресурсу, поскольку запись, запрещающая доступ, обрабатывается раньше всех записей, которые разрешают доступ. В системах Windows удаление запрещающей записи дает тот же эффект, но без нежелательного побочного действия, поскольку в Windows отсутствие явного разрешения на доступ к ресурсу означает, что доступ запрещен.

Еще одна специфичная для Windows проблема заключается в том, что при построении маркера доступа в него сначала включаются группы из домена пользователя, затем группы из домена, в который входит система, на которой пользователь регистрируется, а далее группы, определенные для локальной системы. Неприятность может произойти в случае, когда вы делегируете доступ к ресурсу, находящемуся на другой системе. Если просто взять АСЕ объекта (примером может служить объект Active Directory) и выполнить локальную проверку доступа, то вы можете дать лишние права, если при обработке АСЕ не отбросите локальные группы, например Administrators. Быть может, такое развитие событий кажется вам надуманным, но, к сожалению, это распространенная ошибка, поскольку в некоторых сетях делегирование через Kerberos разрешено. Когда–то похожая проблема была в сервере Microsoft Exchange.

Встраивание секретных данных в код

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

Есть еще одна причина воздерживаться от этого греха, и она никак не связана с безопасностью. Как насчет сопровождения? Представьте, что приложение написано, скажем, на С++, и с ним работают 1200 пользователей. Приложение греховно, в него встроен ключ шифрования, используемый для доступа к серверам. Кто–то раскрыл ключ (это нетрудно, как мы скоро покажем), следовательно, нужно обновить приложение у всех 1200 пользователей. Причем никакой альтернативы вы им не оставляете, так как секретный ключ раскрыт, следовательно, серверы должны быть обновлены, а значит, и все пользователи должны получить новую версию НЕМЕДЛЕННО!

Родственные грехи

С этим грехом тесно связаны «гонки» (race condition), когда неправильно спроектированный механизм управления доступом делает возможными атаки на временные зависимости. Детально эта тема разобрана в грехе 16. Еще несколько грехов касаются обработки данных, поступающих из не заслуживающего доверия источника. Сюда же примыкает проблема некорректного применения криптографии. Иногда последствия раскрытия информации можно сгладить за счет шифрования. Если вы вынуждены хранить информацию в месте, где она может быть модифицирована, то хотя бы снабжайте ее цифровой подписью, чтобы обнаружить попытки манипулирования.

Поделиться:
Популярные книги

Ученичество. Книга 2

Понарошку Евгений
2. Государственный маг
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ученичество. Книга 2

Император поневоле

Распопов Дмитрий Викторович
6. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Император поневоле

Лорд Системы 7

Токсик Саша
7. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 7

Целитель. Книга вторая

Первухин Андрей Евгеньевич
2. Целитель
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Целитель. Книга вторая

Темный Патриарх Светлого Рода 3

Лисицин Евгений
3. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 3

Случайная свадьба (+ Бонус)

Тоцка Тала
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Случайная свадьба (+ Бонус)

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Не грози Дубровскому! Том Х

Панарин Антон
10. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том Х

Идеальный мир для Лекаря 12

Сапфир Олег
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 12

Хочу тебя навсегда

Джокер Ольга
2. Люби меня
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Хочу тебя навсегда

СД. Том 15

Клеванский Кирилл Сергеевич
15. Сердце дракона
Фантастика:
героическая фантастика
боевая фантастика
6.14
рейтинг книги
СД. Том 15

Смерть может танцевать 3

Вальтер Макс
3. Безликий
Фантастика:
боевая фантастика
5.40
рейтинг книги
Смерть может танцевать 3