Überlegungen zur Sicherheit: Microsoft Windows Shell
Dieses Thema enthält Informationen zu Sicherheitsüberlegungen 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 Verweis für diesen speziellen 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 gängigeren Probleme und deren Behebung in Ihren Anwendungen erläutert. Beachten Sie, dass Sicherheit nicht auf Internet basierte Exploits beschränkt ist. Auf freigegebenen Systemen, einschließlich Systemen, auf die über Terminal Dienste zugegriffen werden kann, müssen Sie sicherstellen, dass Benutzer nichts tun können, was anderen Benutzern das System möglicherweise schadet.
- Ordnungsgemäße Installation der Anwendung
- Shlwapi
- AutoVervollständigen
- ShellExecute, ShellExecuteEx und verwandte Funktionen
- Verschieben und Kopieren von Dateien
- Schreiben sicherer Namespace Erweiterungen
- Sicherheitswarnungen
- Zugehörige Themen
Ordnungsgemäße Installation der Anwendung
Die Mehrzahl potenzieller shellsicherheitsprobleme können durch eine ordnungsgemäße Installation der Anwendung behoben werden.
Installieren Sie die Anwendung unter dem Ordner "Programme".
Betriebssystem Standort Windows XP, Windows Server 2003 und früher CSIDL- _ Programm _ Dateien Windows Vista und höher Folderid _ Program Files, folderid _ ProgramFilesX86, folderid _ ProgramFilesX64, folderid _ programfilescommon, folderid _ ProgramFilesCommonX86 oder folderid _ ProgramFilesCommonX64. Einzelheiten finden Sie unter KNOWNFOLDERID . Speichern Sie Benutzerdaten nicht 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 Allgemeine CSIDL- _ _ AppData Windows Vista und höher Folderid- _ programmdata Verwenden Sie den entsprechenden Ordner für Benutzerdaten 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 _ -Dokumente und andere. Wenn Sie an einem anderen Speicherort als dem Ordner "Programme" installieren müssen, stellen Sie sicher, dass Sie Zugriffs Steuerungs Listen (ACLs) ordnungsgemäß festlegen, damit Benutzer nicht auf ungeeignete Teile des Dateisystems zugreifen können. 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.
Wenn Sie Dateizuordnungen einrichten, stellen Sie sicher, dass Sie die Befehlszeile ordnungsgemäß angeben. Verwenden Sie einen voll qualifizierten Pfad, und packen Sie alle Elemente, die Leerzeichen enthalten, in Anführungszeichen. Umbruch von Befehlsparametern 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äß formatierte Befehlszeilen angezeigt.
"C:\Program Files\MyApp\MyApp.exe" "%1" "%2" C:\MyAppDir\MyApp\MyApp.exe "%1"
Hinweis
Der Speicherort der Standard Installationsordner kann von System zu System abweichen. Um den Speicherort eines Standard Ordners für ein bestimmtes Windows Vista-oder ein späteres System zu erhalten, wenden Sie shgetknownfolderpath mit dem entsprechenden KNOWNFOLDERID -Wert an. In Windows XP, Windows Server 2003 oder früheren Systemen, rufe Sie shgetfolderlocation oder SHGetFolderPath mit dem entsprechenden CSIDL -Wert auf.
Shlwapi
Die Shell Lightweight API (shlwapi) umfasst eine Reihe von Funktionen zur Zeichen folgen Bearbeitung. Wenn diese Funktionen nicht ordnungsgemäß verwendet werden, kann dies zu unerwarteten abgeschnittene Zeichen folgen führen, ohne dass eine Benachrichtigung über die zurückgegebene abgeschnittene 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 |
|---|---|
| " Strauch", "strauncat " | StringCchCat, stringcbcat und verwandte Funktionen |
| " Strincpy", " straucpyn " | StringCchCopy, stringcbcopy und verwandte Funktionen |
| wnsprintf, wvnsprintf | StringCchPrintf, stringcbprintf und verwandte Funktionen |
Legen Sie mit Funktionen wie pathrelativepathto , die einen Dateipfad zurückgeben, die Größe des Puffers immer auf Max _ . Pfad Zeichen fest. Dadurch wird sichergestellt, dass der Puffer groß genug ist, um den größtmöglichen Dateipfad und ein abschließendes NULL-Zeichen zu speichern.
Weitere Informationen zu den alternativen Zeichen folgen Funktionen finden Sie unter Informationen zu "tresafe. h".
AutoVervollständigen
Verwenden Sie die Funktion "Auto Vervollständigen" nicht für Kenn Wörter.
ShellExecute, ShellExecuteEx und verwandte Funktionen
Es gibt mehrere Shellfunktionen, mit denen Sie Anwendungen starten können: ShellExecute, ShellExecuteEx, winexecund shkreateprocessasuserw. Stellen Sie sicher, dass Sie eine eindeutige Definition der Anwendung angeben, die ausgeführt werden soll.
- Wenn Sie den Pfad der ausführbaren Datei bereitstellen, geben Sie den voll qualifizierten Pfad an. Verwenden Sie die Shell nicht, um nach der Datei zu suchen.
- Wenn Sie eine Befehlszeilen Zeichenfolge bereitstellen, die Leerzeichen enthält, schließen Sie die Zeichenfolge in Anführungszeichen ein. Andernfalls interpretiert der Parser möglicherweise ein einzelnes Element, das Leerzeichen als mehrere Elemente enthält.
Verschieben und Kopieren von Dateien
Ein Schlüssel für die Systemsicherheit ist das ordnungsgemäße Zuweisen von ACLs. Sie können auch verschlüsselte Dateien verwenden. Stellen Sie sicher, dass beim Verschieben oder Kopieren von Dateien die richtige ACL zugewiesen wird und dass Sie nicht versehentlich entschlüsselt wurden. Dies umfasst auch das Verschieben von Dateien in den Papierkorb und innerhalb des Dateisystems. Verwenden Sie IFileOperation (Windows Vista oder höher) oder SHFileOperation (Windows XP und früher). Verwenden Sie nicht " muvefile", wodurch möglicherweise nicht die erwartete ACL für die Zieldatei festgelegt wird.
Schreiben sicherer Namespace Erweiterungen
Shell-Namespace Erweiterungen sind eine leistungsstarke und flexible Möglichkeit, um dem Benutzerdaten zur Verfügung zu stellen. Allerdings können Sie einen Systemfehler verursachen, wenn Sie nicht ordnungsgemäß geschrieben wurden. Beachten Sie dabei einige wichtige Punkte:
- Gehen Sie nicht davon aus, dass Daten wie Bilder ordnungsgemäß formatiert sind.
- Gehen Sie nicht davon aus, dass _ der maximale Pfad der Anzahl von Bytes in einer Zeichenfolge entspricht. Dabei handelt es sich um die Anzahl der Zeichen.
Sicherheitswarnungen
In der folgenden Tabelle werden einige Features aufgelistet, die ggf. die Sicherheit Ihrer Anwendungen beeinträchtigen können.
| Feature | Minderung |
|---|---|
| ShellExecute, ShellExecuteEx | Suchvorgänge, die davon abhängen, dass eine Reihe von Standard Speicherorten zum Suchen nach einer bestimmten Datei überprüft wird, können in einem Spoofing-Angriff verwendet werden. Verwenden Sie einen voll qualifizierten 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 ' aufzunehmen. andernfalls kann ein Pufferüberlauf auftreten. Verwenden Sie stattdessen eine der folgenden Alternativen. Stringcbcat, stringcbcr Ex, stringcbcr n, stringcb-netX, StringCchCat, stringcch|Ex, stringcchkat}oder stringcchkatkatx. |
| Strauch | Es ist nicht garantiert, dass die endgültige Zeichenfolge mit NULL endet. Verwenden Sie stattdessen eine der folgenden Alternativen. Stringcbcat, stringcbcr Ex, stringcbcr n, stringcb-netX, StringCchCat, stringcch|Ex, stringcchkat}oder stringcchkatkatx. |
| "Erw" | Es ist nicht garantiert, dass die endgültige Zeichenfolge mit NULL endet. Verwenden Sie stattdessen eine der folgenden Alternativen. Stringcb-Ex, stringcbcr-x, stringcch| Exoder stringcchcr-x. |
| StrCpy | Das erste Argument, psz1, muss groß genug sein, um psz2 und das schließende ' \ 0 ' aufzunehmen. andernfalls kann ein Pufferüberlauf auftreten. Verwenden Sie stattdessen eine der folgenden Alternativen. Stringcbcopy, stringcbcopyex, stringcbcopyn, stringcbcopynetx, StringCchCopy, stringcchcopyex, stringcchcopynoder stringcchcopynetx. |
| "Straucpyn" | Es ist nicht garantiert, dass die kopierte Zeichenfolge auf NULL endet. Verwenden Sie stattdessen eine der folgenden Alternativen. Stringcbcopy, stringcbcopyex, stringcbcopyn, stringcbcopynetx, StringCchCopy, stringcchcopyex, stringcchcopyn, stringcchcopynetx. |
| StrDup | Bei der über Bildung wird angenommen, dass lpsz eine auf NULL endenden Zeichenfolge ist. Außerdem ist die zurückgegebene Zeichenfolge nicht garantiert NULL-terminiert. Verwenden Sie stattdessen eine der folgenden Alternativen. Stringcbcat, stringcbcopyex, stringcbcopyn, stringcbcopynetx, StringCchCopy, stringcchcopyex, stringcchcopynoder stringcchcopynetx. |
| StrNCat | Das erste Argument, pszfront, muss groß genug sein, um pszback und das schließende ' \ 0 ' aufzunehmen. andernfalls kann ein Pufferüberlauf auftreten. Beachten Sie, dass das letzte Argument, cchmax, die Anzahl der Zeichen ist, die in pszfront kopiert werden sollen, nicht notwendigerweise die Größe von pszfront in Bytes. Verwenden Sie stattdessen eine der folgenden Alternativen. Stringcbcat, stringcbcr Ex, stringcbcr n, stringcb-netX, StringCchCat, stringcch|Ex, stringcchkat}oder stringcchkatkatx. |
| wnsprintf | Es ist nicht garantiert, dass die kopierte Zeichenfolge auf NULL endet. Verwenden Sie stattdessen eine der folgenden Alternativen. Stringcbprintf, stringcbprintfex, stringcbvprintf, stringcbvprintfex, StringCchPrintf, stringcchprintfex, stringcchvprintfoder stringcchvprintfex. |
| wvnsprintf | Es ist nicht garantiert, dass die kopierte Zeichenfolge auf NULL endet. Verwenden Sie stattdessen eine der folgenden Alternativen. Stringcbprintf, stringcbprintfex, stringcbvprintf, stringcbvprintfex, StringCchPrintf, stringcchprintfex, stringcchvprintfoder stringcchvprintfex. |