Freigeben über


Sicherheitsaspekte: Windows-Benutzeroberfläche

Dieses Thema enthält Informationen zu Sicherheitsaspekten in der Windows-Benutzeroberfläche. Dieses Thema bietet nicht alles, was Sie über Sicherheitsprobleme wissen müssen. Verwenden Sie sie stattdessen als Ausgangspunkt und Referenz für diesen Technologiebereich.

Mit der Zunahme der Computerkonnektivität müssen sich Entwickler jetzt mit der Anwendungssicherheit befassen. Die Sicherheit verbessert jedoch auch die allgemeine Anwendungssicherheit und Stabilität; Daher ist es eine andere Möglichkeit, dass der Entwickler eine gute Benutzererfahrung bieten kann. In den folgenden Themen werden einige potenzielle Sicherheitsbedenken bei verwendung der Windows-Benutzeroberfläche erläutert.

Überlegungen zur Zeichenfolge

Viele Funktionen, Nachrichten und Makros verwenden Zeichenfolgen in ihren Parametern. Häufig werden die Zeichenfolgen jedoch nicht auf NULL-Beendigung oder länge überprüft. Ein verwandtes Problem besteht darin, die Länge einer Zeichenfolge oder eines Puffers falsch zu berechnen. In beiden Fällen kann dies zu Pufferüberlauf oder Datenkürzung führen, was sich negativ auf Ihre Anwendung auswirken kann. Weitere Informationen zu Pufferüberläufen und anderen Sicherheitsbedenken finden Sie unter Writing Secure Code von Michael Howard und David Leblanc, Microsoft Press, 2002.

Gehen Sie wie folgt vor, um Zeichenfolgen auf sichere Weise zu behandeln:

  • Überprüfen Sie die Zeichenfolgen nach null-Beendigung oder nach der richtigen Länge, je nach Bedarf.
  • Achten Sie besonders darauf, die Länge einer Zeichenfolge oder eines Puffers zu bestimmen, insbesondere wenn sie TCHAR--Werte enthält.
  • Wenn Sie eine Zeichenfolge erstellen oder eine zuvor verwendete Zeichenfolge verwenden, initialisieren Sie sie nach Bedarf auf Null, oder fügen Sie einen Null-Terminator ein.

Darüber hinaus sollten Sie beim Umgang mit Zeichenfolgen die StrSafe--Funktionen verwenden. Diese Funktionen sind so konzipiert, dass Zeichenfolgen sicher verarbeitet werden.

Benutzereingabe

Die Windows-Benutzeroberfläche befasst sich mit dem Abrufen und Beantworten von Informationen von Benutzern. Benutzer, die falsche Daten eingeben, können Ihre Anwendung jedoch stören, unabhängig davon, ob sie dies beabsichtigen. Daher ist die Kardinalregel, dass alle Eingaben überprüft werden müssen.

Von erster Bedeutung sind Zeichenfolgendaten, die in Zeichenfolgenüberlegungenerläutert werden. Alle Eingabetypen sollten jedoch überprüft werden, bevor sie von Ihrer Anwendung verwendet werden. Ein weiteres Problem besteht darin, dass Daten an einem Punkt überprüft werden, sich aber vor der Verwendung ändern, z. B. beim Empfangen von Nachrichten, die die Textlänge angeben. Wenn sich die Daten möglicherweise ändern können, sollten Sie die Daten also genau vor der Verwendung überprüfen.

Sicherheitswarnungen

In der folgenden Tabelle sind Features aufgeführt, die bei falscher Verwendung die Sicherheit Ihrer Anwendungen gefährden können.

Merkmal Milderung
GetAtomName- Achten Sie beim Angeben der Größe des Puffers darauf.
GlobalGetAtomName- Auf globale Zeichenfolgenatome kann für jede Anwendung zugegriffen werden. Wenn jedoch eine andere Anwendung sorglos ist, könnte sie ihre Verweisanzahl falsch umgehen und löschen. Sie sollten stattdessen die Verwendung globaler ganzzahliger Atome in Betracht ziehen.
ImitateDdeClientWindow Wenn die Funktion fehlschlägt, werden nachfolgende Clientanforderungen im Sicherheitskontext des aufrufenden Prozesses gestellt. Dies kann ein Problem sein, wenn der Aufrufvorgang als hoch privilegiertes Konto ausgeführt wird. Wenn der Aufruf fehlschlägt oder einen Fehler auslöst, wird die Ausführung der Clientanforderung daher nicht fortgesetzt.
DdeImpersonateClient- Wenn die Funktion fehlschlägt, werden nachfolgende Clientanforderungen im Sicherheitskontext des aufrufenden Prozesses gestellt. Dies kann ein Problem sein, wenn der Aufrufvorgang als hoch privilegiertes Konto ausgeführt wird. Wenn der Aufruf fehlschlägt oder einen Fehler auslöst, wird die Ausführung der Clientanforderung daher nicht fortgesetzt.
GetClipboardFormatName- Eine Fehlberechnung der richtigen Größe des lpszFormatName Puffers, insbesondere, wenn die Anwendung in ANSI- und Unicode-Versionen verwendet wird, kann zu einem Pufferüberlauf führen. Beachten Sie außerdem, dass die Zeichenfolge abgeschnitten wird, wenn sie länger als der cchMaxCount Parameter ist, der zu Einem Verlust von Informationen führen kann.
GetMenuString- Der parameter lpString ist ein TCHAR- puffer, und nMaxCount ist die Länge der Menüzeichenfolge in TCHARs. Die Falsche Größenanpassung dieser Parameter kann die Länge der Menüzeichenfolge in Zeichen sein. Die Größenanpassung dieser Parameter kann zu einem Abschneiden der Zeichenfolge führen, was zu möglichen Datenverlusten führt.
GetStringTypeA, GetStringTypeEx, GetStringTypeW Um einen Pufferüberlauf zu vermeiden, legen Sie die Größe des lpCharType- Puffer richtig fest.
LoadLibrary- Die Verwendung von LoadLibrary- kann die Sicherheit Ihrer Anwendung kompromittieren, indem die falsche DLL geladen wird.
LoadString- Falsche Verwendung umfasst das Angeben der falschen Größe im nBufferMax Parameter. Beispielsweise gibt sizeof(lpBuffer) die Größe des Puffers in Byte, was zu einem Pufferüberlauf für die Unicode-Version der Funktion führen kann. Pufferüberlaufsituationen sind die Ursache vieler Sicherheitsprobleme in Anwendungen. In diesem Fall erhält die Verwendung von sizeof(lpBuffer)/sizeof(TCHAR) die richtige Größe des Puffers.
lstrcat- Diese Funktion verwendet die strukturierte Ausnahmebehandlung (SEH), um Zugriffsverletzungen und andere Fehler abzufangen. Wenn diese Funktion SEH-Fehler abfangen, gibt sie NULL- ohne NULL-Beendigung der Zeichenfolge und ohne NULL zurück, ohne die Zeichenfolge zu beenden und ohne den Aufrufer des Fehlers zu benachrichtigen. Der Aufrufer kann nicht davon ausgehen, dass nicht genügend Speicherplatz die Fehlerbedingung ist. Das erste Argument, lpString1, muss groß genug sein, um lpString2- und den schließenden "\0" aufzunehmen, andernfalls kann ein Pufferüberlauf auftreten. Pufferüberläufe können zu einem Denial-of-Service-Angriff auf die Anwendung führen, wenn eine Zugriffsverletzung auftritt. Im schlimmsten Fall kann ein Pufferüberlauf es einem Angreifer ermöglichen, ausführbaren Code in Ihren Prozess einzufügen, insbesondere, wenn lpString1- ein stapelbasierter Puffer ist. Erwägen Sie die Verwendung einer der folgenden Alternativen. StringCbCat oder StringCchCat.
lstrcpy- Diese Funktion verwendet die strukturierte Ausnahmebehandlung (SEH), um Zugriffsverletzungen und andere Fehler abzufangen. Wenn diese Funktion SEH-Fehler abfangen, gibt sie NULL- ohne NULL-Beendigung der Zeichenfolge und ohne NULL zurück, ohne die Zeichenfolge zu beenden und ohne den Aufrufer des Fehlers zu benachrichtigen. Der Aufrufer kann nicht davon ausgehen, dass nicht genügend Speicherplatz die Fehlerbedingung ist. Das erste Argument, lpString1, muss groß genug sein, um lpString2- und den schließenden "\0" aufzunehmen, andernfalls kann ein Pufferüberlauf auftreten. Pufferüberläufe können zu einem Denial-of-Service-Angriff auf die Anwendung führen, wenn eine Zugriffsverletzung auftritt. Im schlimmsten Fall kann ein Pufferüberlauf es einem Angreifer ermöglichen, ausführbaren Code in Ihren Prozess einzufügen, insbesondere, wenn lpString1- ein stapelbasierter Puffer ist. Verwenden Sie stattdessen StringCchCopy-.
lstrcpyn Diese Funktion verwendet die strukturierte Ausnahmebehandlung (SEH), um Zugriffsverletzungen und andere Fehler abzufangen. Wenn diese Funktion SEH-Fehler abfangen, gibt sie NULL- ohne NULL-Beendigung der Zeichenfolge und ohne NULL zurück, ohne die Zeichenfolge zu beenden und ohne den Aufrufer des Fehlers zu benachrichtigen. Der Aufrufer kann nicht davon ausgehen, dass nicht genügend Speicherplatz die Fehlerbedingung ist. Wenn lpString1- nicht groß genug ist, um die kopierte Zeichenfolge zu enthalten, kann ein Pufferüberlauf auftreten. Beachten Sie auch beim Kopieren einer gesamten Zeichenfolge, dass Größe von die Anzahl der Bytes und nicht WCHAR-zurückgibt, dass Größe von die Anzahl der Bytes und nicht zeichen zurückgibt, was für die Unicode-Version dieser Funktion falsch ist. Pufferüberläufe können zu einem Denial-of-Service-Angriff auf die Anwendung führen, wenn eine Zugriffsverletzung auftritt. Im schlimmsten Fall kann ein Pufferüberlauf es einem Angreifer ermöglichen, ausführbaren Code in Ihren Prozess einzufügen, insbesondere, wenn lpString1- ein stapelbasierter Puffer ist. Verwenden Sie stattdessen StringCchCopy-.
lstrlen lstrlen geht davon aus, dass lpString- eine null-beendete Zeichenfolge ist. Wenn dies nicht der Fall ist, kann dies zu einem Pufferüberlauf oder einem Denial-of-Service-Angriff auf Ihre Anwendung führen. Erwägen Sie die Verwendung einer der folgenden Alternativen. StringCbLength oder StringCchLength.
wsprintf- Die in lpOut- zurückgegebene Zeichenfolge ist nicht garantiert null-beendet. Vermeiden Sie außerdem das %s Format, das zu einem Pufferüberlauf führen kann. Wenn eine Zugriffsverletzung auftritt, führt dies zu einem Denial of Service gegen Ihre Anwendung. Im schlimmeren Fall kann ein Angreifer ausführbaren Code einfügen. Erwägen Sie die Verwendung einer der folgenden Alternativen. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfoder StringCchVPrintfEx.
wvsprintf Die in lpOutput- zurückgegebene Zeichenfolge ist nicht garantiert null-terminated. Vermeiden Sie außerdem die Verwendung des %s Formats, was zu einem Pufferüberlauf führen kann. Dies kann zu einem Denial of Service führen, wenn er zu einer Zugriffsverletzung führt, oder ein Angreifer kann ausführbaren Code einfügen. Erwägen Sie die Verwendung einer der folgenden Alternativen. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfoder StringCchVPrintfEx.

 

Microsoft Security

Sicherheits- und Identitäts-

Security Hows Index

Microsoft Security Response Center

bewährte Methoden für die Sicherheits-APIs