Entwerfen von Anwendungen, die mit einer niedrigen Integritätsstufe ausgeführt werden
Eine einfache Möglichkeit, einen Anwendungsprozess mit einer niedrigen Integritätsebene auszuführen, besteht darin, die Integritätsebene der ausführbaren Programmdatei auf niedrige Integrität festzulegen. Wenn diese Imagedatei gestartet wird, wird der Anwendungsprozess mit einer niedrigen Integritätsebene gestartet. Angenommen, wir möchten die Windows-Rechneranwendung in einem Prozess mit niedriger Integrität ausführen.
So führen Sie calc.exe mit niedriger Integrität aus
Erstellen Sie eine Kopie von c:\Windows\system32\calc.exe in einen temporären Ordner.
Verwenden Sie das icacls-Programm, um die Integritätsebene der temporären Datei lowcalc.exe mit dem Befehl icacls auf niedrige Integrität festzulegen:
icacls lowcalc.exe /setintegritylevel Low
Führen Sie die Low-Integrity-Version von calc.exe aus.
Die folgende Abbildung zeigt die Schritte zum Ausführen des Windows-Rechners in einem Prozess mit niedriger Integrität.
Abbildung 9 Starten des Windows-Rechners mit niedriger Integrität
Sie können process Explorer verwenden, um zu bestätigen, dass die Imagedatei (lowcalc.exe) tatsächlich mit niedriger Integrität ausgeführt wird. Die Spalte Integritätsstufe befindet sich auf der rechten Seite des Bilds.
Abbildung 10 Niedriger Rechnerprozess
Nicht alle Anwendungsprogramme werden ordnungsgemäß in einem Prozess mit niedriger Integrität ausgeführt. Ein Prozess mit niedriger Integrität hat keinen Schreibzugriff auf die meisten Bereiche unter dem lokalen Profilbereich des Benutzers des Dateisystems oder der Registrierung unter HKCU. Die Unfähigkeit eines Prozesses mit niedriger Integrität, Schreibzugriff auf das Benutzerprofil zu erhalten, ist eine gute Sache, wenn das Programm unerwünschte Schadsoftware ist. Bei Anwendungen wie dem internetgeschützten Modus Explorer kann jedoch eine Neugestaltung erforderlich sein, damit sich alle Features der Anwendung ordnungsgemäß verhalten.
Verwenden Sie hilfreiche Tools wie den Prozessmonitor von Sysinternals.com, um eine Vorstellung davon zu erhalten, welche Datei- und Registrierungsressourcen eine Anwendung derzeit für den Schreibzugriff verwendet, der bei ausführung mit niedriger Integrität fehlschlägt.
Obwohl es möglich ist, eine Anwendung so zu ändern, dass sie vollständig mit niedriger Integrität ausgeführt wird, funktionieren einige Features der Anwendung möglicherweise nur ordnungsgemäß, wenn sie in einem Prozess mit mittlerer Integrität implementiert werden. Eine Anwendung, die mit niedriger Integrität ausgeführt wird, kann einen Teil der Anwendung in einem Prozess mit niedriger Integrität aufweisen, z. B. zur Verarbeitung nicht vertrauenswürdiger Daten aus dem Internet. Ein weiterer Teil der Anwendung kann in einem Brokerprozess mit mittlerer Integrität implementiert werden, um eine kleine Gruppe von vom Benutzer initiierten Aktionen zu verarbeiten. Die Kommunikation zwischen den Prozessen mit niedriger und mittlerer Integrität in der Anwendung kann mithilfe verschiedener IPC-Mechanismen erfolgen. Der Teil der Mittleren Integrität der Anwendung muss davon ausgehen, dass alle Daten und Code im Prozess mit niedriger Integrität nicht vertrauenswürdig sind.
Internet Explorer im geschützten Modus ist eine Anwendung, die so umgestaltet wurde, dass sie in einem Prozess mit niedriger Integrität ausgeführt wird. Weitere Informationen zu Internet-Explorer im geschützten Modus finden Sie unter Grundlegendes und Arbeiten im internetgeschützten Modus Explorer (https://go.microsoft.com/fwlink/?LinkId=90931).
Die Standard Themen zum Entwerfen einer Anwendung, die mit niedriger Integrität ausgeführt wird, sind die folgenden:
- Starten eines untergeordneten Prozesses mit niedriger Integrität
- Schreibbare Speicherorte für Anwendungen mit niedriger Integrität
- Kommunikation zwischen Prozessen mit niedriger Integrität und höherer Ebene
Starten eines Prozesses mit niedriger Integrität
Standardmäßig erben untergeordnete Prozesse die Integritätsebene ihres übergeordneten Prozesses. Um einen Prozess mit niedriger Integrität zu starten, müssen Sie mithilfe der Funktion CreateProcessAsUser einen neuen untergeordneten Prozess mit einem Zugriffstoken mit niedriger Integrität starten. Um einen Prozess mit niedriger Integrität aus einem Prozess mit mittlerer Integrität zu starten, müssen Sie den neuen Prozess explizit als niedrige Integrität starten.
So starten Sie einen Prozess mit niedriger Integrität
Duplizieren Sie das Handle des aktuellen Prozesses, der sich auf mittlerer Integritätsebene befindet.
Verwenden Sie SetTokenInformation, um die Integritätsebene im Zugriffstoken auf Niedrig festzulegen.
Verwenden Sie CreateProcessAsUser, um mithilfe des Handles für das Zugriffstoken mit niedriger Integrität einen neuen Prozess zu erstellen.
CreateProcessAsUser aktualisiert den Sicherheitsdeskriptor im neuen untergeordneten Prozess und den Sicherheitsdeskriptor für das Zugriffstoken, um der Integritätsebene des Zugriffstokens mit niedriger Integrität zu entsprechen.
Im folgenden Codebeispiel wird dieser Vorgang veranschaulicht.
void CreateLowProcess()
{
BOOL fRet;
HANDLE hToken = NULL;
HANDLE hNewToken = NULL;
PSID pIntegritySid = NULL;
TOKEN_MANDATORY_LABEL TIL = {0};
PROCESS_INFORMATION ProcInfo = {0};
STARTUPINFO StartupInfo = {0};
// Notepad is used as an example
WCHAR wszProcessName[MAX_PATH] =
L"C:\\Windows\\System32\\Notepad.exe";
// Low integrity SID
WCHAR wszIntegritySid[20] = L"S-1-16-1024";
PSID pIntegritySid = NULL;
fRet = OpenProcessToken(GetCurrentProcess(),
TOKEN_DUPLICATE |
TOKEN_ADJUST_DEFAULT |
TOKEN_QUERY |
TOKEN_ASSIGN_PRIMARY,
&hToken);
if (!fRet)
{
goto CleanExit;
}
fRet = DuplicateTokenEx(hToken,
0,
NULL,
SecurityImpersonation,
TokenPrimary,
&hNewToken);
if (!fRet)
{
goto CleanExit;
}
fRet = ConvertStringSidToSid(wszIntegritySid, &pIntegritySid);
if (!fRet)
{
goto CleanExit;
}
TIL.Label.Attributes = SE_GROUP_INTEGRITY;
TIL.Label.Sid = pIntegritySid;
//
// Set the process integrity level
//
fRet = SetTokenInformation(hNewToken,
TokenIntegrityLevel,
&TIL,
sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid));
if (!fRet)
{
goto CleanExit;
}
//
// Create the new process at Low integrity
//
fRet = CreateProcessAsUser(hNewToken,
NULL,
wszProcessName,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&StartupInfo,
&ProcInfo);
CleanExit:
if (ProcInfo.hProcess != NULL)
{
CloseHandle(ProcInfo.hProcess);
}
if (ProcInfo.hThread != NULL)
{
CloseHandle(ProcInfo.hThread);
}
LocalFree(pIntegritySid);
if (hNewToken != NULL)
{
CloseHandle(hNewToken);
}
if (hToken != NULL)
{
CloseHandle(hToken);
}
return fRet;
}
Schreibbare Speicherorte mit niedriger Integrität
Windows Vista verfügt über bestimmte Datei- und Registrierungsspeicherorte, denen niedrige obligatorische Bezeichnungen zugewiesen sind, um Schreibzugriff auf Anwendungen mit niedriger Integrität zu ermöglichen. Tabelle 10 zeigt diese schreibbaren Speicherorte.
Tabelle 10 Speicherorte, die für niedrige obligatorische Bezeichnungen schreibbar sind
Standort | Beschreibbarer Bereich |
---|---|
Registrierung |
Prozesse mit niedriger Integrität können Unterschlüssel unter HKEY_CURRENT_USER\Software\AppDataLow |
Dateisystem |
Prozesse mit niedriger Integrität können Unterordner unter %USER PROFILE%\AppData\LocalLow schreiben und erstellen. |
Herabsetzen einer obligatorischen Ressourcenbezeichnung
Aufgrund potenzieller Sicherheitsrisiken wird davon abgeraten, einen Prozess mit höherer Integrität zu entwerfen, um Eingaben zu akzeptieren oder Ressourcen mit Prozessen mit niedriger Integrität gemeinsam zu nutzen. Der Prozess mit niedriger Integrität kann böswilliges Verhalten versuchen. Es kann jedoch erforderlich sein, diese Aktion entwurfsbedingt auszuführen.
Hinweis
Anwendungen, die Eingaben von Oder Freigeben von Ressourcen mit Prozessen mit niedrigerer Integrität akzeptieren, sollten davon ausgehen, dass Daten, die Prozesse mit niedrigerer Integrität bereitstellen, nicht vertrauenswürdig sind, und dann eine entsprechende Überprüfung durchführen. Im geschützten Modus internet Explorer wird beispielsweise das Dialogfeld Speichern unter aus dem Internet Explorer Benutzerbrokerprozess angezeigt. Auf diese Weise können Benutzer bestätigen, dass sie eine Datei mithilfe eines Prozesses speichern möchten, der mit höheren Rechten als internetgeschützter Modus Explorer ausgeführt wird.
Da Anwendungen mit niedriger Integrität nur in Ressourcen mit niedriger Integrität schreiben können, müssen Sie die Integritätsebene der freigegebenen Ressourcen verringern.
So verringern Sie die Integritätsebene der freigegebenen Ressourcen
Erstellen Sie einen SDDL-Sicherheitsdeskriptor, der eine niedrige obligatorische Bezeichnung definiert.
Konvertieren Sie die SDDL-Zeichenfolge in einen Sicherheitsdeskriptor.
Weisen Sie dem Sicherheitsdeskriptor das Attribut mit niedriger Integrität zu.
Weisen Sie der freigegebenen Ressource den Sicherheitsdeskriptor zu.
Im folgenden Codebeispiel wird dieser Vorgang veranschaulicht.
#include <sddl.h>
#include <AccCtrl.h>
#include <Aclapi.h>
void SetLowLabelToFile()
{
// The LABEL_SECURITY_INFORMATION SDDL SACL to be set for low integrity
#define LOW_INTEGRITY_SDDL_SACL_W L"S:(ML;;NW;;;LW)"
DWORD dwErr = ERROR_SUCCESS;
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pSacl = NULL; // not allocated
BOOL fSaclPresent = FALSE;
BOOL fSaclDefaulted = FALSE;
LPCWSTR pwszFileName = L"Sample.txt";
if (ConvertStringSecurityDescriptorToSecurityDescriptorW(
LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD, NULL))
{
if (GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl,
&fSaclDefaulted))
{
// Note that psidOwner, psidGroup, and pDacl are
// all NULL and set the new LABEL_SECURITY_INFORMATION
dwErr = SetNamedSecurityInfoW((LPWSTR) pwszFileName,
SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION,
NULL, NULL, NULL, pSacl);
}
LocalFree(pSD);
}
}
Anwendungsprozesse können die Integrität sicherungsfähiger Objekte nur auf Ebenen auf oder unter der Integritätsebene des Anwendungsprozesses festlegen.
Kommunikation zwischen Prozessen mit niedriger und höherer Integrität
Prozesse mit niedriger Integrität sind nicht vollständig von anderen Anwendungen isoliert. Sie können mit anderen Prozessen interagieren. Tatsächlich können Anwendungen, die mit niedriger Integrität ausgeführt werden, ohne einige Formen der Zusammenarbeit für den Benutzer vollständig beschädigt sein.
Einige Formen von IPC stehen für Prozesse mit niedriger Integrität zur Kommunikation mit Prozessen mit höherer Integrität zur Verfügung. Komponenten in Windows Vista blockieren die folgenden Arten der Kommunikation.
Die meisten Fensternachrichten und Prozesshooks werden von UIPI blockiert.
Das Öffnen eines Prozesses und die Verwendung von CreateRemoteThread wird durch die obligatorische Bezeichnung für Prozessobjekte blockiert.
Das Öffnen eines Freigegebenen Speicherabschnitts für den Schreibzugriff wird blockiert.
Die Verwendung eines benannten Objekts, das durch einen Prozess mit höherer Integrität für die Synchronisierung erstellt wurde, wird durch die standardmäßige obligatorische Bezeichnung blockiert.
Die Bindung an eine ausgeführte instance eines COM-Diensts ist blockiert.
Sie können jedoch andere Arten der Kommunikation zwischen einem Prozess mit niedriger Integrität und einem Prozess mit höherer Integrität verwenden. Zu den Kommunikationstypen, die Sie verwenden können, gehören:Zwischenablage (Kopieren und Einfügen)
Remoteprozeduraufruf (RPC)
Sockets
Fenstermeldungen, die der Prozess mit höherer Integrität explizit von Prozessen mit niedrigerEr Integrität empfangen darf, indem ChangeWindowMessageFilter aufgerufen wird
Freigegebener Arbeitsspeicher, bei dem der Prozess mit höherer Integrität die obligatorische Bezeichnung im Abschnitt "Gemeinsam genutzter Arbeitsspeicher" explizit herabgesetzt.
Wichtig
Dies ist besonders gefährlich, und der Prozess mit höherer Integrität muss darauf achten, alle Daten zu überprüfen, die in den freigegebenen Abschnitt geschrieben werden.
COM-Schnittstellen, bei denen die Startaktivierungsrechte programmgesteuert durch den Prozess mit höherer Integrität festgelegt werden, um die Bindung von Clients mit niedriger Integrität zu ermöglichen
Named Pipes, bei denen der Ersteller explizit die obligatorische Bezeichnung für die Pipe festlegt, um den Zugriff auf Prozesse mit niedrigerer Integrität zu ermöglichen
Diese Kommunikationsmechanismen ermöglichen es dem Prozess mit niedriger Integrität, mit anderen Anwendungsprozessen wie einem Brokerprozess zu interagieren, die speziell für die Annahme von Eingaben oder Aufrufen von der Quelle mit niedriger Integrität entwickelt wurden.
Eine allgemeine Richtlinie für das Entwerfen von Schnittstellen, die von einem Prozess mit niedriger Integrität aufgerufen werden, besteht darin, dem Aufrufer oder den Eingabedaten niemals zu vertrauen. Ein Broker mit mittlerer Integrität kann eine Schnittstelle bereitstellen, um eine Datei mit einem Pfad zu erstellen und es einer Anwendung mit niedriger Integrität zu ermöglichen, die Schnittstelle aufzurufen. Dies verfehlt jedoch den Zweck, eine App mit niedriger Integrität auszuführen. Ein besserer Entwurf besteht darin, dass ein Prozess mit niedriger Integrität eine Schnittstelle aufruft, die die Anwendung mit mittlerer Integrität anfordert, dem Benutzer ein allgemeines Dateidialogfeld anzuzeigen, das der Prozess mit niedriger Integrität nicht mithilfe von Fenstermeldungen steuern kann. Auf diese Weise können Sie den Benutzer durchsuchen und auswählen, welche Datei geöffnet oder erstellt werden soll, und der Prozess mit mittlerer Integrität führt alle Dateivorgänge aus. Dieser Typ des Szenarios "Speichern unter" ist ein Beispiel dafür, wie internet-Explorer im geschützten Modus einen eigenen Brokerprozess verwendet, um das Speichern einer Webseite an einer beliebigen Stelle im Benutzerprofil zu verarbeiten.
Viele Anwendungsfeatures können in einem Prozess mit niedriger Integrität ordnungsgemäß ausgeführt werden. Es gibt keine allgemeinen Tools für die Ausführung von Anwendungen mit niedriger Integrität. Jede Anwendung ist anders, und nicht alle Anwendungen müssen mit niedriger Integrität ausgeführt werden.