Udostępnij za pośrednictwem


Zagadnienia dotyczące zabezpieczeń: Microsoft Windows Shell

Ten temat zawiera informacje o zagadnieniach dotyczących zabezpieczeń związanych z powłoką systemu Windows. Ten dokument nie może dostarczyć wszystkich informacji o problemach z zabezpieczeniami — zamiast tego należy użyć go jako punktu wyjścia i odwołania do tego konkretnego obszaru technologii.

Powłoka kontroluje wiele ważnych aspektów systemu, w tym kilka, które stanowią potencjalne zagrożenia bezpieczeństwa, jeśli nie są one prawidłowo obsługiwane. W tym temacie opisano niektóre z bardziej typowych problemów i sposób ich rozwiązywania w aplikacjach. Należy pamiętać, że zabezpieczenia nie są ograniczone do internetowych luk w zabezpieczeniach. W systemach udostępnionych, w tym systemach, które są dostępne za pośrednictwem usług terminalowych, należy również upewnić się, że użytkownicy nie mogą wykonywać żadnych czynności, które mogłyby zaszkodzić innym osobom, które współużytkują system.

Prawidłowe instalowanie aplikacji

Większość potencjalnych problemów z zabezpieczeniami powłoki można rozwiązać, poprawnie instalując aplikację.

  • Zainstaluj aplikację w folderze Program Files.

    System operacyjny Lokalizacja
    Windows XP, Windows Server 2003 i starsze CSIDL_PROGRAM_FILES
    Windows Vista i nowsze FOLDERID_ProgramFiles, FOLDERID_ProgramFilesX86, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommon, FOLDERID_ProgramFilesCommonX86 lub FOLDERID_ProgramFilesCommonX64. Aby uzyskać szczegółowe informacje, zobacz KNOWNFOLDERID.

     

  • Nie przechowuj danych użytkownika w folderze Program Files.

    Użyj odpowiedniego folderu danych dla danych, które są wspólne dla wszystkich użytkowników.

    System operacyjny Lokalizacja
    Windows XP, Windows Server 2003 i starsze CSIDL_COMMON_APPDATA
    Windows Vista i nowsze FOLDERID_ProgramData

     

    Użyj odpowiedniego folderu danych użytkownika dla danych należących do określonego użytkownika.

    System operacyjny Lokalizacja
    Windows XP, Windows Server 2003 i starsze CSIDL_APPDATA, CSIDL_PERSONAL i inne.
    Windows Vista i nowsze FOLDERID_RoamingAppData, FOLDERID_Documents i inne.

     

  • Jeśli musisz zainstalować w lokalizacji innej niż folder Program Files, upewnij się, że listy kontroli dostępu (ACL) zostały prawidłowo ustawione, aby użytkownicy nie mieli dostępu do nieodpowiednich części systemu plików. Wszystkie dane specyficzne dla określonego użytkownika powinny mieć listę ACL, która uniemożliwia innym użytkownikom dostęp do niego.

  • Podczas konfigurowania skojarzeń plików należy prawidłowo określić wiersz polecenia. Użyj w pełni kwalifikowanej ścieżki i zawijaj wszystkie elementy zawierające białe znaki cudzysłowu. Zawijaj parametry polecenia w oddzielnych cudzysłowach. W przeciwnym razie ciąg może być niepoprawnie przeanalizowany, a aplikacja nie zostanie uruchomiona poprawnie. W tym miejscu przedstawiono dwa przykłady poprawnie sformułowanych wierszy polecenia.

    "C:\Program Files\MyApp\MyApp.exe" "%1" "%2"
    C:\MyAppDir\MyApp\MyApp.exe "%1"
    

Nuta

Lokalizacja standardowych folderów instalacyjnych może się różnić w zależności od systemu. Aby uzyskać lokalizację folderu standardowego w określonym systemie Windows Vista lub nowszym, wywołaj SHGetKnownFolderPath z odpowiednią wartością KNOWNFOLDERID. W systemie Windows XP, Windows Server 2003 lub starszych systemach wywołaj SHGetFolderLocation lub SHGetFolderPath z odpowiednią wartością CSIDL.

 

Shlwapi

Interfejs API Shell Lightweight API (Shlwapi) zawiera wiele funkcji manipulowania ciągami. Użycie tych funkcji niepoprawnie może prowadzić do nieoczekiwanego obcięcia ciągów bez powiadomienia o zwracanym obcinaniu. W następujących przypadkach nie należy używać funkcji Shlwapi. Wymienione funkcje alternatywne, które stanowią mniej zagrożeń, powinny być używane w ich miejscu.

Shlwapi, funkcja Funkcja alternatywna
StrCat,StrNCat StringCchCat, StringCbCat i powiązane funkcje
StrCpy, StrCpyN StringCchCopy, StringCbCopy i powiązane funkcje
wnsprintf, wvnsprintf StringCchPrintf, StringCbPrintf i powiązane funkcje

 

W przypadku funkcji takich jak PathRelativePathTo, które zwracają ścieżkę pliku, zawsze ustawiają rozmiar buforu na MAX_PATH znaki. Dzięki temu bufor jest wystarczająco duży, aby przechowywać największą możliwą ścieżkę pliku oraz znak null zakończenia.

Aby uzyskać więcej informacji na temat funkcji ciągów alternatywnych, zobacz About Strsafe.h.

Autouzupełnianie

Nie używaj funkcji Autouzupełnianie dla haseł.

Istnieje kilka funkcji powłoki, których można użyć do uruchamiania aplikacji: ShellExecute, ShellExecuteEx, WinExeci SHCreateProcessAsUserW. Upewnij się, że podajesz jednoznaczną definicję aplikacji, która ma zostać wykonana.

  • Podczas podawania ścieżki pliku wykonywalnego podaj w pełni kwalifikowaną ścieżkę. Nie należy polegać na powłoce, aby zlokalizować plik.
  • Jeśli podasz ciąg wiersza polecenia zawierający biały znak, zawiń ciąg w cudzysłowie. W przeciwnym razie analizator może interpretować pojedynczy element zawierający spacje jako wiele elementów.

Przenoszenie i kopiowanie plików

Jednym z kluczy do zabezpieczeń systemu jest prawidłowe przypisywanie list ACL. Możesz również użyć zaszyfrowanych plików. Upewnij się, że podczas przenoszenia lub kopiowania plików przypisano prawidłową listę ACL i że nie zostały przypadkowo odszyfrowane. Obejmuje to przenoszenie plików do kosza , a także w systemie plików. Użyj IFileOperation (Windows Vista lub nowszej) lub SHFileOperation (Windows XP i starsze). Nie należy używać MoveFile, co może nie ustawiać oczekiwanej listy ACL dla pliku docelowego.

Pisanie bezpiecznych rozszerzeń przestrzeni nazw

Rozszerzenia przestrzeni nazw powłoki to zaawansowany i elastyczny sposób prezentowania danych użytkownikowi. Jednak mogą one spowodować awarię systemu, jeśli nie są one poprawnie zapisane. Niektóre kluczowe kwestie, które należy wziąć pod uwagę:

  • Nie zakładaj, że dane, takie jak obrazy, są poprawnie sformatowane.
  • Nie zakładaj, że MAX_PATH jest równoważna liczbie bajtów w ciągu. Jest to liczba znaków .

Alerty zabezpieczeń

W poniższej tabeli wymieniono niektóre funkcje, które mogą w przypadku nieprawidłowego użycia naruszyć bezpieczeństwo aplikacji.

Cecha Łagodzenia
ShellExecute, ShellExecute Ex Wyszukiwania, które zależą od sprawdzania serii domyślnych lokalizacji w celu znalezienia określonego pliku, mogą być używane w ataku fałszowania. Użyj w pełni kwalifikowanej ścieżki, aby upewnić się, że uzyskujesz dostęp do żądanego pliku.
StrCat Pierwszy argument, psz1, musi być wystarczająco duży, aby pomieścić psz2 i zamknięcie "\0", w przeciwnym razie może wystąpić przepełnienie buforu. Zamiast tego należy użyć jednej z następujących alternatyw. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCatCat, StringCchCatEx, StringCchCatNlub StringCchCatNEx.
StrCatBuff Końcowy ciąg nie ma gwarancji, że wartość null zostanie zakończona. Zamiast tego należy użyć jednej z następujących alternatyw. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCatCat, StringCchCatEx, StringCchCatNlub StringCchCatNEx.
strCatChainW Końcowy ciąg nie ma gwarancji, że wartość null zostanie zakończona. Zamiast tego należy użyć jednej z następujących alternatyw. StringCbCatEx, StringCbCatNEx, StringCchCatExlub stringCchCatNEx.
StrCpy Pierwszy argument, psz1, musi być wystarczająco duży, aby pomieścić psz2 i zamknięcie "\0", w przeciwnym razie może wystąpić przepełnienie buforu. Zamiast tego należy użyć jednej z następujących alternatyw. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNlub StringCchCopyNEx.
StrCpyN Skopiowany ciąg nie gwarantuje zakończenia wartości null. Zamiast tego należy użyć jednej z następujących alternatyw. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx.
StrDup StrDup zakłada, że lpsz jest ciągiem zakończonym o wartości null. Ponadto zwrócony ciąg nie gwarantuje zakończenia wartości null. Zamiast tego należy użyć jednej z następujących alternatyw. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNlub StringCchCopyNEx.
StrNCat Pierwszy argument, pszFront, musi być wystarczająco duży, aby pomieścić pszBack i zamykający "\0", w przeciwnym razie może wystąpić przepełnienie buforu. Należy pamiętać, że ostatni argument, cchMax, to liczba znaków do skopiowania do pszFront, niekoniecznie rozmiar pszFront w bajtach. Zamiast tego należy użyć jednej z następujących alternatyw. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCatCat, StringCchCatEx, StringCchCatNlub StringCchCatNEx.
wnsprintf Skopiowany ciąg nie gwarantuje zakończenia wartości null. Zamiast tego należy użyć jednej z następujących alternatyw. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintflub StringCchVPrintfEx.
wvnsprintf Skopiowany ciąg nie gwarantuje zakończenia wartości null. Zamiast tego należy użyć jednej z następujących alternatyw. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintflub StringCchVPrintfEx.

 

Microsoft Security

Security Developer Center

akceleratory rozwiązań firmy Microsoft

Security TechCenter

o Strsafe.h