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

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.

 

Shlwapi

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.

AutoVervollständigen

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.

Verschieben und Kopieren von Dateien

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.

Schreiben von sicheren Namespaceerweiterungen

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.

Sicherheitswarnungen

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.

 

Microsoft Security

Security Developer Center

Microsoft Solution Accelerators

Sicherheits-TechCenter

Informationen zu „Strsafe.h“