270 likes | 435 Views
Best practices per lo sviluppo di applicazioni per Windows 7 e Windows Vista. Raffaele Rialdi. Email: malta@vevy.com Blog: http://blogs.ugidotnet.org/raffaele Profilo: https://mvp.support.microsoft.com/profile/raffaele. Windows versione 6.0 e 6.1.
E N D
Best practices per lo sviluppodi applicazioni perWindows 7 e Windows Vista Raffaele Rialdi Email: malta@vevy.com Blog: http://blogs.ugidotnet.org/raffaele Profilo: https://mvp.support.microsoft.com/profile/raffaele
Windows versione 6.0 e 6.1 • La versione di Windows è dwMajorVersion.dwMinorVersion • OSVERSIONINFOEX (GetVersionEx) contiene queste informazioni • Major = 5 Windows 2000, XP, 2003 • Minor = 0 Windows 2000 • Minor = 1 Windows XP • Minor = 2 Windows XP 64 bit, 2003, 2003 R2 • Major = 6 Windows Vista, 2008, Windows 7, 2008 R2 • Minor = 0 Windows Vista, Windows 2008 • wProductType = VER_NT_WORKSTATION Vista • Minor = 1 Windows 7, Windows 2008 R2 • wProductType = VER_NT_WORKSTATION Windows 7 • Windows 7 R2 (Server) solo per hardware a 64 bit
Il token • È una struttura dati che ogni processo ottiene dal sistema operativo in cambio delle credenziali (user/pwd) • In pratica è la carta di identità di un utente che contiene: • L'identità dell'utente sotto forma di "SID" • I gruppi a cui appartiene l'utente • I privilegi assegnati all'utente • Alla logon la shell (explorer.exe) avrà il nostro token • Ogni volta che facciamo "doppio click" su un'applicazione questa eredita il token dal processo che l'ha lanciato (explorer.exe) • Se facciamo doppio click su un virus e siamo amministratori del PC, il virus avrà un token da amministratore
La Logon in Vista e 2008 2. Creazione token Administrator 1. Logon LSA (LSALogonUser) 4. Token 3. Rimozione privilegi Primary Token(restricted) Linked Token(full) Explorer.exe (token restricted)
Il token restricted • Esplicite deny sui gruppi administrators e domain admin • Mandatory label (Integrity Level) medium (invece di high) • Virtualization allowed • Default Dacl non contiene administrators • Eliminazione di quasi tutti i privilegi Token full Token restricted SeShutdownPrivilege SeChangeNotifyPrivilege SeUndockPrivilege SeIncreaseWorkingSetPrivilege SeTimeZonePrivilege SeIncreaseQuotaPrivilege SeMachineAccountPrivilege SeSecurityPrivilege SeTakeOwnershipPrivilege SeLoadDriverPrivilege SeSystemProfilePrivilege SeSystemtimePrivilege SeProfileSingleProcessPrivilege SeIncreaseBasePriorityPrivilege SeCreatePagefilePrivilege SeBackupPrivilege SeRestorePrivilege SeShutdownPrivilege SeDebugPrivilege SeSystemEnvironmentPrivilege SeChangeNotifyPrivilege SeRemoteShutdownPrivilege SeUndockPrivilege SeManageVolumePrivilege SeImpersonatePrivilege SeCreateGlobalPrivilege SeIncreaseWorkingSetPrivilege SeTimeZonePrivilege SeCreateSymbolicLinkPrivilege
Tools per risolvere i problemicon Low User Account • LUA Buglight (A. Margosis) • http://blogs.msdn.com/aaron_margosis/archive/2008/06/13/lua-buglight-2-0-preview.aspx • Standard User Analyzer • Parte dell'Application Compatibility Toolkit - ACT 5.0 • http://www.microsoft.com/downloads/details.aspx?FamilyId=24DA89E9-B581-47B0-B45E-492DD6DA2971&displaylang=en • Process Monitor (FileMon + RegMon) • Sul sito di SysInternals (ora diventato Technet) • Application Verifier (codice nativo C++) • http://msdn.microsoft.com/en-us/library/ms220931.aspx
Elevare un processo da codice • Il token di un processo non può essere cambiato • Si può elevare il processo (che farà apparire UAC) grazie alla API ShellExecute (C++) o alla classe Process (.NET) • Le API CreateProcess NON elevano il processo ma tornano ERROR_ELEVATION_REQUIRED se è necessario elevare il processoL'informazione di elevazione viene ricavata: • Dal manifest embedded o esterno • Nel database 'application compatibility' (registry) • Ricerca euristica di un installer C# Process p = new Process(); ProcessStartInfo psi = new ProcessStartInfo(@ "cmd.exe"); psi.UseShellExecute = true; psi.Verb = "runas"; p.StartInfo = psi; p.Start(); C++ wchar_t wszDir[MAX_PATH]; GetSystemDirectory(wszDir,_countof(wszDir)); wcscat_s(wszDir,_countof(wszDir),L"\\cmd.exe"); HINSTANCE h = ShellExecute(0, L"runas", wszDir, 0, 0, SW_SHOWNORMAL);
Elevare un oggetto COM da codice • COM Elevation Moniker può elevare un COM object • L'applet del control panel per il cambio dell'ora usa questo sistema • Per essere "elevabili" gli oggetti COM devono: • Essere marcati nel registry • HKLM\Software\Classes\CLSID\{CLSID}\Elevation\Enabled = 1 • Avere un nome che verrà mostrato da UAC • HKLM\Software\Classes\CLSID\{CLSID}\LocalizedString = <nome> • Se possiedono un'icona (...\Elevation\IconReference=...) verrà mostrata nella dialog di UAC • Per elevare l'oggetto si usa CoGetObject con questa sintassi: • Elevation:Administrator!new{GUID} • Elevation:Highest!new{GUID} • Elevation:Highest!clsid{GUID} • Listato di CoCreateInstanceAsAdmin: • http://msdn.microsoft.com/en-us/library/ms679687.aspx
http://blogs.ugidotnet.org/raffaele/ archive/2009/01/27/windows-vista-integrity-levels-parte-1.aspx Integrity Levels
Integrity Levels ABC • Sono un meccanismo per diminuire l'accesso agli oggetti rispetto alle tradizionali Access Control List • I fattori sono due: • Integrity Level (Low, Medium, High, System) • Integrity Policy (no-read-up, no-write-up, no-execute-up) • Questi fattori sono presenti: • Nel token di ogni processo • Nel security descriptor degli oggetti kernel (file, registry, etc.) • Windows confronta questi fattori ad ogni accesso • Esempio: il "protected mode" di Internet Explorer
Cosa può fare un processo? Low Medium High Processi ProcessoMedium Low Medium High Oggetti Read + Write Read
UIPI • User Interface Privilege Isolation • Permette di impedire ad un processo con un integrity level più basso di ... • eseguire SendMessage o PostMessage di certi messaggi • Internamente Windows ha una "blacklist" dei messaggi vietati tra cui WM_USER + x • realizzare thread hook • monitorare con i journal hook • iniettare dll ... verso un processo di livello più alto
Setup dell'applicazione • Impostazioni globali e read-only • Creare la struttura di cartelle necessarie all'applicazione • Salvare nella Program Files le impostazioni globali e read-only • Installare i certificati digitali • Applicare le ACL su cartelle e certificati • Installare oggetti COM in HKLM • Il setup .MSI viene eseguito con privilegi elevati • Creare una "custom action" per eseguire operazioni non previste dalla configurazione del Setup MSI
Configurazioni e Dati applicativi • L'utente ha diritto di Read/Write su queste cartelle • Le "Documents" sono quelle per i dati • Le "Application" sono quelle per le configurazioni • Il setup crea una sottocartella con il nome Azienda e/o Applicativo • C:\users\raf\Documents\Visual Studio 2008\...
La virtualizzazione di file e registry • Gli applicativi NON devono scrivere: • nelle cartelle di sistema: Program Files, Windows, System32 • nel registry sotto le key HKLM / HKCR • A partire da Vista le operazioni di scrittura sono virtualizzate • Solo se l'applicazione non ha un manifest • Solo se il token contiene il flag "Virtualization Enabled" • Solo su macchine a 32 bit File System User mode Applicazione Vista Applicazione Legacy \Windows\App.ini kernel mode Luafv.sys Ntfs.sys \Windows\App.ini Access Denied \Users\<user>\AppData\Local\VirtualStore\Windows\App.ini
Demo virtualizzazione ntfs
Il Manifest • È una struttura dati, tipicamente inserita nelle risorse dell'eseguibile che permette di informare il sistema operativo se è opzionale o necessario che il processo sia elevato • Visual Studio gestisce i manifest sia in progetti VC++ che .NET • A partire da Vista esiste la sezione requestedElevationLevel che può assumere tre valori: • asInvoker: Assume i diritti dell'utente • highestAvailable: richiede l'elevazione se l'utente è amministratore, non la richiede se l'utente è solo user • requireAdministrator: richiede sempre l'elevazione <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges><requestedExecutionLevel level='requireAdministrator' uiAccess='false' /> </requestedPrivileges> </security> </trustInfo></assembly>
Manifest e Windows 7 • A partire da Windows 7 esiste la sezione CompatibilityInfo • Indica la versione di Windows per cui è stata studiata l'applicazione • Windows 7 cambia il comportamento di servizi/api a seconda del manifest • API: GetOverlappedResult • API: ReadFileEx • RPC: exception handling • RPC: Thread pool management • Desktop Windows Manager: Fail/Lock bit blitting • Le applicazioni prive di CompatibilityInfo saranno considerate "legacy" dal sistema operativo • Quelle funzionalità di API/RPC/DWM saranno come su Windows Vista • <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> • <application> • <supportedOS Id="{77777777-7777-7777-7777-777777777777}"/> • <supportedOS Id="{66666666-6666-6666-6666-666666666666}"/> • </application> • </compatibility>
Il principio del least-privilege • Afferma la necessità che l’accesso ad una risorsa deve essere fatto richiedendo privilegi minimi • Aprire un file in lettura se non serve scrivere • Accedere a processi, thread e semafori senza richiedere diritti più alti del necessario • Se si scrive un servizio o un sito web, assegnare un utente con privilegi minimi per accedere alle risorse necessarie al programma • Evitare LocalSystem come utente di default • Un errore (o un attacco) può essere devastante
Lo shield • Button • SendMessage(GetDlgItem(hWnd, IDOK), BCM_SETSHIELD, 0, TRUE); • Hyperlink • Mettere un'icona IDI_SHIELD vicino • Menu contestuali • IContextMenu ha il supporto specifico per il Shield • Menu di Popup • Ricavare l'icona da SHSTOCKICONINFO e disegnarla
Altre • L'architettura di Winlogon e sessioni è cambiata • Nuovi credential provider nel processo di logon • Isolamento della "Session 0" • L'interattività con il desktop deve essere evitata • Nuovo servizio di Interattività per facilitare la migrazione • Nuove API COM per pilotare il Firewall • Service Restart Policy limitata a 3 restart • Protected Mode di Internet Explorer • I plugin devono essere testati e tenere conto degli integrity levels • MSMQ Client per Windows 2000 non più disponibile
Per concludere • Informazioni su Windows 7 • http://www.microsoft.com/windows/windows-7 • Provate Windows 7 beta 1 • http://msdn.microsoft.com/en-us/dd353271.aspx • Windows Developer Center • http://msdn.microsoft.com/windows • Windows 7 Developer Guide • http://msdn.microsoft.com/en-us/library/dd371748(VS.85).aspx • Download di Windows SDK 7.0 beta 1 • http://www.microsoft.com/downloadS/details.aspx?familyid=A91DC12A-FC94-4027-B67E-46BAB7C5226C&displaylang=en • Windows 7 Application Quality Cookbook • http://code.msdn.microsoft.com/Windows7AppQuality • Integrity Levels e UIPI • http://blogs.ugidotnet.org/raffaele/archive/2009/01/27/ windows-vista-integrity-levels-parte-1.aspx
© 2009 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY.