posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Windows Vista Integrity Levels (parte 1)

Windows Vista e Windows 2008 sono la versione 6.0 del sistema operativo Windows. Essendo una major version ci sono diverse novità per quello che riguarda il kernel che ritroviamo anche in Windows 7 (e la corrispondente versione server chiamata Windows 2008 R2) che è la versione 6.1.

Le novità sono prevalentemente sulla sicurezza e tra queste ci sono gli Integrity Levels che sono probabilmente i meno conosciuti. Gli Integrity Levels sono il meccanismo base su cui si basa il "protected mode" di Internet Explorer. Caratteristica presente in IE7 su Vista ma non su XP proprio perché richiede gli Integrity Levels.

image

Il punto fondamentale è: possiamo considerare ugualmente affidabile un browser o notepad? È indubbio che il browser è a maggiore rischio di attacco in quanto si collega ad internet, carica apparentemente innocui markup e immagini ed esegue apparentemente innocui script.

Il target da raggiungere è perciò quello di abbassare il livello di affidabilità di un processo nativo limitando il raggio di azione del codice eseguito al suo interno.
Ma quali sono le limitazioni che ha senso applicare ad un processo? Sostanzialmente limitare l'accesso ad altre risorse del sistema operativo come file, registry, processi, thread, mutex, desktop, etc.. Tutti questi sono in Windows degli "oggetti kernel" che possiedono dei security descriptor e quindi il loro accesso è regolato da un controllo eseguito dal Security Reference Monitor in kernel mode.

Questo tipo di controllo avviene da sempre in Windows (parlo della famiglia NT) confrontando il token del processo che deve accedere alla risorsa con il security descriptor della risorsa che deve essere accessa.

  • Il token contiene i SID dell'utente (le cui credenziali sono state usate per generare il token e assegnarlo al processo) e dei gruppi di cui questo utente fa parte.
  • Il security descriptor dell'oggetto contiene le Access Control List che sono una lista di Access Control Entry. Ciascuna ACE mappa un SID su un permesso o su una negazione di accesso.

Il meccanismo che regola l'accesso ad un oggetto controlla rispetto al token assegnato al processo (o al thread in caso di impersonation) e perciò non ci consente di "marcare" il processo come più o meno affidabile (notepad o browser).

Ecco perciò la novità introdotta in Vista e 2008: gli Integrity Levels.

Gli Integrity Levels sono dei SID che vengono assegnati:

  • ai token dei processi
  • agli oggetti all'interno del security descriptor

Più precisamente i SID degli Integrity Levels si trovano nelle SACL (System Access Control List) normalmente utilizzate per stabilire se l'oggetto deve essere soggetto ad Audit (cioè ogni volta che l'oggetto viene accesso, Windows aggiunge un evento nell'Event Log di sistema). Microsoft ha deciso di mettere gli Integrity Levels nelle SACL per modificare il meno possibile l'infrastruttura di gestione della sicurezza e il meccanismo di controllo.

Lo scopo degli Integrity Levels è quello di diminuire l'accesso degli oggetti rispetto alle normali Access Control List. Non solo, il controllo sugli Integrity Levels è il primo ad essere effettuato dalla preposta API AccessCheck e se il controllo sugli Integrity Levels fallisce, l'accesso è negato a prescindere dalle ACL che sono state applicate all'oggetto.

Da questo si intuisce che un errato Integrity Level può comportare il cattivo funzionamento di una applicazione. Entrerò nel merito più avanti.

Gli Integrity Level (chiamati anche Integrity Label nell'SDK) sono un numero a 16 bit arbitrario custodito nel RID del SID. Di tutti i possibili valori l'SDK di Windows predefinisce alcuni "noti":

Livello SID Valore RID Esempio di token
Untrusted S-1-16-0 (0x0000)  
Low S-1-16-4096 (0x1000) Protected Mode IE7
Medium S-1-16-8192 (0x2000) Processo non elevato
High S-1-16-12288 (0x3000) Processo elevato ad Admin
System S-1-16-16384 (0x4000) Localsystem e Localservice

 

Dalle mie ricerche nell'SDK di Windows 7 ho visto questa definzione:
#define SECURITY_MANDATORY_MEDIUM_PLUS_RID (MEDIUM + 0x100)

Questo significa che Windows 7 introduce un nuovo Integrity Level 0x2100 per scopi che devo ancora capire.

Ogni volta che un processo viene creato, il token del processo conterrà per default un integrity level il cui valore dipende da quanto "potente" è l'utente

Utente Integrity Level
LocalSystem System
LocalService System
NetworkService System
Administrators High
backup Operators High
Network Configuration Operators High
Cryptographic Operators High
Authenticated Users Medium
Everyone Low
Anonymous Untrusted

 

È naturalmente possibile creare un processo con Integrity Level inferiore, ed è quello che avviene quando il normale utente apre Internet Explorer.

[more to come ...]

Parte 2: http://blogs.ugidotnet.org/raffaele/archive/2009/01/29/windows-vista-integrity-levels-parte-2.aspx

Print | posted on martedì 27 gennaio 2009 16:14 |

Feedback

Gravatar

# re: Windows Vista Integrity Levels (parte 1)

Nota per WeLoveRaf: cercando su google SECURITY_MANDATORY_MEDIUM_PLUS_RID esce SOLO questo post. Solo perchè deve ancora capire ancora cosa serve...
27/01/2009 18:32 | Alessandro Scardova
Gravatar

# re: Windows Vista Integrity Levels (parte 1)

La verità é che nemmeno gli architetti/programmatori che hanno introdotto SECURITY_MANDATORY_MEDIUM_PLUS_RID hanno ancora capito a cosa serva; però Raf gli é apparso in sogno e loro hanno capito era opportuno introdurlo in Windows 7... ;-)
27/01/2009 19:22 | Michele Bernardi
Gravatar

# re: Windows Vista Integrity Levels (parte 1)

LOL
Piuttosto sono perplesso se sia un argomento che interessa o meno.
Per certo posso dire che l'application compatibility su Vista e Windows 7 passa anche da queste cose.
28/01/2009 18:18 | Raffaele Rialdi
Gravatar

# re: Windows Vista Integrity Levels (parte 1)

Grazie Michele. Dal feedback generalmente scelgo se andare nel dettaglio o restare su una overview.
Io credo che qualsiasi programmatore dovrebbe sapere che, se la sua applicazione viene lanciata come "low" non può fare accesso alla maggior parte degli oggetti nel sistema. Basta anche gestire l'errore sapendo che potrebbe accadere se l'utente o il sistemista smanetta sulla security.
Intendiamoci, si può benissimo costruire una applicazione che funziona come low senza diventare pazzi, ... basta sapere cosa sta succedendo :)
Se ce la faccio, oggi posto il secondo ...
29/01/2009 12:07 | Raffaele Rialdi
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET