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.
- instalowania aplikacji
- Shlwapi
- autouzupełniania
- ShellExecute, ShellExecuteEx i related Functions
- przenoszenie i kopiowanie plików
- pisanie bezpiecznych rozszerzeń przestrzeni nazw
- alerty zabezpieczeń
- Tematy pokrewne
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ł.
ShellExecute, ShellExecuteEx i Related Functions
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. |
Tematy pokrewne
-
o Strsafe.h