Статья: Безопасное программирование в API WIN32

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

К таким функциям относятся:

InitializeCriticalSection (инициализация критической секции) и EnterCriticalSection (вход в критическую секцию), которые в условиях недостатка памяти инициируют исключения, и если исключение не перехватывается, приложение завершается аварийно. Взамен рекомендуется использовать функцию InitializeCriticalSectionAndSpinCount. Причем, EnterCriticalSection не инициирует исключения в Windows XP, Windows .NET Server и последующих ОС. Также необходимо следить, чтобы не выполнять блокирующих сетевых вызовов из критической секции или других блокируемых участков программы. Код внутри критической секции следует проверять с особой тщательностью. Любые исключения должны перехватываться в самой критической секции, в противном случае программа «вывалится» в обработчик исключения до вызова LeaveCriticalSection. В критической секции надо выполнять лишь необходимый минимум операций.

TerminateThread (завершение потока) и TerminateProcess (завершение процесса) -- обе эти функции следует вызывать только в крайнем случае. Особенно TerminateThread. Память, дескрипторы и системные ресурсы, которыми владел поток, не очищаются и не освобождаются.

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

К таким функциям относятся следующие:

bind (определение номера порта и IP-адреса по которому сервер будет принимать данные) -- создавая привязку к INADDR_ANY (все интерфейсы) -- есть опасность, что сервер станет прослушивать все имеющиеся сетевые интерфейсы;

recv (получение данных по сети) -- у этой функции три возможных возвращаемых значения, и не всегда все они обрабатываются. На ошибку указывает -- 1, при корректном разрыве соединения (или достижении конца буфера) возвращается 0, положительное число сигнализирует об удачном завершении. Функция recv, работающая в блокирующем сокете может навсегда «подвесить» поток.

send - отправляет данные в сокет, с которым установлено соединение. Не следует считать, что все данные успешно переданы, если send не возвращает ошибки. Соединения иногда разрываются между вызовами connect и send. Кроме того, если злоумышленник намеренно задал размер окна TCP очень маленьким, существует лишь один путь заметить это -- если при вызове send возникнет тайм-аут. Если сокет является блокирующим или не проверяется значение, возвращаемое функцией, есть вероятность проведения атаки отказ в обслуживании.

К функции восьмой группы относятся CopyFile и MoveFile. Возможные проблемы с этими функциям связаны с тем, как они работают с ACL. Файлы, копируемые вызовом CopyFile, наследуют ACL по умолчанию каталога, в который копируются, а файлы, переносимые посредством MoveFile, сохраняют свои ACL. При работе с данными функциями необходимо проверять, что объект используется только локально только локально и н и в коем случае не устанавливать флаг CLSCTX_REMOTE_SERVER.

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

Литература

Ховард М., Лебланк Д. Защищенный код. Пер. с англ. - 2-е изд., испр. М.: Издательско-торговый дом «русская редакция», 2004. - 704 стр.: ил.

Рихтер Дж. Windows для профессионалов: создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows. ./ Пер. с англ. - 4-е изд. - СПб.: Питер; М.: Издательско-торговый дом «Русская редакция», 2004 - 749 с.:ил.

Соломон Д., Руссинович М. Внутреннее устройство Microsoft Windows 2000. Мастер-класс./ Пер. с англ. - СПб.: Питер; М.: Издательско-торговый дом «Русская редакция», 2001 - 752 с.:ил.