moindre privilège par défaut exécution en tant qu'utilisateur standard même si on est...
TRANSCRIPT
User Account ControlDéveloppement des applications Windows Vista dans le respect d’UACJean-Yves PoublanMicrosoft France
UAC – User Account ControlC'est quoi?
Moindre privilège par défautExécution en tant qu'utilisateur standard même si on est membre des administrateurs
Mécanismes Ouverture de session interactive en mode restreint
Passage en mode élevé avec consentement
Contrôle via niveaux d'intégrité
Virtualisation des ressources pour les applications "legacy"
Jeton filtré
Jeton administrate
ur
Jeton filtré
1.Examination du jeton pour privilèges élevés
Lancement d'explorer.exe
2. Privilèges élevés sont retirés du jeton
Administrateur ouvre une session
avec l'IHM de winlogon
Local Security Authority (LSA)
vérifie les credentials
Windows XP
Windows Vista
Lancement d'explorer.exe
Jeton filtréIl y a création de deux sessions de logon (LUID) et jetons (token) correspondant
Jeton normal
Jeton filtré (privilèges de l'utilisateur standard)
Les jetons sont liésGetTokenInformation(TokenLinkedToken, & TOKEN_LINKED_TOKEN)
Lors d'une ouverture des session interactive (interactive logon - LogonUser):
Administrateur (AAM – Admin Approval Mode)Deux sessions
Jeton normal (élevé) et jeton filtré
Utilisateur standard (OTS – Over The Shoulder)Une session
Jeton normal
Utilisateur standard avec privilèges supplémentaires "non sensibles"Une session
Jeton normal (avec ces privilèges supplémentaires)
Exemple: SeSystemtimePrivilege
Utilisateur avec privilèges supplémentaires jugés "sensibles"Deux sessions
Jeton normal (avec tous les privilèges) et jeton filtré, mais seuls les privilèges "sensibles" sont retirés
Exemple: SeImpersonatePrivilege
Outils
Démo
Jeton filtréPlus précisément
Administrateur = posséder l'un de ces groupes:
DOMAIN_GROUP_RID_ADMINS
DOMAIN_GROUP_RID_CONTROLLERS
DOMAIN_GROUP_RID_CERT_ADMINS
DOMAIN_GROUP_RID_SCHEMA_ADMINS
DOMAIN_GROUP_RID_ENTERPRISE_ADMINS
DOMAIN_GROUP_RID_POLICY_ADMINS
DOMAIN_ALIAS_RID_ADMINS
DOMAIN_ALIAS_RID_POWER_USERS
DOMAIN_ALIAS_RID_ACCOUNT_OPS
DOMAIN_ALIAS_RID_SYSTEM_OPS
DOMAIN_ALIAS_RID_PRINT_OPS
DOMAIN_ALIAS_RID_BACKUP_OPS
DOMAIN_ALIAS_RID_RAS_SERVERS
DOMAIN_ALIAS_RID_PREW2KCOMPACCESS
DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS
DOMAIN_ALIAS_RID_CRYPTO_OPERATORS
Ces RIDs sont inclus dans le jeton filtré, mais marqués comme USE_FOR_DENY_ONLY
Jeton filtréPlus précisément
Privilèges jugés "sensibles"SeCreateTokenPrivilege
SeTcbPrivilege
SeTakeOwnershipPrivilege
SeBackupPrivilege
SeRestorePrivilege
SeDebugPrivilege
SeImpersonatePrivilege
SeRelabelPrivilege
SeLoadDriverPrivilege
Jeton filtréPlus précisément
UAC affecte LogonUser(LOGON32_LOGON_INTERACTIVE)Les autres ouvertures de session via LogonUser (Réseau, Batch, Service, Réseau texte clair) ne sont pas affectées et ne reçoivent qu'un jeton seul jeton – en principe non filtré
Cas de l'accès distantMesure contre le loopback
La session réseau distante est dotée d'un jeton filtré lorsque l'utilisateur est un compte local membre du groupe des administrateurs (de la machine distante)
Clé de registre LocalAccountTokenFilterPolicy=1 pour désactiver ce filtrage
Peut être nécessaire pour administrer une machine Workgroup à distance
On ne peut administrer une machine à distance avec un compte local à la machine, il faut utiliser un compte du domaine
Par défaut, le compte Builtin\Administrator n'est pas affecté par UAC
Configurable par Security Policy
Développement d'une application
Concevoir, développer et tester pour le mode utilisateur standard, non admin
Si une application fonctionne correctement en mode utilisateur standard sous Windows XP, il y a de fortes chances qu'elle fonctionnera correctement avec UAC
OutilsSUA
http://blogs.msdn.com/uac/
LUA Buglighthttp://blogs.msdn.com/aaron_margosis/
S'exécuter en mode non admin
Problèmes fréquents
Accès en écriture aux ressources non accessibles aux utilisateurs standard
Program Files
HKEY_LOCAL_MACHINE
Création/Ouverture d'une ressource avec plus de droits que nécessaire
Même si on n'utilise pas ces droits
Mauvaise utilisation des dossiers pour stocker données et états de l'application
Sauvegarde données/étatsRecommandations
Données de l'utilisateur\Users\<username>\ par type de données "Documents", "Pictures", etc…
%userprofile%
L'utilisateur utilise ces données "directement"
Créer sous-dossier, ou nouvelle catégorie si nécessaire
Données de l'application (état) par utilisateurE.g. settings par utilisateur
Utilisateur n'interagit pas "directement" avec ces données
Spécifiques à la machine\Users\<Username>\Appdata\Local
%localappdata%
HKCU
E.g. settings par utilisateur
Utilisateur n'interagit pas "directement" avec ces données
Pour l'utilisateur quelque soit la machine\Users\<Username>\Appdata\Roaming
%appdata%
HKCU
Sauvegarde données/étatsRecommandations
Données partagées entre utilisateurs\Users\Public\ par type de données "Documents", "Pictures", etc…
%public%
Interaction "directe" des utilisateurs
Configuration initiale de l'application lors de l'installation pour cette machine (affecte tous les utilisateurs)
Administrateur seulement pour écriture
HKLM
\ProgramData\%allusersprofile%
E.g. Shortcuts du menu Démarrer pour tous les utilisateurs
L'utilisateur n'interagit pas avec ces données
S'exécuter en mode non admin
Ne pas coder les chemins en dur, mais utiliser le système pour localiser les dossiers
Variables d'environnement%userprofile%, %localappdata%, %appdata%, %public%
Environment.GetEnvironmentVariable()
Special foldersSHGetFolderPath(CSIDL_APPDATA)
Environment.GetFolderPath(), Environment.SpecialFolder
Continue à fonctionner sous Vista, même si les noms ("MyDocuments") ne sont plus bon => équivalences ("Documents")
Known foldersNouveau sous Vista pour prendre en compte la nouvelle interface de l'explorer
SHGetKnownFolderPath()
IKnownFolderManager
Chemins de sauvegarde données d'étatTableau de synthèse
Variable environneme
nt
Special FolderKnown Folder Chemin Recommandation
d'usage
%userprofile% - -
\Users\<username>
Profil – Données par utilisateur
%appdata% ApplicationDataAppData
AppData\Roaming
Etat par utilisateur - indépendant de la machine
%localappdata%
LocalApplicationDataLocal AppData
AppData\Local Etat par utilisateur - spécifique pour cette la machine
%public% -Public
\Users\Public Données/états partagés entre utilisateurs
%allusersprofile%
CommonApplicationDataCommon AppData
\ProgramData Configuration par machine lors de l'installation (pas d'accès en écriture utilisateur standard)
Vista Bridge
Samples VistaBridgeWrappers managés pour nouvelles API Vista non encore disponibles .Net Framework 2.0
Fait partie de Windows SDK .NET Framework 3.0 Samples
http://www.microsoft.com/downloads/details.aspx?FamilyID=22b58b6c-8f98-40d0-880d-c3339c5da01e&displaylang=en
Dans le package CrossTechnologySamples.exe
class KnownFoldersGestion des known folders Vista
class UACManagerShellExecute
CoCreateAsAdmin
Analyse d'un programme
Démo
Inclure un manifeste
<?xml version="1.0" encoding="utf-8" ?><assembly xmlns="urn:schemas-microsoft-com:asmv.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="AppName" type="win32" /> <description>App Description</description> <trustInfo xmlns="urn:schemas-microsoft.com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" /> </requestedPrivileges> </security> </trustInfo></assembly>
Manifeste
requestedExecutionLevelasInvoker
Application testée pour non-admin
requireAdministratorPrompt selon policy, si nécessaire ouverture session logon admin
Pas d'exécution sans admin (AAM ou OTS)
highestAvailableApplication sera lancée avec jeton non-filtré, si disponible
Prompt selon policy, mais pas de changement d'identité (pas d'OTS)
Un manifeste est nécessaire et utile pourPermettre à un programme nécessitant mode admin de n'être exécuté que dans ce mode
Permettre au shell d'ajouter le bouclier en surimpression à l'icône du programme
Permettre à un programme de se soustraire à la virtualisation
Etc…
Inclure un manifesteVisual Studio 2005
Assez direct avec un projet VC++"Additional Manifest Files"
Un peu plus compliqué avec un projet VC#Créer fichier manifeste <appname>.exe.manifest
Rajouter fichier de ressources au projet <appname>.rc et y inclure référence au manifeste
#define RT_MANIFEST 24
#define APP_MANIFEST 1
APP_MANIFEST RT_MANIFEST <appName>.exe.manifest
Compiler le fichier de ressource avec un "pre-build event"“<path to SDK>\rc.exe” $(ProjectDir)$(ProjectName).rc
Rajouter la ressource compilée au script du projet à la main
Unloader le projet et ouvrir le fichier .csproj avec l'éditeur, puis rajouter l'élément MSBuild suivant:<PropertyGroup>
<Win32Resource>appName.res</Win32Resource>
</PropertyGroup>
Manifeste
Démo
Elévation de privilège Principes
Une application peut avoir besoin de s'exécuter pour tout ou partie en mode admin
UAC contrôle et prend charge l'élévation de privilège
L'élévation (le passage d'un jeton filtré à un jeton non filtré) se produit toujours à une frontière de processus
Elévation = création d'un nouveau processus
On a donc deux types processus ou applicationsProcessus s'exécutant avec le jeton filtré (moindre privilège)
Processus élevé, s'exécutant avec le jeton non filtré
Elévation de privilège Principes
Conditions pour lesquelles UAC va effectuer une élévation de privilège (lancer le processus avec le jeton non filtré)1. Indication explicite du manifeste (embarqué, ou
externe)
2. L'exécutable se trouve dans la base de compatibilité des applications Vista
Intégrée à l'OS
3. L'exécutable est détecté comme étant un programme d'installation
4. Demande explicite du processus parentShellExecute avec verbe "runas"
E.g. Explorer.exe - click droit "Run as administrator" ou propriétés de la shortcut
Moniker d'élévation COM avec CoGetObject
Cre
ate
Pro
ces
s
Elévation de privilège Principes - ShellExecute
parent.exe
ShellExecute
AppInfo Service2. RPC
Consent.exe
child.exe
RAiLaunchAdminProcess(child.exe)
Utilisateur standard Local System Administrateur
3. Nouveauparent
CreateProcessAsUser(child.exe)
CreateProcess
1. ERROR_ELEVATION_REQUIRED
Elévation de privilège
Démo
Élévation de codeLe bouclier
Indique que l'action nécessite une élévation
Toute demande d'élévation doit être prévisible et corrélée à une action indiquée par le bouclier
Si l'application est marquée requireAdministrator,le shell affiche l'icône avec le bouclier en surimpression
Élévation de codeRajouter le bouclier
BoutonsC++SendMessage(GetDlgItem(hWnd, IDOK), BCM_SETSHIELD, 0, TRUE);
Macro (commctrl.h)
Button_SetElevationRequiredState(hwndButton, fRequired);
C#
Attention: this.button1.FlatStyle=System.Windows.Forms.FlatStyle.System;
MenusUn peu plus compliqué – voir littérature
[DllImport("user32.dll")]public extern static int SendMessage(IntPtr hwnd, uint msg, uint wParam, uint lParam); private const uint BCM_FIRST = 0x1600;private const uint BCM_SETSHIELD = BCM_FIRST + 0x000c; public static int Button_SetElevationRequiredState(IntPtr hwnd){ return SendMessage(hwnd, BCM_SETSHIELD, 0, 1);}
Métaphore du bouclier
Démo
Signature Authenticode
Permet d'identifier l'origine du code et de s'assurer de son intégrité pour le consentement
UAC Policy: Only elevate executables that are signed and validated
Par défaut: disabled
Signature
IHM consentement
Sans signature
Avec signature
Application système
Signature
A intégrer dans le processus de développement/productionNécessite planification
Whitepaper Code Signing Best Practiceshttp://www.microsoft.com/whdc/winlogo/drvsign/best_practices.mspx
Signature de testObtenir un certificat de signature auprès d'une CA ou générer un certificat auto-signé de testmakecert -r -pe -ss My -n "CN=<company name>" <certfile>.cer
Signer le codesigntool signwizard
Rajouter le certificat dans le magasin des racines de confiance
Vérifier la signaturesigntool verify /pa /v <exefile>
Commandes de signature peuvent être intégrées dans les étapes "post-build" d'un projet VS
Signature d'un exécutable
Démo
Niveaux d'intégrité
Les niveaux d'intégrité sont définis par le biais de SIDs appelés "Label SID"
Low S-1-16-4096 (0x1000) – Protected Mode IE
Medium S-1-16-8192 (0x2000) – Applications utilisateur
High S-1-16-12288 (0x3000) – Processus élevé par UAC
System S-1-16-16384 (0x4000) - Local System/Local Service
Positionnés sur le jetonNiveau d'intégrité du code
Positionnés sur les ressources (SACL)Niveau d'intégrité des ressources
Règle de la dominance
Niveaux d'intégritéContrôle d'accès – Politique No-Write-Up
Jeton niveauMEDIUM
High
Medium
Low
LectureEcriture
Jeton niveauLOW
RessourcesNo-Write-Up
Utilisateur
Niveaux d'intégritéContrôle d'accès – Politique No-Read-Up
Jeton niveauMEDIUM
High
Medium
Low
LectureEcriture
Jeton niveauLOW
Objets process, thread, token
No-Write-Up/No-Read-Up
Utilisateur
Niveaux d'intégrité Windows Integrity Mechanism
Utilisé par UIPI (User Interface Privilege Isolation )
Une application de niveau inferieur ne peut pas
Faire SendMessage ou PostMessage vers un processus de plus haut niveau
Utiliser des hooks pour monitorer un processus de plus haut niveau
Procéder à l'injection d'une DLL dans un processus de plus haut niveau
Prévention des "shatter attacks"
CompatibilitéVirtualisation
Permet à un programme "legacy" nécessitant droits d'admin de continuer à fonctionner avec UAC
Beaucoup d'applications "legacy" fonctionnent correctement en mode utilisateur standard si ce n'est pour leurs accès en écriture à HKLM\Software et %ProgramFiles%
Solution: rediriger ces accès vers des zones "per user" accessibles sans droits d'admin
Initiative temporaire
Non disponible pour les applications 64 bits
Si manifeste => la virtualisation n'est pas effective
Configurable par policy (enabled/disabled)
Configuration d'UAC
Secpol.msc - Local policies – Security Options
UAC est désactivable - Activé par défautEnsemble des administrateurs en Admin Approval Mode
Enabled/Disabled
Autres policiesMode d’approbation de l’administrateur builtin
Enabled/Disabled
Prompt pour l’élévation de privilège des administrateursConsent/Credentials/No prompt
Prompt pour l’élévation de privilège pour les utilisateurs standardsCredentials/No prompt(denial)
Détection des programmes d'installationEnabled/Disabled
Ne permettre l'élévation que des applications ayant une signature valideEnabled/Disabled
Ne permettre l'élévation des applications UIAccess que si elles sont installées dans répertoire sûr
Enabled/Disabled
Basculer vers un desktop sécurisé pour le prompt d' élévationEnabled/Disabled
Virtualisation des fichiers / de la base de registreEnabled/Disabled
Synthèse des recommandations
Une bonne application Windows Vista/UAC
Est conçue et testée pour un fonctionnement non-admin si possible
Comporte un manifeste indiquant son niveau d'exécution requis
Sauvegarde ses paramètres par utilisateur dans les dossiers/clés de registre dédiés à cet effet
Ne demande pas plus de droits que nécessaire
Factorise les fonctions nécessitant élévation dans un exécutable séparé, et utilise le paradigme du bouclier pour la gestion de l'IHM
Comporte une signature Authenticode pour ses binaires
Effectue sa configuration initiale "par machine" lors de l'installation et non lors de la première exécution
Fait levier sur la technologie MSI 4.0 pour son installation
Obtient le logo Windows Vista
Références
Whitepaper UAC Vista – MSDNVersion finale – pour téléchargement (Format Word)
http://www.microsoft.com/downloads/details.aspx?FamilyID=BA73B169-A648-49AF-BC5E-A2EEBB74C16B&displaylang=en
Version précédente (Beta 1)http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnlong/html/AccProtVista.asp
Whitepaper UAC Vista – Technethttp://technet2.microsoft.com/WindowsVista/en/library/00d04415-2b2f-422c-b70e-b18ff918c2811033.mspx?mfr=true
COM elevation monikerhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/1595ebb8-65af-4609-b3e7-a21209e64391.asp
Blog Kenny Kerrhttp://weblogs.asp.net/kennykerr/archive/2006/09/29/Windows-Vista-for-Developers-_1320_-Part-4-_1320_-User-Account-Control.aspx
Blog Jim Allchinhttp://windowsvistablog.com/blogs/windowsvista/archive/2007/01/23/security-features-vs-convenience.aspx
© 2007 Microsoft France
Votre potentiel, notre passion TM