UAC

Paru le 3 mai 2007
Par Eric Mittelette

User Access/Account Control est une technologie déjà bien connue sur d’autres systèmes d’exploitation permettant de limiter les droits associés à un login (même et surtout s’il s’agit d’un login administrateur). Windows Vista arrive avec par défaut la mise en place d’UAC et d’une virtualisation de certains dossiers et ruche du registre. Cela a un impact sur nos applications qui vont à l’avenir devoir s’adapter à ces contraintes.

Le principe d’UAC est d’attribuer un jeton de sécurité par défaut à privilèges limité (filtré). Ainsi même si vous êtes logé en tant qu’administrateur, par défaut l’explorateur Windows, filtre vos privilèges et les ramène à un niveau utilisateur.

Ainsi si vous tentez une action nécessitant des droits élevés, vous allez être « prompté » par le système, soit pour confirmer l’action, soit pour saisir un login administrateur.

Cet article tente de présenter succinctement UAC et les stratégies à appliquer dans vos codes. C’est juste une introduction/sensibilisation et ne se substitue en aucun cas à une étude détaillée des impacts d’UAC sur vos codes.

Haut de pageHaut de page

UAC et sécurité sous Vista

UAC est une des nombreuses initiatives en termes de sécurité que vous allez rencontrer sous Vista. Ce nouveau système d’exploitation a été construit en mettant en œuvre SDLC et renforce sa sécurité en limitant la surface d’attaque et en incluant des fonctionnalités spécifiques à la sécurité :

ASLR et /dynamic base qui rend aléatoire les adresses de bases des modules système et limite ainsi la validité des code de hack et d’exploit de buffer overrun.

CryptoAPI : nouvelle génération d’API de crypto, proposant les derniers algorithmes en la matière ainsi que des évolutions en termes de clé, hash…

CardSpace : introduit une gestion originale de l’authentification sur les réseaux.

ControlParental : proposant de limiter les applications, les sites visités sur des plages horaires clairement définies par utilisateur (cas notamment pour les enfants)

UAC, Virtualisation

etc…

Bref pas mal de nouveautés dont UAC sera l’une des premières que vous allez rencontrer.

Haut de pageHaut de page

UAC découverte

Votre première rencontre avec UAC se fera dès les premières configurations ou installations de votre machine. Pour info, il est souvent préférable de lancer les programmes de setup en tant qu’administrateur. Vista reconnait d’ailleurs la plupart des programmes d’installation et active UAC dès leur démarrage (prompt).

Il est toutefois possible de désactiver UAC, du moins temporairement, tout simplement en cliquant sur l’icône de votre menu démarrer et de suivre l’assistant. Cette démarche, bien entendu, n’est pas à conseiller.

Au delà de la simple activation/désactivation d’UAC, il est possible de le configurer plus finement via les local security policy :

UAC découverte

La charte graphique de vista fait apparaitre une icône de bouclier bouclier sur les boutons de commande dont l’action va nécessiter des droits élevés. Nous vous conseillons bien sûr d’appliquer cette charte dans vos applications afin d’être homogène avec Vista et ne pas perturber les utilisateurs qui vont s’y habituer (dans le lab associé à cet article nous illustrons comment mettre en œuvre ce bouclier depuis du code managé .NET)

Haut de pageHaut de page

UAC et « run as administrator »

Il est prévu par défaut dans l’explorateur Vista un raccourci bien utile : « run as administrator »

UAC Vista

Le fait de lancer ainsi une application garantit que le jeton admin ne sera pas filtré à la création du processus, et qu’on bénéficiera des réels droits administrateur lors de l’exécution de cette application.

Il se peut en effet que l’application que vous lancez ait besoin de privilèges avancés, et échoue au regard du jeton qu’elle possède réellement. Il faudra alors utiliser ce menu pour s’assurer du bon fonctionnement de l’application.

Attention toutefois à ne pas « abuser » de ce raccourci, car les applications tournent alors avec de vrais droits administrateur et se retrouve de fait plus sensible aux vers et attaquants de tout poil…

Haut de pageHaut de page

UAC a un impact sur nos codes

Non seulement l’application risque d’échouer, par un problème de droits insuffisants, mais en plus l’application va être « déroutée » par le système lors de tentatives d’écriture dans des répertoires sensibles, c’est que l’on appelle la virtualisation. Vista garantit ainsi que par défaut les applications qui tentent d’écrire dans le registre ou dans un certain nombre de dossiers (comme program file et windows) seront re-routées de manière transparente vers des dossiers ou des ruches par utilisateur. On limite ainsi les corruptions éventuelles d’information dans ces dossiers et clés du registre. Vous trouverez des infos pertinentes sur ce sujet sur : http://blogs.msdn.com/uac/

La virtualisation va assainir nos machines face aux comportements mal maitrisés de certaines applications. Par contre dans certain cas, il n’est pas souhaitable qu’une application soit virtualisée. Ainsi si votre application a réellement besoin d’aller dans program file ou windir, ou encore d’accéder au ruche local machine, il faudra alors désactiver la virtualisation. Une seule solution dans ce cas : gérer un manifest avec l’application. Il est en effet possible dans un manifest (fichier xml de configuration d’une application) de préciser de quel droit a besoin une application (asInvoker ou Administrator par exemple), et d’annuler la virtualisation. (C’est d’ailleurs le seul moyen pour annuler la virtualisation !).

Haut de pageHaut de page

Premiers aperçus

En tant que développeur, votre premier aperçu d’UAC vas être : mon application ne fonctionne pas correctement ! Si elle fonctionne correctement c’est qu’elle n’a pas besoin de droits administrateur et qu’elle se satisfait de la virtualisation… Bravo votre design est conforme à ce que l’on attend depuis plusieurs années et vous êtes prêt pour Vista !

Si ce n’est pas le cas, il va falloir commencer à réfléchir et déterminer ce qui ne va pas. Pour se faire vous pouvez utiliser App Verifier ou l’application Standard User Analyser qui vont vous aider à voir ou le bat blesse (problème de virtualisation ou problème de jeton filtré)

Une fois l’analyse faite, il va falloir opter pour une stratégie pour rendre votre application fonctionnelle sous Vista. Plusieurs stratégies s’offrent à nous que l’on peut synthétiser de la sorte : forcer l’application à utiliser un jeton non filtré (vrais droits administrateur) ou adapter l’application à cette nouvelle contrainte en la scindant en deux parties (une partie en mode user, une partie en mode administrateur)

Haut de pageHaut de page

Bonne pratique

Comme nous venons de le voir les différentes options se résument à :

Forcer l’application à se lancer en tant qu’administrateur

Au delà du « run as administrator » on peut forcer un log-on admin (ie un jeton non filtré) via le manifeste de l’application, on stocke alors la valeur asAdministrator dans le tag correspondant : RequestedExecutionLevel. Cette approche économe en développement (juste l’ajout du manifeste dans le binaire) est opérationnelle mais pas la plus élégante, puisque l’utilisateur est prompté à chaque démarrage, et que l’application, tournant avec un jeton non filtré, est potentiellement plus vulnérable aux virus ou vers….

Scinder l’application en plusieurs processus (jeton filtré, jeton non filtré)

C’est de loin la meilleure approche ou tout du moins la plus conforme à la philosophie Vista UAC. On isole les parties de l’application nécessitant un jeton admin non filtré et on lance un second processus (de courte durée ?) depuis le premier qui tourne en tant qu’utilisateur (jeton filtré). On notera qu’il est alors nécessaire de travailler entre deux processus et qu’un mécanisme IPC doit être mis en œuvre… Pour simplifier cet IPC, sachez qu’il existe un nouveau moniker COM permettant d’instancier un objet COM (prévu en EXE) avec un jeton non filtré, l’IPC est alors trivial : appel des méthode de l’objet COM « distant ».

Se relancer en tant qu’administrateur

Cette alternative permet de se dispenser de scinder l’application en deux processus (ou plus !). L’idée est de fermer l’instance en cours avec jeton filtré et de la relancer avec un jeton non filtré. C’est la stratégie retenue par le gestionnaire de tâche Windows lorsque vous demandez à voir tous les processus (autre que ceux sous votre login). Cette approche doit être retenue avec circonspection car on se retrouve dans le cas d’une application avec des droits admin « entier » et donc comme nous l’avons vu précédemment à « exposition forte »…

Désactiver la virtualisation (via le manifest)

Dans le cas où votre application ne se satisfait pas de la virtualisation, on peut via l’inclusion d’un manifeste désactiver la virtualisation. Votre application va ainsi réellement pouvoir accéder au répertoire program file ou windows et les clés du registre normalement virtualisées.

Haut de pageHaut de page

Conclusion

UAC va apporter un plus certain en terme de sécurité, ne serait ce que pour limiter la propagation de certain vers ou virus qui exploitaient les droits administrateurs. Au delà de la propagation de vers, UAC va nous permettre de nous rendre compte d’une tentative d’intrusion dans notre machine. Imaginez en effet que vous veniez de télécharger un petit jeu depuis internet, tout a l’air de fonctionner correctement quand tout un coup vous êtes prompté par UAC pour autoriser le jeu à écrire dans le registre ou windir (étonnant pour un petit jeu de plateau !), c’est en effet un moyen simple et standard, de détecter des tentatives de hack de votre machine !

Se relancer soi même avec jeton non filtré (cas du taskmanager)

Se lancer dès le démarrage en tant qu’administrateur (via un manifest inclus dans l’exe)

Lancer en cours d’exécution un second exécutable pour les taches administratives.

C’est autour de ces alternatives que vous devez maintenant revoir l’architecture de vos applications pour qu’elles se comportent correctement sous Vista.

J’ai réalisé un lab simple et rapide (en téléchargement sur le même site : MSDN Sécurité) pour s’initier à UAC. Si cet article d’introduction vous a donné envie d’aller plus loin et/ou de faire ce TD, alors il aura atteint son objectif premier : vous sensibiliser à UAC !


Haut de pageHaut de page