К таким функциям относятся:
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 с.:ил.