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 UIPI (parte 4)

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

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

Parte 3: http://blogs.ugidotnet.org/raffaele/archive/2009/02/03/windows-vista-integrity-levels-parte-3.aspx

Lo Shatter Attack

Nel 2005 Fabio Santini ed io abbiamo tenuto il Security Roadshow in giro per l'Italia. Una delle demo di Fabio consisteva nello Shatter Attack, un tipo di Luring Attack che più generalmente sono attacchi di tipo "Elevation of Privilege". Questo attacco mostrava quanto fosse pericoloso girare come administrator in Windows XP.
Fabio avviava un "malware" di sua creazione con credenziali di normale utente allo scopo di limitare i danni che il malware avrebbe potuto fare.

Il malware in questione mandava una serie di "click" del mouse da codice verso Explorer.exe (la shell di Windows) lanciando così un comando "distruttivo" come potrebbe essere format: "Start, run, format " .... Ok format è solo un esempio di 'effetto' ma se ci pensiamo un attimo non si fa fatica a disastrare una macchina quando si hanno i privilegi di administrator.

Il processo malware, avendo ricevuto un token da normale utente grazie a runas,  non avrebbe mai avuto i privilegi per eseguire un format e avrebbe ricevuto un "access denied".

Il processo malware però poteva mandare una serie di WM_LBUTTONDOWN verso il processo Explorer.exe che aveva il token di administrator in quanto l'utente (Fabio nella demo, non nella vita reale) si loggava con privilegi di amministratore. La command che lanciava l'operazione di Format ereditava il token da Explorer.exe e di conseguenza riceveva il token di administrator.

Il gateway all'elevazione di privilegi

Il motivo per cui è possibile realizzare uno Shatter Attack è che gli oggetti di windowing (USER) e grafici (GDI) non sono soggetti a security per ovvi problemi di performance. Pensate cosa significherebbe eseguire un controllo di security per ogni Pen, Brush, CreateWindow, SetWindowText, LineTo, Draw, ... eseguita nel sistema. A distanza di diciotto anni, considero giusta questa scelta che Microsoft fece con Windows NT.

L'introduzione di UIPI in Vista

Il meccanismo di User Interface Privilege Isolation (UIPI) è strettamente legato agli Integrity Levels. UIPI ha il compito di impedire ad un processo di comunicare con un altro che abbia Integrity Level più elevato.

Per esempio un processo con Integrity Level Medium (normale user) non riuscirà a fare una serie di cose verso un altro processo con Integrity Level High (Administrator) o System (servizi e web application):

  • Usare SendMessage / PostMessage di messaggi considerati potenzialmente pericolosi.
    Windows mantiene una blacklist di messaggi tra cui tutti quelli superiori a WM_USER, tipicamente usati dalle applicazioni come meccanismo di comunicazione privato. Questi messaggi vengono filtrati da Windows.
  • Eseguire un thread hook
  • Monitorare con i journal hook
  • Iniettare dll

In pratica UIPI impedisce, grazie agli Integrity Level, gli Shatter Attack che erano fatali in Windows XP. Aggiungerei che UIPI è un meccanismo indispensabile, senza il quale sarebbe facile bypassare il blocco agli oggetti offerto dal meccanismo degli Integrity Levels visto nei precedenti post.

Application Compatibility

Parlando di Application Compatibility, UIPI è certamente un fattore di primo piano in quanto molte applicazioni eseguono una comunicazione tra processi utilizzando l'API RegisterWindowMessage e comunicando con messaggi custom (WM_USER+...).

Per permettere alle applicazioni di modificare il filtro esiste l'API ChangeWindowMessageFilter:

  • MSGFLT_ADD. Permette al processo che invoca la API di ricevere il messaggio
  • MSGFLT_REMOVE. Nega al processo che invoca la API la ricezione del messaggio

I processi con Integrity Level <= Low non possono usare questa API.
Con una semplice call a questa API i problemi di comunicazione tra processi via WM_xxx sono risolti.

Accessibility

Sembra tutto risolto e invece c'è un problema di primaria importanza: le applicazioni per l'accessibilità. In Windows esiste per esempio la "On-Screen Keyboard" che permette di simulare la tastiera usando solo il mouse. Molte altre applicazioni esistono per i portatori di handicap che permettono di facilitare il canale di I/O tra computer e persona.

Non è perciò improbabile avere la on-screen keyboard che gira come normale user (Integrity Level Low) che devono pilotare applicazioni ad Integrity Level superiore, magari una command prompt amministrativa. Purtroppo UIPI impedisce tutto questo e rende impossibile l'uso di queste applicazioni.

Microsoft non si è affatto dimenticata di questo problema e ha introdotto il flag UIAccess che bypassa UIPI. Questo flag viene letto dal manifest dell'eseguibile e conservato nel token associato al processo.

image

Visto che questo flag può essere usato per bypassare il meccanismo di protezione da parte di un malware, esiste una policy (abilitata per default) per cui il flag ha effetto solo se l'exe è stato installato in una di queste cartelle:

  • in una sottocartella di "Program Files" o "Program Files (x86)"
  • in una sottocartella di Windows\System32

Poiché la scrittura in queste cartelle è possibile solo ad un adminstrator, solo una applicazione installata da un token elevato può usare UIAccess.

Per sapere se un token di processo ha abilitato o meno il flag UIAccess, si usa GetTokenInformation passando TokenUIAccess. Il valore di ritorno è 0 (disabilitato) o 1 (abilitato).

 

Integrity Levels e UIPI sono quindi in primo piano per quello che riguarda i problemi di "Application Compatibility" nei sistemi operativi dalla 6.0 in su (cioè da Vista/2008 in avanti).

Valeva la pena di introdurre queste novità a scapito della piena compatibilità delle vecchie applicazioni? A mio avviso si, senza alcun dubbio perché sottolineo che presto gli antivirus non serviranno più a nulla.

Print | posted on lunedì 9 febbraio 2009 14:48 |

Feedback

Gravatar

# re: Windows Vista UIPI (parte 4)

Veramente molto interessante!
09/02/2009 15:14 | Leonardo
Gravatar

# re: Windows Vista UIPI (parte 4)

Linux è partito dopo il 1991 e di conseguenza l'architettura a 32 bit e l'assenza di problemi di retrocompatibilità gli ha dato la possibilità di far lavoare di default gli utenti come normali user.
Ottimo, ma se chiedi in giro è pieno di gente che inchioda sudo per tutto il giorno e lavorano solo come root.
Beh per questi utenti arriveranno i virus anche su Linux e piangeranno anche loro, è solo una questione di tempo.
Alla fine un virus è semplicemente una applicazione come tutte le altre che può cancellare file, raspare il disco a zero, corrompere i documenti e tutte le altre schifezze a cui puoi pensare.

Allora meglio UAC che almeno non ti chiede la password tutte le volte e non sei permanentemente administrator.
09/02/2009 18:28 | Raffaele Rialdi
Gravatar

# re: Windows Vista UIPI (parte 4)

@Marco. Sono developer che mi dicono di non volere rotture di scatole tutto il giorno e lavorano sempre come root. Io non sono daccordo e gli ho spiegato i motivi ma devo prendere atto, anche leggendo su internet, che è una abitudine di parecchie persone.

La radice del problema è identica per tutti i sistemi operativi: lavorare come normale user ed elevare i privilegi on demand.
Windows ha avuto l'handicap della compatibilità e pur essendo un sistema operativo pronto per gestire utenti ed admin nel modo giusto si è mosso con estremo ritardo per 'forzare' la mano.
A parte questo aspetto Linux non ha nulla di diverso e devono temere i virus tanto quanto qualsiasi utente di qualsiasi sistema operativo.
Il problema si sposta quindi nel *come* minimizzare l'uso di privilegi elevati e *come* elevare i privilegi in modo che l'utente non si scocci.
10/02/2009 18:19 | Raffaele Rialdi
Gravatar

# re: Windows Vista UIPI (parte 4)

avevo capito che usassero sudo tutto il tempo, non che si limitassero a loggarsi come root, era dovuta a questo la mia curiosità :)

cmq c'è da dire che per lo meno per linux non si ha il problema purtroppo abbastanza frequente in windows di applicazioni fatte alla caxxo che han bisogno di girare come admin senza un vero motivo, ma anche a questo con la uac e derivati dovrebbe essere un fenomeno destinato x fortuna a scomparire
11/02/2009 11:28 | marco
Gravatar

# re: Windows Vista UIPI (parte 4)

@Marco. Usano anche "sudo su" :(
Io concordo che non dovrebbero, ma non posso che prenderne atto.
Quanto alle applicazioni è verissimo che su Linux è più difficile che non ce ne sia bisogno. Ma questo è dovuto ai motivi che dicevo nell'altro commento (compatibilità e cattive abitudini che con Vista dovranno cominciare a morire)
11/02/2009 11:47 | Raffaele Rialdi
Gravatar

# re: Windows Vista UIPI (parte 4)

Mai trovato una guida cosi' completa ed esaustiva sull'argomento! Se ti metti a girare sugli articoli Microsoft puoi anche uscire pazzo!

Ci sarebbe da tradurla in inglese per farne beneficiare anche il resto del mondo.


Grazie e complimenti!
27/04/2011 13:33 | Giuseppe Amato
Gravatar

# re: Windows Vista UIPI (parte 4)

Grazie per il feedback!
Farò un pensiero a tradurla e metterla sul mio sito. :)
27/04/2011 17:14 | Raffaele Rialdi
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET