c ++ - Hvordan oprettes en ny proces med et lavere integritetsniveau (IL)?

Indlæg af Hanne Mølgaard Plasc

Problem



Det ser ud som om at starte med Windows Vista, kan processer med lavere integritetsniveau (IL) ikke sende meddelelser til processer med højere integritetsniveauer. Dette giver mening ud fra et sikkerhedssynspunkt, men det bryder nogle af vores interprocess-kommunikation.


Vi har en arv ansøgning (Process A), som desværre skal køre med forhøjede 'admin' privilegier (udført ved at indstille genvej til altid at køre som administrator). Til tider er det nødvendigt at etablere en separat ansøgning (proces B). Som et resultat arver Proces B de samme forhøjede privilegier (og IL) som Proces A. Her ligger problemet. Der kan være andre uafhængige forekomster af proces B, der ikke har forhøjede rettigheder, og alle disse proces B-tilfælde skal kunne sende meddelelser til hinanden. Dette mislykkes naturligvis, hvis en forekomst af proces B er forhøjet, og en anden er ikke.


Jeg ved, at vi kan åbne huller i UIPI-meddelelsesfiltret ved hjælp af API'en ChangeWindowMessageFilter, men det synes ikke som den ideelle løsning. I stedet vil jeg hellere have Process A spawn Process B med reducerede rettigheder, specifikt så at den kan kommunikere med de andre Proces B-tilfælde. Jeg tror som standard, at de andre Proces B-forekomster kører ved 'Medium' IL, så jeg kan lide Proces A til at gyde Proces B-forekomster med samme IL. [4]]]


Mine søgninger har ført mig til API-metoderne CreateProcessAsUser og CreateRestrictedToken, men på trods af denne dokumentation er alle de forskellige facetter af tokens og sikkerhedsbeskrivelser og lignende stadig meget forvirrende for mig. [5] [6]


Jeg har også fundet nogle tråde her (kører en proces med lavest mulige privilegier i winapi og drop privilegier i C ++ på Windows), men jeg kan ikke finde gode eksempler med kode.


Kan nogen give mig en enkel, men alligevel 'korrekt' kode, der kan hjælpe mig med at spaere barneprocesser ved hjælp af det passende Windows IL? Specielt synes jeg at være et eksempel på, hvordan man tager det eksisterende proces A-symbol og konverterer det, så det har de reducerede privilegier (jeg er ret sikker på, at jeg kan finde ud af resten). Jeg er meget uklart om jeg skal duplikere processen 'token før du ændrer det også.

Bedste reference


Advarsel! Selv om denne fremgangsmåde sandsynligvis var mere eller mindre OK for den oprindelige plakat, er det ikke rigtig en god ide generelt. Specielt bemærkning (som i kommentar tråd), som kunstigt manipulerede tokens har blevet rapporteret at forårsage problemer i mere komplicerede applikationer, så hvis du bruger dem, skal du holde fast i den grundlæggende Win32 API. Der er selvfølgelig også mulige sikkerhedsmæssige konsekvenser.


I de fleste scenarier, der ligner dem i OP'en, ville det nok være at foretrække at erstatte genvejen, der starter den forhøjede applikation med en launcher-applikation. Lanceringsprogrammet kan derefter forblive kørende, så længe den forhøjede applikation kører, og giver et naturligt begrænset token for den forhøjede applikation, der skal bruges til at starte ikke-forhøjede processer.





Der er kode for at lancere en lav integritetsproces, som er analog med din sag, i Designing Applications for at køre på en Low Integrity Level-artikel i MSDN. [9]


For det første duplikerer du procestoken, da du ikke kan (eller i det mindste ikke) tåle med et token, der allerede bruges. Derefter bruger du SetTokenInformation med klassen TokenIntegrityLevel til at indstille integritetsniveauet. Der ser ud til at være en fejl i eksemplet kode, da den korrekte SID for lav integritet niveau er S-1-16-4096 snarere end S-1-16-1024, men du vil alligevel have et medium integritet niveau, hvilket er S -1-16-8192. Disse kan findes her. [10] [11]


Når du har arbejdet (når du er i stand til at starte medieintegritetsprocesser fra din høj integritetsproces), skal du prøve at bruge CreateRestrictedToken til at oprette det nye token i stedet for DuplicateToken og fjerne administratorens token og alle rettigheder (undtagen SeChangeNotifyPrivilege) . Ellers vil de nye processer have en medium integritet, men har stadig administratorrettigheder, hvilket kunne gøre det lettere for enhver ondsindet kode, der kan køre i samme session for at hæve sine rettigheder.

Andre referencer 1


Jeg har brugt den fremgangsmåde, der er beskrevet her for at opnå dette. Grundtanken er at bede Explorer om at køre Proces B til dig. Da Explorer typisk kører på medium integritetsniveau, giver dette dig det, du vil have.


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/[12]


Det første link vil i det mindste give dig en god baggrund.



  Vi har en arv ansøgning (Process A), som desværre skal køre med forhøjede 'admin' privilegier (udført ved at indstille genvej til altid at køre som administrator).



En renere måde at gøre det er sat det ønskedeExecutionLevel til manifestet. [13]

Andre referencer 2


Jeg kan muligvis ikke svare på dit komplette spørgsmål, men som du har nævnt om CreateProcessAsUser og CreateRestrictedToken. Jeg har en kode, der arbejder med denne API. Koden, jeg skrev, blev skrevet ud fra følgende som.


kilde: [[Windows Vista for udviklere - Del 4 - Brugerkonto kontrol]] (http://weblogs.asp.net/kennykerr/Windows-Vista-for-Developers- 1320 -Part-4- < em> 1320 -Bruger-konto-Control)! [14]


Koden er tilgængelig i følgende link.


Eksempelkode: http://pastebin.com/XMUAehF9[15]