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

Best practices per lo sviluppo di applicazioni per