Вопросы безопасности: пользовательский интерфейс Windows
В этом разделе содержатся сведения о безопасности в пользовательском интерфейсе Windows. В этом разделе не содержатся все, что вам нужно знать о проблемах безопасности. Вместо этого используйте его в качестве отправной точки и ссылки на эту технологию.
Благодаря увеличению взаимосвязи компьютеров разработчики теперь должны беспокоиться о безопасности приложений. Однако безопасность также повышает общую безопасность приложений и надежность; таким образом, разработчик может обеспечить хороший пользовательский интерфейс. В следующих разделах рассматриваются некоторые потенциальные проблемы безопасности при использовании пользовательского интерфейса Windows.
Многие функции, сообщения и макросы используют строки в своих параметрах. Однако часто строки не проверка для завершения null или длины. Связанная проблема неправильно вычисляет длину строки или буфера. В любом случае это может привести к переполнению буфера или усечению данных, что может негативно повлиять на приложение. Дополнительные сведения о переполнении буферов и других проблемах безопасности см. в статье "Написание защищенного кода " Майклом Ховардом и Дэвидом Лебланом, Microsoft Press, 2002.
Чтобы безопасно обрабатывать строки, выполните следующие действия.
- Проверьте строки для завершения null или для соответствующей длины.
- Обратите особое внимание, чтобы определить длину строки или буфера, особенно если она содержит значения TCHAR .
- Если вы создаете строку или используете используемую ранее строку, инициализируйте ее до нуля или вставьте конечную строку null, как это необходимо.
Кроме того, при работе со строками рекомендуется использовать функции Str Сейф. Эти функции предназначены для безопасной обработки строк.
Пользовательский интерфейс Windows связан с получением и реагированием на информацию от пользователей. Однако пользователи, которые вводят неправильные данные, могут нарушить работу приложения, независимо от того, намерены ли они это сделать. Таким образом, правило карта inal заключается в том, что все входные данные должны быть проверены.
Основной проблемой является строковые данные, которые рассматриваются в разделе "Рекомендации по строкам". Однако перед использованием приложения необходимо проверить все типы входных данных. Другая проблема заключается в том, что данные проверяются в один момент, но изменения перед его использованием, например при получении сообщений, которые дают длину текста. Таким образом, если есть вероятность того, что данные могут измениться, необходимо проверка данные непосредственно перед его использованием.
В следующей таблице перечислены функции, которые, если они используются неправильно, могут компрометации безопасности приложений.
Функция | Исправление |
---|---|
GetAtomName | Будьте осторожны при указании размера буфера. |
GlobalGetAtomName | Глобальные атомы строк доступны любому приложению. Тем не менее, если другое приложение небрежно, оно может неправильно использовать их счетчики ссылок и удалить их. Вместо этого следует использовать глобальные целые атомы. |
ОлицетворенияDdeClientWindow | Если функция завершается ошибкой, последующие клиентские запросы выполняются в контексте безопасности вызывающего процесса. Это может быть проблема, если вызывающий процесс выполняется в качестве учетной записи с высоким уровнем привилегий. Таким образом, если вызов завершается сбоем или вызывает ошибку, не продолжайте выполнение запроса клиента. |
DdeImpersonateClient | Если функция завершается ошибкой, последующие клиентские запросы выполняются в контексте безопасности вызывающего процесса. Это может быть проблема, если вызывающий процесс выполняется в качестве учетной записи с высоким уровнем привилегий. Таким образом, если вызов завершается сбоем или вызывает ошибку, не продолжайте выполнение запроса клиента. |
GetClipboardFormatName | Неправильное вычисление правильного размера буфера lpszFormatName , особенно если приложение используется как в версиях ANSI, так и в Юникоде, может привести к переполнению буфера. Кроме того, обратите внимание, что строка усечена, если она больше параметра cchMaxCount , что может привести к потере информации. |
GetMenuString | Параметр lpString является буфером TCHAR , а nMaxCount — длина строки меню в TCHAR. Изменение размера этих параметров может быть неправильной длиной строки меню в символах. Неправильное изменение размера этих параметров может привести к усечению строки, что приводит к возможной потере данных. |
GetStringTypeA, GetStringTypeEx, GetStringTypeW | Чтобы избежать переполнения буфера, задайте размер буфера lpCharType правильно. |
Loadlibrary | Использование LoadLibrary неправильно может нарушить безопасность приложения, загрузив неправильную библиотеку DLL. |
LoadString | Неправильное использование включает указание неправильного размера в параметре nBufferMax . Например, sizeof(lpBuffer) дает размер буфера в байтах, что может привести к переполнению буфера для версии функции Юникода. Ситуации переполнения буфера являются причиной многих проблем безопасности в приложениях. В этом случае использование sizeof(lpBuffer)/sizeof(TCHAR) дает правильный размер буфера. |
lstrcat | Эта функция использует структурированную обработку исключений (SEH) для перехвата нарушений доступа и других ошибок. Если эта функция перехватывает ошибки SEH, она возвращает значение NULL без завершения строки и без null без завершения строки без завершения строки, не уведомляя вызывающего об ошибке. Вызывающий объект не является безопасным, чтобы предположить, что недостаточно места является условием ошибки. Первый аргумент lpString1 должен быть достаточно большим для хранения lpString2 и закрытия "\0", в противном случае может произойти переполнение буфера. Переполнение буфера может привести к атаке типа "отказ в обслуживании" в приложении, если возникает нарушение доступа. В худшем случае переполнение буфера может позволить злоумышленнику внедрить исполняемый код в процесс, особенно если lpString1 является буфером на основе стека. Рассмотрите возможность использования одного из следующих вариантов. StringCbCat или StringCchCat. |
lstrcpy | Эта функция использует структурированную обработку исключений (SEH) для перехвата нарушений доступа и других ошибок. Если эта функция перехватывает ошибки SEH, она возвращает значение NULL без завершения строки и без null без завершения строки без завершения строки, не уведомляя вызывающего об ошибке. Вызывающий объект не является безопасным, чтобы предположить, что недостаточно места является условием ошибки. Первый аргумент lpString1 должен быть достаточно большим для хранения lpString2 и закрытия "\0", в противном случае может произойти переполнение буфера. Переполнение буфера может привести к атаке типа "отказ в обслуживании" в приложении, если возникает нарушение доступа. В худшем случае переполнение буфера может позволить злоумышленнику внедрить исполняемый код в процесс, особенно если lpString1 является буфером на основе стека. Вместо этого рекомендуется использовать StringCchCopy. |
lstrcpyn | Эта функция использует структурированную обработку исключений (SEH) для перехвата нарушений доступа и других ошибок. Если эта функция перехватывает ошибки SEH, она возвращает значение NULL без завершения строки и без null без завершения строки без завершения строки, не уведомляя вызывающего об ошибке. Вызывающий объект не является безопасным, чтобы предположить, что недостаточно места является условием ошибки. Если lpString1 недостаточно велик, чтобы содержать скопированную строку, может произойти переполнение буфера. Кроме того, при копировании всей строки обратите внимание, что sizeof возвращает количество байтов, а не WCHAR, что размер возвращает количество байтов, а не символов, что неверно для версии Юникода этой функции. Переполнение буфера может привести к атаке типа "отказ в обслуживании" в приложении, если возникает нарушение доступа. В худшем случае переполнение буфера может позволить злоумышленнику внедрить исполняемый код в процесс, особенно если lpString1 является буфером на основе стека. Вместо этого рекомендуется использовать StringCchCopy. |
lstrlen | lstrlen предполагает, что lpString является строкой, завершаемой значением NULL. Если это не так, это может привести к переполнению буфера или атаке типа "отказ в обслуживании" в приложении. Рассмотрите возможность использования одного из следующих вариантов. StringCbLength или StringCchLength. |
wsprintf | Строка, возвращаемая в lpOut , не гарантируется, что она завершается значением NULL. Кроме того, избегайте формата %s, что может привести к переполнению буфера. Если нарушение доступа возникает, это приводит к отказу в обслуживании в приложении. В худшем случае злоумышленник может внедрить исполняемый код. Рассмотрите возможность использования одного из следующих вариантов. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf или StringCchVPrintfEx. |
wvsprintf | Строка, возвращаемая в lpOutput , не гарантируется завершением null. Кроме того, избегайте использования формата %s, что может привести к переполнению буфера. Это может привести к отказу в обслуживании, если это приведет к нарушению доступа, или злоумышленник может внедрить исполняемый код. Рассмотрите возможность использования одного из следующих вариантов. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf или StringCchVPrintfEx. |