Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе содержатся сведения о соображениях безопасности, связанных с оболочкой Windows. Этот документ не может предоставить все, что вам нужно знать о проблемах безопасности, вместо этого используйте его в качестве отправной точки и ссылки на эту конкретную технологию.
Оболочка управляет рядом важных аспектов системы, включая несколько, которые представляют потенциальные риски безопасности, если они не обрабатываются должным образом. В этом разделе описаны некоторые из наиболее распространенных проблем и способы их решения в приложениях. Помните, что безопасность не ограничивается эксплойтами на основе Интернета. В общих системах, включая системы, доступные через службы терминалов, необходимо также убедиться, что пользователи не могут делать ничего, что может повредить другим пользователям, которым предоставлен общий доступ к системе.
- Правильное установка приложения
- Шлвапи
- Автозаполнение
- ShellExecute, ShellExecuteEx и связанные функции
- Перемещение и копирование файлов
- Написание расширений безопасного пространства имен
- оповещения безопасности
- Связанные статьи
Правильное установка приложения
Большинство потенциальных проблем с безопасностью оболочки могут быть устранены путем правильной установки приложения.
Установите приложение в папку Program Files.
Операционная система Местоположение Windows XP, Windows Server 2003 и более ранних версий CSIDL_PROGRAM_FILES Windows Vista и более поздних версий FOLDERID_ProgramFiles, FOLDERID_ProgramFilesX86, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommon, FOLDERID_ProgramFilesCommonX86 или FOLDERID_ProgramFilesCommonX64. Дополнительные сведения см. в разделе KNOWNFOLDERID . Не сохраняйте данные пользователей в папке Program Files.
Используйте соответствующую папку данных для данных, общих для всех пользователей.
Операционная система Местоположение Windows XP, Windows Server 2003 и более ранних версий CSIDL_COMMON_APPDATA Windows Vista и более поздних версий FOLDERID_ProgramData Используйте соответствующую папку данных пользователя для данных, принадлежащих конкретному пользователю.
Операционная система Местоположение Windows XP, Windows Server 2003 и более ранних версий CSIDL_APPDATA, CSIDL_PERSONAL и другие. Windows Vista и более поздних версий FOLDERID_RoamingAppData, FOLDERID_Documents и других. Если необходимо установить расположение, отличное от папки Program Files, убедитесь, что вы правильно устанавливаете списки управления доступом (ACL), чтобы пользователи не имели доступа к неуместным частям файловой системы. Все данные, относящиеся к конкретному пользователю, должны иметь ACL, который предотвращает доступ к нему любого другого пользователя.
При настройке сопоставлений файлов не забудьте правильно указать командную строку. Используйте полный путь и заключите все элементы, содержащие пробелы в кавычках. Переключите параметры команды в отдельные кавычки. В противном случае строка может быть неправильно проанализирована, и приложение не запустится должным образом. Здесь показаны два примера правильно сформированных командных строк.
"C:\Program Files\MyApp\MyApp.exe" "%1" "%2" C:\MyAppDir\MyApp\MyApp.exe "%1"
Замечание
Расположение стандартных папок установки может отличаться от системы к системе. Чтобы получить расположение стандартной папки в определенной системе Windows Vista или более поздней версии, вызовите SHGetKnownFolderPath с соответствующим значением KNOWNFOLDERID. В Windows XP Windows Server 2003 или более ранних системах вызов SHGetFolderLocation или SHGetFolderPath с соответствующим значением CSIDL.
Шлвапи
Упрощенный API оболочки (Shlwapi) включает ряд функций обработки строк. Использование этих функций неправильно может привести к неожиданно усеченным строкам без уведомления о возврате усечения. В следующих случаях не следует использовать функции Shlwapi. Перечисленные альтернативные функции, которые представляют меньше рисков, должны использоваться на их месте.
| Функция Shlwapi | Альтернативная функция |
|---|---|
| StrCat,StrNCat | StringCchCat, StringCbCat и связанные функции |
| StrCpy, StrCpyN | StringCchCopy, StringCbCopy и связанные функции |
| wnsprintf, wvnsprintf | StringCchPrintf, StringCbPrintf и связанные функции |
При использовании таких функций, как PathRelativePathTo , возвращающих путь к файлу, всегда задайте размер буфера для MAX_PATH символов. Это гарантирует, что буфер достаточно велик, чтобы содержать максимальный возможный путь к файлу, а также завершающийся пустой символ.
Дополнительные сведения об альтернативных строковых функциях см. в разделе About Strsafe.h.
Автозаполнение
Не используйте функцию автозаполнения для паролей.
ShellExecute, ShellExecuteEx и связанные функции
Существует несколько функций оболочки, которые можно использовать для запуска приложений: ShellExecute, ShellExecuteEx, WinExec и SHCreateProcessAsUserW. Убедитесь, что вы предоставляете однозначное определение приложения, которое необходимо выполнить.
- При предоставлении пути исполняемого файла укажите полный путь. Не зависят от оболочки, чтобы найти файл.
- Если вы предоставляете строку командной строки, содержащую пробелы, оставьте строку в кавычки. В противном случае средство синтаксического анализа может интерпретировать один элемент, содержащий пробелы в виде нескольких элементов.
Перемещение и копирование файлов
Одним из ключей системы безопасности является правильное назначение списков управления доступом. Вы также можете использовать зашифрованные файлы. Убедитесь, что при перемещении или копировании файлов они назначены правильному ACL и что они не были случайно расшифрованы. Это включает перемещение файлов в корзину, а также в файловой системе. Используйте IFileOperation (Windows Vista или более поздней версии) или SHFileOperation (Windows XP и более ранних версий). Не используйте MoveFile, который может не задать ожидаемый ACL для целевого файла.
Написание расширений безопасного пространства имен
Расширения пространства имен оболочки — это эффективный и гибкий способ представления данных пользователю. Однако они могут вызвать сбой системы, если они неправильно написаны. Некоторые ключевые моменты, которые следует учитывать:
- Не предполагайте правильное форматирование таких данных, как изображения.
- Не предполагайте, что MAX_PATH эквивалентно количеству байтов в строке. Это число символов.
Оповещения системы безопасности
В следующей таблице перечислены некоторые функции, которые могут быть использованы неправильно, скомпрометируйте безопасность приложений.
| Функция | Смягчение последствий |
|---|---|
| ShellExecute, ShellExecuteExuteEx | Поиск, зависящий от проверки ряда расположений по умолчанию для поиска определенного файла, можно использовать в атаке спуфингов. Используйте полный путь, чтобы обеспечить доступ к нужному файлу. |
| StrCat | Первый аргумент psz1 должен быть достаточно большим для хранения psz2 и закрытия "\0", в противном случае может произойти переполнение буфера. Вместо этого используйте один из следующих вариантов. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCatEx, StringCchCatEx, StringCchCatN или StringCchCatNEx. |
| StrCatBuff | Последняя строка не гарантируется, что она будет завершена null. Вместо этого используйте один из следующих вариантов. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCatEx, StringCchCatEx, StringCchCatN или StringCchCatNEx. |
| StrCatChainW | Последняя строка не гарантируется, что она будет завершена null. Вместо этого используйте один из следующих вариантов. StringCbCatEx, StringCbCatNEx, StringCchCatEx или StringCchCatNEx. |
| StrCpy | Первый аргумент psz1 должен быть достаточно большим для хранения psz2 и закрытия "\0", в противном случае может произойти переполнение буфера. Вместо этого используйте один из следующих вариантов. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx,StringCchCopyEx, StringCchCopyEx, StringCchCopyN или StringCchCopyNEx. |
| StrCpyN | Скопированная строка не гарантируется, что она завершается null. Вместо этого используйте один из следующих вариантов. StringCbCopy, StringCbCopyEx, StringCbCopyN,StringCbCopyN,StringCchCopyEx, StringCchCopyEx, StringCchCopyN, StringCchCopyN, StringCchCopyNEx. |
| StrDup | StrDup предполагает, что lpsz является строкой, завершающейся значением NULL. Кроме того, возвращаемая строка не гарантируется завершением null. Вместо этого используйте один из следующих вариантов. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopyEx, StringCchCopyEx, StringCchCopyN или StringCchCopyNEx. |
| StrNCat | Первый аргумент pszFront должен быть достаточно большим для хранения pszBack и закрытия "\0", в противном случае может произойти переполнение буфера. Помните, что последний аргумент cchMax — это количество символов для копирования в pszFront, а не обязательно размер pszFront в байтах. Вместо этого используйте один из следующих вариантов. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCatEx, StringCchCatEx, StringCchCatN или StringCchCatNEx. |
| wnsprintf | Скопированная строка не гарантируется, что она завершается null. Вместо этого используйте один из следующих вариантов. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf или StringCchVPrintfEx. |
| wvnsprintf | Скопированная строка не гарантируется, что она завершается null. Вместо этого используйте один из следующих вариантов. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf или StringCchVPrintfEx. |
Связанные темы