Вопросы безопасности: оболочка Microsoft Windows
В этом разделе содержатся сведения о рекомендациях по обеспечению безопасности, связанных с оболочкой 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), чтобы у пользователей не было доступа к неподходящим частям файловой системы. Все данные, относящиеся к конкретному пользователю, должны иметь список управления доступом, который не позволяет другим пользователям получить к ним доступ.
При настройке сопоставлений файлов не забудьте правильно указать командную строку. Используйте полный путь и заключите все элементы, содержащие пробелы, в кавычки. Заключите параметры команды в отдельные кавычки. В противном случае строка может быть неправильно проанализирована, и приложение не запустится должным образом. Здесь приведены два примера правильно сформированных командных строк.
"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. Перечисленные альтернативные функции, которые представляют меньше рисков, следует использовать вместо них.
Функция Шлвапи | Альтернативная функция |
---|---|
StrCat,StrNCat | StringCchCat, StringCbCat и связанные функции |
StrCpy, StrCpyN | StringCchCopy, StringCbCopy и связанные функции |
wnsprintf, wvnsprintf | StringCchPrintf, StringCbPrintf и связанные функции |
С помощью таких функций, как PathRelativePathTo , возвращающих путь к файлу, всегда устанавливайте размер буфера MAX_PATH символов. Это гарантирует, что буфер будет достаточно большим, чтобы вместить максимально возможный путь к файлу, а также завершающий символ NULL.
Дополнительные сведения об альтернативных строковых функциях см. в разделе Сведения о Strsafe.h.
Не используйте функцию автозаполнения для паролей.
Существует несколько функций оболочки, которые можно использовать для запуска приложений: ShellExecute, ShellExecuteEx, WinExec и SHCreateProcessAsUserW. Убедитесь, что вы предоставили однозначное определение приложения, которое должно быть выполнено.
- При указании пути к исполняемому файлу укажите полный путь. Не зависит от оболочки, чтобы найти файл.
- Если указана строка командной строки, содержащая пробелы, заключите строку в кавычки. В противном случае средство синтаксического анализа может интерпретировать один элемент, содержащий пробелы как несколько элементов.
Одним из ключей безопасности системы является правильное назначение списков управления доступом. Вы также можете использовать зашифрованные файлы. Убедитесь, что при перемещении или копировании файлов им назначен правильный ACL и что они не были случайно расшифрованы. Сюда входит перемещение файлов в корзину, а также в файловой системе. Используйте IFileOperation (Windows Vista или более поздней версии) или SHFileOperation (Windows XP и более ранние версии). Не используйте MoveFile, который может не задать ожидаемый список ACL для целевого файла.
Расширения пространства имен оболочки — это эффективный и гибкий способ представления данных пользователю. Однако они могут привести к сбою системы, если они неправильно записаны. Следует помнить о некоторых ключевых моментах:
- Не следует предполагать, что такие данные, как изображения, имеют правильный формат.
- Не предполагайте, что MAX_PATH эквивалентно количеству байтов в строке. Это количество символов.
В следующей таблице перечислены некоторые функции, которые при неправильном использовании могут поставить под угрозу безопасность приложений.
Компонент | Меры по снижению риска |
---|---|
ShellExecute, ShellExecuteEx | Поиск, зависящий от проверки ряда расположений по умолчанию для поиска определенного файла, можно использовать в атаке спуфингов. Используйте полный путь, чтобы обеспечить доступ к нужному файлу. |
StrCat | Первый аргумент , psz1, должен быть достаточно большим, чтобы вместить psz2 и закрывающий "\0", в противном случае может произойти переполнение буфера. Вместо этого используйте один из следующих вариантов. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat,StringCchCatEx, StringCchCatN или StringCchCatNEx. |
StrCatBuff | Окончательная строка не гарантируется, что она будет заканчиваться null. Вместо этого используйте один из следующих вариантов. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat,StringCchCatEx, StringCchCatN или StringCchCatNEx. |
StrCatChainW | Окончательная строка не гарантируется, что она будет заканчиваться null. Вместо этого используйте один из следующих вариантов. StringCbCatEx, StringCbCatNEx, StringCchCatEx или StringCchCatNEx. |
StrCpy | Первый аргумент , psz1, должен быть достаточно большим, чтобы вместить psz2 и закрывающий "\0", в противном случае может произойти переполнение буфера. Вместо этого используйте один из следующих вариантов. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN или StringCchCopyN. |
StrCpyN | Скопированная строка не гарантирует, что она будет заканчиваться null. Вместо этого используйте один из следующих вариантов. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, StringCchCopyN. |
StrDup | StrDup предполагает, что lpsz является строкой, завершающейся null. Кроме того, возвращаемая строка не гарантируется, что она будет завершаться null. Вместо этого используйте один из следующих вариантов. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN или StringCchCopyN. |
StrNCat | Первый аргумент, pszFront, должен быть достаточно большим, чтобы вместить pszBack и закрывающий "\0", в противном случае может произойти переполнение буфера. Имейте в виду, что последний аргумент cchMax — это количество символов для копирования в pszFront, а не обязательно размер pszFront в байтах. Вместо этого используйте один из следующих вариантов. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat,StringCchCatEx, StringCchCatN или StringCchCatNEx. |
wnsprintf | Скопированная строка не гарантирует, что она будет заканчиваться null. Вместо этого используйте один из следующих вариантов. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf или StringCchVPrintfEx. |
wvnsprintf | Скопированная строка не гарантирует, что она будет заканчиваться null. Вместо этого используйте один из следующих вариантов. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf или StringCchVPrintfEx. |