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.
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