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

на главную

Жанры

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

Виега Джон

Шрифт:

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

CAN–2004–0077 do_mremap в ядре Linux

Это, наверное, самая известная в недавней истории ошибка из разряда «забыл проверить возвращенное значение». Из–за нее были скомпрометированы многие Linux–машины, подключенные к сети Интернет. Обнаружившие ее люди подняли шумиху в прессе, а пример эксплойта можно найти по адресуvulnerabilities/isec–0014–mremap–unmap.txt.

Примечание. В конце 2003 – начале 2004 года в менеджере памяти, являющемся частью ядра Linux, был обнаружен целый ряд ошибок, в том числе две, относящиеся к теме

этой главы. Не путайте эту ошибку с другой, касающейся механизма отображения адресов: CAN–2003–0985.

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

Искупить грех можно, лишь выполняя следующие предписания:

□ Обрабатывайте в своем коде все относящиеся к делу исключения.

□ Не «глотайте» исключения.

□ Проверяйте возвращаемые значения, когда это необходимо.

Искупление греха в C/C++

В следующем фрагменте мы вместо использования макросов assert явно проверяем все аргументы функции и значение, возвращенное fopen.

Утверждения (assert) следует применять лишь для проверки условий, которые никогда не должны встречаться.

...

DWORD OpenFileContents(char *szFileName) {

if (szFileName == NULL || strlen(szFileName) <= 3)

return ERROR_BAD_ARGUMENTS;

FILE *f = fopen(szFileName, "r");

if (f == NULL)

return ERROR_FILE_NOT_FOUND;

// Можно работать с файлом

return 1;

}

Включенная в Microsoft Visual Studio .NET 2005 технология аннотирования исходного текста (Source code Annotation Language – SAL) помогает в числе прочих обнаружить и ошибки, связанные с проверкой возвращаемых значений. При компиляции показанного ниже кода будет выдано предупреждение:

«Warning С6031: return value ignored: «Function» could return unexpected value».

(Предупреждение C6031: возвращенное значение проигнорировано. Функция могла вернуть неожиданное значение.)

...

__checkReturn DWORD Function(char *szFileName) {

DWORD dwErr = NO_ERROR;

// Выполнить, что положено

return dwErr;

}

void main {

Function("c:\\junk\\1.txt");

}

Искупление греха в C#, VB.NET и Java

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

...

try {

// (1) Загрузить XML-файл с диска

// (2) Извлечь из XML-данных URI

// (3) Открыть хранилище клиентских сертификатов и достать оттуда

// сертификат в формате X.509 и закрытый ключ клиента

// (4) Выполнить запрос на аутентификацию к серверу, определенному

// на шаге (2), используя сертификат и ключ из шага (3)

} catch (SecurityException e1) {

// обработать ошибки, относящиеся к безопасности

} catch (XmlException e2) {

// обработать ошибки, относящиеся к XML

} catch (IOException e3) {

// обработать ошибки ввода/вывода

} catch (FileNotFoundException e4) {

// обработать ошибки, связанные с отсутствием файла

} catch (SocketException e5) {

//

обработать ошибки, относящиеся к сокетам

}

Другие ресурсы

□ Code Complete, Second Edition by Steve McConnell, Chapter 8, «Defensive Programming»

□ «Exception Handling in Java and C#» by Howard Gilbert:yale.edu/ pclt/exceptions.htm

□ Linux Kernel mremap Missing Return Value Checking Privilege Escalation www.osvdb/displayvuln.php?osvdb_id=3986

Резюме

Рекомендуется

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

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

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

Не рекомендуется

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

□ Не допускайте утечки информации не заслуживающим доверия пользователям.

Грех 7. Кросс–сайтовые сценарии

В чем состоит грех

Ошибки, связанные с кросс–сайтовыми сценариями (cross–site scripting – XSS), специфичны только для Web–приложений. В результате пользовательские данные, привязанные к домену уязвимого сайта (обычно хранящиеся в куке), становятся доступны третьей стороне. Отсюда и термин «кросс–сайтовый»: кук передается с компьютера клиента, который обращается к уязвимому сайту, на сайт, выбранный противником. Это самая распространенная XSS–атака. Но есть и другая разновидность, напоминающая атаку с изменением внешнего облика сайта; мы поговорим и о ней тоже.

Примечание. Ошибки, связанные с XSS–атаками, называют еще CSS–ошибками, но предпочтение отдается аббревиатуре XSS, так как CSS обычно расшифровывается как Cascade Style Sheets (каскадные таблицы стилей).

Подверженные греху языки

Уязвим любой язык или технология, применяемые для создания Web–сайтов, например PHP, Active Server Pages (ASP), C#, VB.NET, J2EE QSP, сервлеты), Perl и CGI (Common Gateway Interface – общий шлюзовой интерфейс).

Как происходит грехопадение

Согрешить очень легко: Web–приложение принимает от пользователя какие–то данные, например, в виде строки запроса, и, не проверяя их, выводит на страницу. Вот и все! Но входные данные могут оказаться сценарием, написанным, например, на языке JavaScript, и он будет интерпретирован браузером, на котором эта страница просматривается.

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

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

Кровь Василиска

Тайниковский
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Кровь Василиска

Венецианский купец

Распопов Дмитрий Викторович
1. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
7.31
рейтинг книги
Венецианский купец

Сопряжение 9

Астахов Евгений Евгеньевич
9. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
технофэнтези
рпг
5.00
рейтинг книги
Сопряжение 9

На три фронта

Бредвик Алекс
3. Иной
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
На три фронта

Авиатор: назад в СССР 11

Дорин Михаил
11. Покоряя небо
Фантастика:
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 11

Санек

Седой Василий
1. Санек
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Санек

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

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

Мерзавец

Шагаева Наталья
3. Братья Майоровы
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
5.00
рейтинг книги
Мерзавец

Игра топа. Между двух огней

Вяч Павел
2. Игра топа
Фантастика:
фэнтези
7.57
рейтинг книги
Игра топа. Между двух огней

Провинциал. Книга 2

Лопарев Игорь Викторович
2. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Провинциал. Книга 2

Идущий в тени 6

Амврелий Марк
6. Идущий в тени
Фантастика:
фэнтези
рпг
5.57
рейтинг книги
Идущий в тени 6

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Крестоносец

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

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

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