Email: [email protected] Blog: http://blogs.ugidotnet.org/raffaele Profilo: https://mvp.support.microsoft.com/profile/raffaele 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 Blog http://blogs.ugidotnert.org/raffaele Blog http://blogs.ugidotnert.org/raffaele È 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 Blog http://blogs.ugidotnert.org/raffaele 2. Creazione token Administrator 1. Logon LSA (LSALogonUser) Primary Token (restricted) 4. Token 3. Rimozione privilegi Linked Token (full) Explorer.exe (token restricted) Blog http://blogs.ugidotnert.org/raffaele 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 SeIncreaseQuotaPrivilege SeMachineAccountPrivilege SeSecurityPrivilege SeTakeOwnershipPrivilege SeLoadDriverPrivilege SeSystemProfilePrivilege SeSystemtimePrivilege SeProfileSingleProcessPrivilege SeIncreaseBasePriorityPrivilege SeCreatePagefilePrivilege SeBackupPrivilege SeRestorePrivilege SeShutdownPrivilege SeDebugPrivilege SeSystemEnvironmentPrivilege SeChangeNotifyPrivilege SeRemoteShutdownPrivilege SeUndockPrivilege SeManageVolumePrivilege SeImpersonatePrivilege SeCreateGlobalPrivilege SeIncreaseWorkingSetPrivilege SeTimeZonePrivilege SeCreateSymbolicLinkPrivilege Blog http://blogs.ugidotnert.org/raffaele Token restricted SeShutdownPrivilege SeChangeNotifyPrivilege SeUndockPrivilege SeIncreaseWorkingSetPrivilege SeTimeZonePrivilege LUA Buglight (A. Margosis) http://blogs.msdn.com/aaron_margosis/archive/2008/06/13/luabuglight-2-0-preview.aspx Standard User Analyzer Parte dell'Application Compatibility Toolkit - ACT 5.0 http://www.microsoft.com/downloads/details.aspx?FamilyId=24DA8 9E9-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 Blog http://blogs.ugidotnert.org/raffaele 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) C++ C# wchar_t wszDir[MAX_PATH]; GetSystemDirectory(wszDir,_countof(wszDir)); wcscat_s(wszDir,_countof(wszDir),L"\\cmd.exe"); Process p = new Process(); ProcessStartInfo psi = new ProcessStartInfo(@ "cmd.exe"); psi.UseShellExecute = true; psi.Verb = "runas"; p.StartInfo = psi; p.Start(); HINSTANCE h = ShellExecute(0, L"runas", wszDir, 0, 0, SW_SHOWNORMAL); Le API CreateProcess NON elevano il processo ma tornano ERROR_ELEVATION_REQUIRED se è necessario elevare il processo L'informazione di elevazione viene ricavata: 1. 2. 3. Dal manifest embedded o esterno Nel database 'application compatibility' (registry) Ricerca euristica di un installer Blog http://blogs.ugidotnert.org/raffaele 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 Blog http://blogs.ugidotnert.org/raffaele http://blogs.ugidotnet.org/raffaele/ archive/2009/01/27/windows-vista-integrity-levels-parte-1.aspx Blog http://blogs.ugidotnert.org/raffaele 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 Blog http://blogs.ugidotnert.org/raffaele Processi Low Medium High Processo Medium Oggetti Low Medium Read + Write Read Blog http://blogs.ugidotnert.org/raffaele High LocalSystem System LocalService System NetworkService System Administrators High Backup Operators High Network Configuration Operators High Cryptographic Operators High Authenticated Users Medium Everyone (World) Low Anonymous Untrusted Blog http://blogs.ugidotnert.org/raffaele 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 Blog http://blogs.ugidotnert.org/raffaele Blog http://blogs.ugidotnert.org/raffaele 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 Blog http://blogs.ugidotnert.org/raffaele 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\... Cartella XP Cartella Vista/Win7 C:\Documents and Settings\... User C++ .NET Environment. GetFolderPath( Environment. SpecialFolder. ...) Con divi sa App Si Si FOLDERID_ ProgramData Common ApplicationData SHGetKnownFolder Path All Users\ Application Data C:\ProgramData raf\Application Data C:\Users\raf\ AppData\Roaming Si FOLDERID_ RoamingAppData ApplicationData raf\Local Settings\ Application Data C:\Users\raf\ AppData\Local Si FOLDERID_ LocalAppData LocalApplicationData raf\My Documents C:\Users\raf\ Documents Si FOLDERID_ Documents MyDocuments (non disponibile) C:\Users\Public Si Si FOLDERID_ Public GetEnvironmentVariable ("public") - raccolta di cartelle Solo Win7 Si - FOLDERID_ DocumentsLibrary (usare PInvoke) Blog http://blogs.ugidotnert.org/raffaele Gli applicativi NON devono scrivere: nelle cartelle di sistema: Program Files, Windows, System32 nel registry sotto le key HKLM / HKCR File System User mode Applicazione Legacy Applicazione Vista \Windows\App.ini 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 Luafv.sys \Windows\App.ini Access Denied \Users\<user>\AppData\Local\ VirtualStore\Windows\App.ini Ntfs.sys kernel mode Blog http://blogs.ugidotnert.org/raffaele Blog http://blogs.ugidotnert.org/raffaele Blog http://blogs.ugidotnert.org/raffaele È 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> Blog http://blogs.ugidotnert.org/raffaele A partire da Windows 7 esiste la sezione CompatibilityInfo Indica la versione di Windows per cui è stata studiata l'applicazione <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> 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 Blog http://blogs.ugidotnert.org/raffaele 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 Blog http://blogs.ugidotnert.org/raffaele 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 Blog http://blogs.ugidotnert.org/raffaele 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 Blog http://blogs.ugidotnert.org/raffaele 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=A91DC12 A-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 Blog http://blogs.ugidotnert.org/raffaele © 2009 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY.