Sicherheitsaspekte: Microsoft Windows Shell
Dieses Thema enthält Informationen zu Sicherheitsaspekten im Zusammenhang mit der Windows-Shell. Dieses Dokument kann nicht alles bereitstellen, 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äufigeren 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, die über Terminaldienste zugänglich sind, müssen Sie auch sicherstellen, dass Benutzer nichts tun können, das anderen, die das System teilen, schaden könnte.
- ordnungsgemäße Installation Der Anwendung
- Shlwapi
- AutoVervollständigen-
- ShellExecute, ShellExecuteEx und verwandte Funktionen
- Verschieben und Kopieren von Dateien
- Schreiben sicherer Namespaceerweiterungen
- Sicherheitswarnungen
- Verwandte Themen
Ordnungsgemäße Installation Der Anwendung
Die meisten potenziellen Shell-Sicherheitsprobleme können durch die ordnungsgemäße Installation Ihrer Anwendung verringert werden.
Installieren Sie die Anwendung unter dem Ordner "Programme".
Betriebssystem Ort Windows XP, Windows Server 2003 und frühere Versionen 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 für alle Benutzer gemeinsam sind.
Betriebssystem Ort Windows XP, Windows Server 2003 und frühere Versionen 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 Ort Windows XP, Windows Server 2003 und frühere Versionen CSIDL_APPDATA, CSIDL_PERSONAL und andere. Windows Vista und höher FOLDERID_RoamingAppData, FOLDERID_Documents und andere. Wenn Sie einen anderen Speicherort als den 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 ein anderer Benutzer darauf zugreift.
Achten Sie beim Einrichten von Dateizuordnungen darauf, die Befehlszeile ordnungsgemäß anzugeben. Verwenden Sie einen vollqualifizierten Pfad, und umschließen Sie alle Elemente, die Leerzeichen in Anführungszeichen enthalten. Umbruchbefehlsparameter in separaten Anführungszeichen. Andernfalls wird die Zeichenfolge möglicherweise falsch analysiert, und die Anwendung wird nicht ordnungsgemäß gestartet. Hier werden zwei Beispiele für ordnungsgemäß gebildete Befehlszeilen gezeigt.
"C:\Program Files\MyApp\MyApp.exe" "%1" "%2" C:\MyAppDir\MyApp\MyApp.exe "%1"
Anmerkung
Der Speicherort der Standardinstallationsordner kann von System zu System variieren. Rufen Sie SHGetKnownFolderPath- mit dem entsprechenden KNOWNFOLDERID-Wert auf, um den Speicherort eines Standardordners in einem bestimmten Windows Vista- oder höher-System 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 Zeichenfolgenmanipulationsfunktionen. Die Falsche Verwendung dieser Funktionen kann zu unerwartet abgeschnittenen Zeichenfolgen führen, ohne dass die Benachrichtigung über den Abbruch zurückgegeben wird. In den folgenden Fällen sollten die Shlwapi-Funktionen nicht verwendet werden. Die aufgeführten alternativen Funktionen, die weniger Risiken darstellen, sollten an ihrem Ort verwendet werden.
Shlwapi-Funktion | Alternative Funktion |
---|---|
StrCat,StrNCat | StringCchCat, StringCbCat und zugehörige Funktionen |
StrCpy, StrCpyN | StringCchCopy, StringCbCopy und zugehörige Funktionen |
wnsprintf, wvnsprintf | StringCchPrintf, StringCbPrintf und zugehörige Funktionen |
Mit Funktionen wie PathRelativePathTo, die einen Dateipfad zurückgeben, legen Sie immer die Größe des Puffers auf MAX_PATH Zeichen fest. Dadurch wird sichergestellt, dass der Puffer groß genug ist, um den größtmöglichen Dateipfad sowie ein endendes NULL-Zeichen zu enthalten.
Weitere Informationen zu den alternativen Zeichenfolgenfunktionen finden Sie unter About Strsafe.h.
AutoVervollständigen
Verwenden Sie das AutoVervollständigen-Feature nicht für Kennwörter.
ShellExecute, ShellExecuteEx und verwandte Funktionen
Es gibt mehrere Shell-Funktionen, mit denen Sie Anwendungen starten können: ShellExecute, ShellExecuteEx, WinExecund SHCreateProcessAsUserW. Stellen Sie sicher, dass Sie eine eindeutige Definition der Anwendung bereitstellen, die ausgeführt werden soll.
- Geben Sie beim Bereitstellen des Pfads der ausführbaren Datei den vollqualifizierten Pfad an. Hängen Sie nicht von der Shell ab, um die Datei zu finden.
- Wenn Sie eine Befehlszeilenzeichenfolge bereitstellen, die Leerzeichen enthält, schließen Sie die Zeichenfolge in Anführungszeichen um. 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. Dazu gehören das Verschieben von Dateien in den Papierkorbsowie innerhalb des Dateisystems. Verwenden Sie IFileOperation (Windows Vista oder höher) oder SHFileOperation (Windows XP und früher). Verwenden Sie MoveFile-nicht, wodurch die erwartete ACL für die Zieldatei möglicherweise nicht festgelegt wird.
Schreiben sicherer Namespaceerweiterungen
Shell-Namespaceerweiterungen sind eine leistungsfähige und flexible Möglichkeit zum Präsentieren von Daten für den Benutzer. Sie können jedoch zu Systemfehlern führen, wenn sie nicht ordnungsgemäß geschrieben wurden. Einige wichtige Punkte, die Sie berücksichtigen sollten:
- Gehen Sie nicht davon aus, dass Daten wie Bilder richtig formatiert sind.
- Gehen Sie nicht davon aus, dass MAX_PATH der Anzahl der Byte entspricht, die in einer Zeichenfolge. Es 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.
Merkmal | Milderung |
---|---|
ShellExecute, ShellExecuteEx | Suchvorgänge, die von der Überprüfung einer Reihe von Standardspeicherorten abhängen, um eine bestimmte Datei zu finden, können in 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 halten, andernfalls kann ein Pufferüberlauf auftreten. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNoder StringCchCatNEx. |
StrCatBuff- | Die endgültige Zeichenfolge ist nicht garantiert null-beendet. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNoder StringCchCatNEx. |
StrCatChainW- | Die endgültige Zeichenfolge ist nicht garantiert null-beendet. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCatEx, StringCbCatNEx, StringCchCatExoder StringCchCatNEx. |
StrCpy- | Das erste Argument, psz1, muss groß genug sein, um psz2 und das schließende "\0" zu halten, andernfalls kann ein Pufferüberlauf auftreten. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNoder StringCchCopyNEx. |
StrCpyN- | Die kopierte Zeichenfolge ist nicht garantiert null-beendet. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx. |
StrDup- | StrDup- geht davon aus, dass lpsz- eine mit Null beendete Zeichenfolge ist. Darüber hinaus ist die zurückgegebene Zeichenfolge nicht garantiert null-beendet. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNoder StringCchCopyNEx. |
StrNCat- | Das erste Argument, pszFront, muss groß genug sein, um pszBack- und das schließende "\0" zu halten, andernfalls kann ein Pufferüberlauf auftreten. Beachten Sie, dass das letzte Argument, cchMax, die Anzahl der Zeichen ist, die in pszFrontkopiert werden sollen, nicht unbedingt die Größe der pszFront- in Byte. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNoder StringCchCatNEx. |
wnsprintf- | Die kopierte Zeichenfolge ist nicht garantiert null-beendet. Verwenden Sie stattdessen eine der folgenden Alternativen. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, 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, StringCchVPrintfoder StringCchVPrintfEx. |
Verwandte Themen