So erstellen Sie einen neuen Prozess mit einem niedrigeren Integritätslevel (IL)?
Scheint es, dass beginnend mit Windows Vista, Prozesse mit einem niedrigeren Integritätslevel (IL) können nicht senden Sie Nachrichten an Prozesse mit höheren integritätsebenen. Dies macht Sinn, aus Sicht der Sicherheit, aber es bricht einige unserer prozessübergreifenden Kommunikation.
Haben wir eine legacy-Anwendung (Prozess A), dass hat leider zur Ausführung mit erhöhten "admin" - rechten (durchgeführt durch einstellen der Verknüpfung immer als administrator ausführen). Manchmal braucht es ein Exemplar einer separaten Anwendung (Prozess B). Als Ergebnis -, Prozess B erbt die gleichen erhöhten rechten (und IL) als Prozess A. Darin liegt das problem. Möglicherweise gibt es noch weitere unabhängige Instanzen von Prozess B, die nicht haben erhöhten rechten, und alle diese Verfahren B-Instanzen müssen in der Lage sein, um gegenseitig Nachrichten senden. Dies schlägt fehl, wenn eine Instanz von Prozeß B erhöht ist und eine andere nicht.
Ich weiß, wir können offene Löcher in der UIPI-message-filter mit der ChangeWindowMessageFilter
API-Methode, aber das scheint nicht so die ideale Lösung. Stattdessen würde ich viel lieber Prozess-spawn Prozess B mit geringeren rechten, und zwar so, dass es die Kommunikation mit dem anderen Prozess B-Instanzen. Ich denke, dass standardmäßig der andere Prozess B-Instanzen laufen auf "Medium" IL, so deshalb würde ich gerne Prozess Ein, um zu laichen-Prozess B-Instanzen mit der gleichen IL.
Meine Suche führte mich zu der CreateProcessAsUser
und CreateRestrictedToken
API-Methoden, aber trotz dieser Dokumentation, die alle von den verschiedenen Facetten des tokens und Sicherheits-Deskriptoren und so ist noch sehr verwirrend für mich.
Ich habe auch schon über einige threads hier (Läuft ein Prozess mit der geringst möglichen Privilegien in winapi und Ablegen von Privilegien in C++ unter Windows), aber ich finde keine guten Beispiele mit code.
Kann jemand mir einige einfache, aber "richtigen" code, der mir helfen wird, spawn child-Prozesse mit der entsprechenden Windows-IL? Speziell möchte ich ein Beispiel dafür, wie die bestehende Prozess-token und wandeln es so hat es die reduzierten Privilegien (ich bin mir ziemlich sicher, dass ich herausfinden kann, ist der rest). Ich bin mir wirklich darüber unklar, ob ich zum duplizieren der Prozess-token, bevor Sie es ändern, wie gut.
- Wäre es möglich einen proxy-Prozess ausgeführt, in der nicht mit erhöhten rechten Kontext? Wenn dem so ist, könntest du entweder den proxy-Prozess starten, Prozess B auf den Namen des Prozesses Ein, wie benötigt wird, oder get-process Eine zu nehmen, die token aus der proxy-Prozess, und verwenden Sie es zum starten von Prozess B.
- Ich habe gelesen, ähnliche Lösungen an anderer Stelle, so es scheint durchaus wie das funktionieren könnte. Jedoch, es sei denn, dieser Dritte proxy-Prozess (C) bereits ausgeführt wird, (unabhängig von Prozess A), sind wir wieder auf Platz eins (wie einen separaten Prozess ausgeführt mit niedrigeren Privilegien). Und wenn der Prozess C bereits ausgeführt wird, dann vermutlich, es würde ausgeführt werden, die gesamte Zeit, die ein Benutzer angemeldet war, ein Szenario würde ich eher vermeiden.
CreateRestrictedToken
scheint, wie es wurde speziell für diese und ähnliche Arten von Situationen, so wie können wir drop eine token-IL?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warnung! Während dieser Ansatz war wohl mehr oder weniger OK für das original-poster, es ist nicht wirklich eine gute Idee im Allgemeinen. Beachten Sie insbesondere (wie in den Kommentar-thread), dass künstlich manipuliert Token gemeldet wurden, verursachen Probleme in komplizierteren Anwendungen, so dass, wenn Sie diese verwenden, sicher sein, zu bleiben, um die grundlegenden Win32-API. Es gibt natürlich auch mögliche Auswirkungen auf die Sicherheit.
In den meisten Szenarien, ähnlich wie der OP, würde es wahrscheinlich besser sein, ersetzen Sie die Verknüpfung, startet der erhöhten Anwendung mit einer launcher-Anwendung. Der launcher kann dann weiterhin ausgeführt, solange die erhöhte Anwendung ausgeführt wird, und sorgen für eine Natürliche begrenzte token für die gehobene Anwendung starten, die nicht mit erhöhten rechten Prozesse.
Gibt ' s code für das starten von einem Prozess mit niedriger Integrität, die sich Analog zu Ihrem Fall, in der Entwerfen von Anwendungen zum Ausführen auf einem Niedrigen Integrity Level Artikel im MSDN.
Erste, Sie duplizieren die Prozess-token, da kann man nicht (oder zumindest nicht sollte) Durcheinander, über die mit einem token, der bereits verwendet wird. Dann nutzen Sie SetTokenInformation mit der TokenIntegrityLevel-Klasse, um die integrity level. Es scheint einen Fehler in den Beispiel-code, da die richtige SID für low integrity level ist S-1-16-4096 anstelle von S-1-16-1024, aber Sie wollen medium integrity level sowieso, was S-1-16-8192. Diese können gefunden werden hier.
Sobald Sie diese arbeiten (das heißt, sobald Sie in der Lage zu starten, mittlerer Integrität Prozesse aus Ihrer high integrity Prozess), sollten Sie versuchen, mit CreateRestrictedToken zu erstellen, der neue token anstelle von DuplicateToken, und entfernen Sie die Administratoren-token und alle Berechtigungen (außer SeChangeNotifyPrivilege). Ansonsten, die neuen Prozesse müssen Mittel Integrität, aber immer noch administrator-Privileg, das könnte es leichter machen, für bösartige code könnte ausgeführt werden, in der gleichen Sitzung erhöhte Rechte.
TokenElevation
war immer unklar, Wann der Umgang mit künstlich manipuliert Token. Siehe auch stackoverflow.com/q/30970433/886887Ich habe die hier beschriebene Vorgehensweise um dies zu erreichen. Die grundlegende Idee ist, zu Fragen, Explorer ausführen, Verfahren B für Sie. Da Explorer in der Regel läuft auf medium integrity level, dies gibt Ihnen, was Sie wollen.
http://brandonlive.com/2008/04/26/getting-the-shell-to-run-an-application-for-you-part-1-why/
http://brandonlive.com/2008/04/27/getting-the-shell-to-run-an-application-for-you-part-2-how/
Dem ersten link wird zumindest geben Ihnen einen guten hintergrund.
Eine sauberere Möglichkeit, das zu tun, legen Sie die requestedExecutionLevel zu dem manifest.
IShellWindows
). Was, wenn Benutzer nicht über IE installiert?Kann ich nicht beantworten Ihre komplette Frage aber, wie Sie erwähnt haben, über CreateProcessAsUser und CreateRestrictedToken. Ich habe einen code, der die Arbeit mit dieser API. Der code, den ich schrieb, geschrieben wurde, basiert auf den folgenden wie.
Quelle:[Windows Vista für Entwickler – Teil 4 – User Account Control] (http://weblogs.asp.net/kennykerr/Windows-Vista-for-Developers-1320-Part-4-1320-User-Account-Control)!
Den code finden Sie im folgenden link.
Beispiel-Code : http://pastebin.com/XMUAehF9