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

на главную - закладки

Жанры

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

Виега Джон

Шрифт:

Где искать ошибку

Вашу программу можно заподозрить в грехе, если:

□ она обращается к файлам, имена которых задаются извне;

□ она обращается к файлам исключительно по именам, а не по описателям или дескрипторам;

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

Выявление ошибки на этапе анализа кода

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

имена файлов. Выявив такую функцию, задайте себе следующие вопросы:

□ Откуда поступает имя файла? Можно ли ему доверять?

□ Используется ли это имя файла более одного раза для проверки существования и манипулирования файлом?

□ Находится ли файл в той части файловой системы, к которой потенциально может иметь доступ противник?

□ Может ли противник задать имя так, чтобы оно указывало на файл, к которому он не должен иметь доступа?

Вот перечень типичных функций и операторов ввода/вывода, которые следует искать в программе.

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

Тестирование

Самый простой способ найти ошибки типа «это не файл» и «проход по каталогам» – подать на вход приложения случайные имена файлов и посмотреть, как оно будет реагировать. В частности, попробуйте такие имена:

□ AUX

□ CON

□ LPT1

□ PRN.TXT

□..\..\AUX

□ /dev/null

□ /dev/random

□ /dev/urandom

□ ../../dev/random

□ \\servername\c$

□ \\servername\ipc$

Проверьте, не зависнет ли приложение, не завершится ли оно аварийно. Если это случится, значит, вы нашли место, где программа ожидает только «честного» имени файла! Посмотрите также, можете ли вы обратиться к файлам, к которым не должны иметь доступа, например к файлу /etc/passwd в Unix.

Как и для многих других грехов, описанных в этой книге, наиболее продуктивный способ выявления ошибок – это качественный анализ кода с точки зрения безопасности.

Примеры из реальной жизни

Следующие примеры взяты из базы данных CVE .

CAN–2005–0004

Сценарий mysqlaccess, входящий во многие версии MySQL, позволяет локальному пользователю затереть произвольный файл или прочитать содержимое временных файлов путем атаки с организацией символической ссылки на временный файл. Частично в ошибке повинна функция POSIX::tmpnam, которая возвращает предсказуемое имя временного файла! Если противник сможет создать символическую ссылку на конфиденциальный файл с таким же именем, то во время запуска сценария привилегированным пользователем этот файл будет затерт.

На страницеимеется заплата, которая устраняет ошибку за счет использования описателей вместо имен файлов и модуля File::Temp вместо POSIX::tmpnam.

CAN–2005–0799

Это еще одна ошибка в MySQL, на этот раз затрагивающая только пользователей Windows.

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

...

use PRN

В результате открывается порт принтера по умолчанию, а не реальный файл.

CAN–2004–0452 и CAN–2004–0448

Обе ошибки связаны с гонкой, которая возникает при работе функции File::Path::rmtree в Perl. Для эксплуатации той и другой следует подменить существующий каталог в удаляемом дереве символической ссылкой на произвольный файл. Для устранения ошибки понадобилось значительно переработать – практически полностью переписать – функцию rmtree. Заплата имеется на странице http://ftp.debian.Org/debian/pool/main/p/perl/perl_5.8.4–8.diff.gz.

CVE–2004–0115 Microsoft Virtual PC для Macintosh

Процесс VirtualPC_Services, являющийся частью продукта Microsoft Virtual PC для версий от Мае 6.0 до Мае 6.1, позволяет локальному противнику усекать и перезаписывать произвольные файлы и потенциально открывает возможность выполнить произвольный код за счет атаки путем организации символической ссылки на временный файл /tmp/VPCServices_Log. Программа без каких бы то ни было проверок открывает файл с таким именем, даже если он является символической ссылкой. Если ссылка ведет на другой файл, он переписывается. Представьте, как будет смешно, если этот «другой файл» есть /mach_kernel!

Искупление греха

Для искупления греха в программе придерживайтесь следующих правил:

□ По возможности храните все файлы, нужные приложению, в таком месте, которое противник никак не может контролировать. Даже если программа ничего не проверяет, но безопасность ее рабочего каталога гарантируется, то большая часть проблем исчезнет сама собой. Обычно для этого создается «безопасный каталог», доступный только приложению. Часто самый простой способ обеспечить контроль доступа на уровне приложения заключается в том, чтобы создать специального пользователя, от имени которого приложение будет работать. Если этого не делать, то все приложения, работающие от имени того же пользователя, что и ваше, смогут манипулировать создаваемыми им файлами.

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

□ Вычисляйте путь к файлу, к которому собираетесь обратиться. Для этого следуйте по символическим ссылкам и выполняйте проход по каталогам. Лишь после вычисления окончательного имени применяйте к нему проверки.

□ Если вы вынуждены открывать временный файл в общедоступном каталоге, то самый надежный способ сформировать его имя – это получить восемь байтов от генератора случайных чисел криптографического качества (см. грех 18) и представить их в кодировке base64. Если в результирующей строке окажется символ \'/\', замените его символом \',\' или еще каким–нибудь безобидным – это и будет имя файла.

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

Сердце Дракона. Том 20. Часть 1

Клеванский Кирилл Сергеевич
20. Сердце дракона
Фантастика:
фэнтези
боевая фантастика
городское фэнтези
5.00
рейтинг книги
Сердце Дракона. Том 20. Часть 1

Холодный ветер перемен

Иванов Дмитрий
7. Девяностые
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Холодный ветер перемен

Последнее желание

Сапковский Анджей
1. Ведьмак
Фантастика:
фэнтези
9.43
рейтинг книги
Последнее желание

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Магия чистых душ 2

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.56
рейтинг книги
Магия чистых душ 2

Наследие Маозари 5

Панежин Евгений
5. Наследие Маозари
Фантастика:
фэнтези
юмористическое фэнтези
5.00
рейтинг книги
Наследие Маозари 5

Локки 4 Потомок бога

Решетов Евгений Валерьевич
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 4 Потомок бога

Граф

Ланцов Михаил Алексеевич
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Граф

Миф об идеальном мужчине

Устинова Татьяна Витальевна
Детективы:
прочие детективы
9.23
рейтинг книги
Миф об идеальном мужчине

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Здравствуй, 1984-й

Иванов Дмитрий
1. Девяностые
Фантастика:
альтернативная история
6.42
рейтинг книги
Здравствуй, 1984-й

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Барон не играет по правилам

Ренгач Евгений
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон не играет по правилам