Sicherheitsüberlegungen: Microsoft Windows Shell
Dieses Thema enthält Informationen zu Sicherheitsüberlegungen im Zusammenhang mit der Windows-Shell. Dieses Dokument enthält nicht alles, was Sie über Sicherheitsprobleme wissen müssen. Verwenden Sie es stattdessen als Ausgangspunkt und Referenz für diesen spezifischen Technologiebereich.
Die Shell steuert eine Reihe wichtiger Aspekte des Systems, einschließlich mehrerer, die potenzielle Sicherheitsrisiken darstellen, wenn sie nicht ordnungsgemäß behandelt werden. In diesem Thema werden einige der häufigsten Probleme und deren Behebung in Ihren Anwendungen beschrieben. Denken Sie daran, dass die Sicherheit nicht auf internetbasierte Exploits beschränkt ist. Auf gemeinsam genutzten Systemen, einschließlich Systemen, auf die über Terminaldienste zugegriffen werden kann, müssen Sie auch sicherstellen, dass Benutzer nichts tun können, was anderen, die das System gemeinsam nutzen, schaden könnte.
- Ordnungsgemäße Installation Ihrer Anwendung
- Shlwapi
- AutoVervollständigen
- ShellExecute, ShellExecuteEx und verwandte Funktionen
- Verschieben und Kopieren von Dateien
- Schreiben von sicheren Namespaceerweiterungen
- Sicherheitswarnungen
- Zugehörige Themen
Die meisten potenziellen Shell-Sicherheitsprobleme können durch die ordnungsgemäße Installation Ihrer Anwendung behoben werden.
Installieren Sie die Anwendung unter dem Ordner Programme.
Betriebssystem Standort Windows XP, Windows Server 2003 und früher CSIDL_PROGRAM_FILES Windows Vista und höher FOLDERID_ProgramFiles, FOLDERID_ProgramFilesX86, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommon, FOLDERID_ProgramFilesCommonX86 oder FOLDERID_ProgramFilesCommonX64. Einzelheiten finden Sie unter KNOWNFOLDERID . Speichern Sie keine Benutzerdaten im Ordner "Programme".
Verwenden Sie den entsprechenden Datenordner für Daten, die allen Benutzern gemeinsam sind.
Betriebssystem Standort Windows XP, Windows Server 2003 und früher CSIDL_COMMON_APPDATA Windows Vista und höher FOLDERID_ProgramData Verwenden Sie den entsprechenden Benutzerdatenordner für Daten, die zu einem bestimmten Benutzer gehören.
Betriebssystem Standort Windows XP, Windows Server 2003 und früher CSIDL_APPDATA, CSIDL_PERSONAL und andere. Windows Vista und höher FOLDERID_RoamingAppData, FOLDERID_Documents und andere. Wenn Sie an einem anderen Speicherort als dem Ordner "Programme" installieren müssen, stellen Sie sicher, dass Sie Zugriffssteuerungslisten (Access Control Lists, ACLs) ordnungsgemäß festlegen, damit Benutzer keinen Zugriff auf unangemessene Teile des Dateisystems haben. Alle Daten, die für einen bestimmten Benutzer spezifisch sind, sollten über eine ACL verfügen, die verhindert, dass andere Benutzer darauf zugreifen können.
Achten Sie beim Einrichten von Dateizuordnungen darauf, dass Sie die Befehlszeile ordnungsgemäß angeben. Verwenden Sie einen vollqualifizierten Pfad, und umschließen Sie alle Elemente, die Leerzeichen in Anführungszeichen enthalten. Umschließen von Befehlsparametern in separate Anführungszeichen. Andernfalls wird die Zeichenfolge möglicherweise falsch analysiert, und die Anwendung wird nicht ordnungsgemäß gestartet. Zwei Beispiele für ordnungsgemäß formatierte Befehlszeilen werden hier gezeigt.
"C:\Program Files\MyApp\MyApp.exe" "%1" "%2" C:\MyAppDir\MyApp\MyApp.exe "%1"
Hinweis
Der Speicherort der Standardinstallationsordner kann von System zu System variieren. Rufen Sie SHGetKnownFolderPath mit dem entsprechenden KNOWNFOLDERID-Wert auf, um den Speicherort eines Standardordners auf einem bestimmten Windows Vista-System oder höher abzurufen. Rufen Sie in Windows XP, Windows Server 2003 oder früheren Systemen SHGetFolderLocation oder SHGetFolderPath mit dem entsprechenden CSIDL-Wert auf.
Die Shell-Lightweight-API (Shlwapi) enthält eine Reihe von Zeichenfolgenbearbeitungsfunktionen. Wenn Sie diese Funktionen falsch verwenden, kann dies zu unerwartet abgeschnittenen Zeichenfolgen führen, ohne dass eine Benachrichtigung über die Rückgabe des Abschneidens erfolgt. In den folgenden Fällen sollten die Shlwapi-Funktionen nicht verwendet werden. Die aufgeführten alternativen Funktionen, die weniger Risiken darstellen, sollten an ihrer Stelle verwendet werden.
Shlwapi-Funktion | Alternative Funktion |
---|---|
StrCat,StrNCat | StringCchCat, StringCbCat und verwandte Funktionen |
StrCpy, StrCpyN | StringCchCopy, StringCbCopy und verwandte Funktionen |
wnsprintf, wvnsprintf | StringCchPrintf, StringCbPrintf und verwandte Funktionen |
Legen Sie bei Funktionen wie PathRelativePathTo , die einen Dateipfad zurückgeben, immer die Größe des Puffers auf MAX_PATH Zeichen fest. Auf diese Weise wird sichergestellt, dass der Puffer groß genug ist, um den größtmöglichen Dateipfad sowie ein abschließendes NULL-Zeichen zu enthalten.
Weitere Informationen zu den alternativen Zeichenfolgenfunktionen finden Sie unter Informationen zu Strsafe.h.
Verwenden Sie nicht die AutoVervollständigen-Funktion für Kennwörter.
Es gibt mehrere Shellfunktionen, die Sie zum Starten von Anwendungen verwenden können: ShellExecute, ShellExecuteEx, WinExec und SHCreateProcessAsUserW. Stellen Sie sicher, dass Sie eine eindeutige Definition der Anwendung angeben, die ausgeführt werden soll.
- Geben Sie beim Angeben des Pfads der ausführbaren Datei den vollqualifizierten Pfad an. Verlassen Sie sich nicht auf die Shell, um die Datei zu suchen.
- Wenn Sie eine Befehlszeilenzeichenfolge angeben, die Leerzeichen enthält, umschließen Sie die Zeichenfolge in Anführungszeichen. Andernfalls interpretiert der Parser möglicherweise ein einzelnes Element, das Leerzeichen enthält, als mehrere Elemente.
Ein Schlüssel zur Systemsicherheit ist die ordnungsgemäße Zuweisung von ACLs. Sie können auch verschlüsselte Dateien verwenden. Stellen Sie sicher, dass beim Verschieben oder Kopieren von Dateien die richtige ACL zugewiesen ist und dass sie nicht versehentlich entschlüsselt wurden. Dies umfasst das Verschieben von Dateien in den Papierkorb sowie innerhalb des Dateisystems. Verwenden Sie IFileOperation (Windows Vista oder höher) oder SHFileOperation (Windows XP und früher). Verwenden Sie nicht MoveFile, wodurch möglicherweise nicht die erwartete ACL für die Zieldatei festgelegt wird.
Shell-Namespaceerweiterungen sind eine leistungsstarke und flexible Möglichkeit, Daten für den Benutzer zu präsentieren. Sie können jedoch zu Systemfehlern führen, wenn sie nicht ordnungsgemäß geschrieben sind. Beachten Sie einige wichtige Punkte:
- Gehen Sie nicht davon aus, dass Daten wie Bilder ordnungsgemäß formatiert sind.
- Gehen Sie nicht davon aus, dass MAX_PATH der Anzahl von Bytes in einer Zeichenfolge entspricht. Dies ist die Anzahl der Zeichen.
In der folgenden Tabelle sind einige Features aufgeführt, die bei falscher Verwendung die Sicherheit Ihrer Anwendungen beeinträchtigen können.
Funktion | Minderung |
---|---|
ShellExecute, ShellExecuteEx | Suchvorgänge, die von der Überprüfung einer Reihe von Standardspeicherorten abhängen, um eine bestimmte Datei zu finden, können bei einem Spoofingangriff verwendet werden. Verwenden Sie einen vollqualifizierten Pfad, um sicherzustellen, dass Sie auf die gewünschte Datei zugreifen. |
Strcat | Das erste Argument , psz1, muss groß genug sein, um psz2 und das schließende "\0" zu enthalten. Andernfalls kann es zu einem Pufferüberlauf kommen. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat,StringCchCatEx, StringCchCatN, StringCchCatN oder StringCchCatNEx. |
StrCatBuff | Es ist nicht garantiert, dass die endgültige Zeichenfolge null-beendet ist. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat,StringCchCatEx, StringCchCatN, StringCchCatN oder StringCchCatNEx. |
StrCatChainW | Es ist nicht garantiert, dass die endgültige Zeichenfolge null-beendet ist. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCatEx, StringCbCatNEx, StringCchCatEx oder StringCchCatNEx. |
Strcpy | Das erste Argument , psz1, muss groß genug sein, um psz2 und das schließende "\0" zu enthalten. Andernfalls kann es zu einem Pufferüberlauf kommen. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCopy, StringCbCopyEx, StringCbCopyN,StringCbCopyNEx, StringCchCopy,StringCchCopyEx, StringCchCopyN OderStringCchCopyNEx. |
StrCpyN | Die kopierte Zeichenfolge ist nicht garantiert null-beendet. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCopy, StringCbCopyEx, StringCbCopyN,StringCbCopyNEx, StringCchCopy,StringCchCopyEx, StringCchCopyN,StringCchCopyNEx. |
Strings.strdup | StrDup geht davon aus, dass lpsz eine NULL-endende Zeichenfolge ist. Darüber hinaus ist nicht garantiert, dass die zurückgegebene Zeichenfolge NULL-beendet ist. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCat, StringCbCopyEx, StringCbCopyN,StringCbCopyNEx, StringCchCopy,StringCchCopyEx, StringCchCopyNEx, StringCchCopyN oderStringCchCopyNEx. |
StrNCat | Das erste Argument , pszFront, muss groß genug sein, um pszBack und das schließende "\0" zu halten, andernfalls kann es zu einem Pufferüberlauf kommen. Beachten Sie, dass das letzte Argument , cchMax, die Anzahl der Zeichen ist, die in pszFront kopiert werden sollen, nicht unbedingt die Größe der pszFront in Bytes. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat,StringCchCatEx, StringCchCatN, StringCchCatN oder StringCchCatNEx. |
wnsprintf | Die kopierte Zeichenfolge ist nicht garantiert null-beendet. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchPrintfEx, StringCchVPrintfOder StringCchVPrintfEx. |
wvnsprintf | Die kopierte Zeichenfolge ist nicht garantiert null-beendet. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchPrintfEx, StringCchVPrintfOder StringCchVPrintfEx. |