moindre privilège par défaut exécution en tant qu'utilisateur standard même si on est...

40
User Account Control Développement des applications Windows Vista dans le respect d’UAC Jean-Yves Poublan Microsoft France

Upload: amable-marais

Post on 04-Apr-2015

103 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

User Account ControlDéveloppement des applications Windows Vista dans le respect d’UACJean-Yves PoublanMicrosoft France

Page 2: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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"

Page 3: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 4: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 5: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

Outils

Démo

Page 6: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 7: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

Jeton filtréPlus précisément

Privilèges jugés "sensibles"SeCreateTokenPrivilege

SeTcbPrivilege

SeTakeOwnershipPrivilege

SeBackupPrivilege

SeRestorePrivilege

SeDebugPrivilege

SeImpersonatePrivilege

SeRelabelPrivilege

SeLoadDriverPrivilege

Page 8: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 9: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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/

Page 10: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 11: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 12: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 13: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 14: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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)

Page 15: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 16: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

Analyse d'un programme

Démo

Page 17: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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>

Page 18: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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…

Page 19: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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>

Page 20: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

Manifeste

Démo

Page 21: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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é

Page 22: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 23: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 24: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

Elévation de privilège

Démo

Page 25: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

É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

Page 26: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

É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);}

Page 27: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

Métaphore du bouclier

Démo

Page 28: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 29: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

Signature

IHM consentement

Sans signature

Avec signature

Application système

Page 30: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 31: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

Signature d'un exécutable

Démo

Page 32: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 33: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 34: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 35: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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"

Page 36: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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)

Page 37: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 38: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 39: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

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

Page 40: Moindre privilège par défaut Exécution en tant qu'utilisateur standard même si on est membre des administrateurs Mécanismes Ouverture de session interactive

© 2007 Microsoft France

Votre potentiel, notre passion TM