Naviguer sur Internet et lire ses E-mails de manière sécurisée en tant qu'administrateur

Michael Howard
Microsoft Security Engineering

Adapté en français par Eric Vernier (http://www.microsoft.com/france/msdn/annuaire/xml/ericmitt.xml)

November 15, 2004

Résumé: Michael Howard nous explique comment nous pouvons nous identifier en tant qu' administrateur tout en pouvant surfer sur Internet et utiliser des applications accédant à Internet de manière sécurisée, ceci en enlevant les privilèges administrateur inutiles (et/ou dangereux).(XX pages imprimées)

Télécharger l'outil DropMyRights.msi file.

Je l'ai souvent dit, mais je le répète, " tourner avec un compte d'administrateur est dangereux pour la santé de votre ordinateur et de vos données ". Aussi, lorsque quelqu'un me dit devoir opérer en tant qu'administrateur, je tente toujours de le convaincre que sous l'angle de la sécurité c'est une démarche à déconseiller. Cela dit, c'est vrai sauf quand je rencontre une personne qui a une raison sérieuse de le faire. Par exemple, j'utilise dans mon bureau une machine pour installer quotidiennement les dernières build de Windows, et je dois être administrateur pour installer l'OS. Toutefois, et c'est un point important, je ne consulte pas mes mails, ni ne surf sur le Web ou accèdes sous quelque forme que se soit a Internet lorsque je suis administrateur sur cette machine. Je pratique ainsi car le Web est la source la plus importante d'attaques malicieuses de nos jours.

Que faire si certains souhaitent cependant accéder au Web ? ou consulter leurs mails ? ou faire de la messagerie instantanée ? etc et qui, pour certaines bonnes raisons, sont dans un contexte administrateur ? Si vous observez les principaux problèmes de sécurité des ordinateurs, vous verrez qu'ils sont pour la plupart lié à l'interaction entre l'utilisateur et le Web a travers des outils comme les navigateurs et les clients de messagerie. Bien sûr il y a également des attaques non liées aux interactions utilisateurs comme Blaster (http://www.cert.org/advisories/CA-2003-20.html) et Lion (http://www.sans.org/y2k/lion.htm), c'est pour cela que nous activons le firewall dans le SP2 de Windows XP.

Note Pour une liste de conseils pour travailler en tant que non-admin, jetez un oeil sur le blog de Aaron Margosis' blog vous y trouverez des astuces pour faire tourner Windows en non-admin.

Un exemple de "pourquoi tourner en tant qu'administrateur est dangereux" Certains codes malicieux tournent correctement seulement parce que l'utilisateur qui surfe sur le Web est un administrateur. Un bon exemple est la récente variation du vers Bagle/Beagle dénommé W32.Beagle.AV@mm. Je vous recommande de lire ce que le ver peut faire une fois "invité" sur un système. Symantec a un bon article sur http://securityresponse.symantec.com/avcenter/venc/data/w32.beagle.av@mm.html. Je dit "invite" parce que le code malicieux ne s'appuie pas sur un code ou un design défectueux. Il utilise simplement l'erreur humaine pour s'exécuter. Parmi les nombreuses choses qu'un code malicieux peut faire, toutes nécessitent des droits administrateur : " Créer des fichiers dans le répertoire system32. " Tuer divers processus. " Désactiver le Firewall Windows. " Downloader et écrire des fichiers dans le répertoire system32. " Détruire des valeurs du Registre Windows dans HKLM. Tout ceci échoue si l'utilisateur utilisant le client de messagerie n'est pas un administrateur. Aussi ne serait il pas utile (lire : prudent) si nous pouvions surfer sur le Web, lire nos e-mails, et ainsi de suite en tant que non-admin, même si nous devons faire nos tâches quotidiennes en tant qu'administrateur ? Heureusement, Windows XP et Windows Server 2003 (et les versions supérieures) permettent d'utiliser les jetons restreints (restricted tokens). Plus en détail Windows XP et Windows Server 2003 supportent une fonctionnalité nommée Software Restriction Policy, aussi appelée SAFER, qui permet a un utilisateur ou un développeur d'exécuter du code avec moins de privilèges sans entrer de nouvelles informations utilisateur quand l'application démarre. Par exemple, un administrateur peut lancer une application en tant qu'utilisateur normal en supprimant (restreignant) certains SIDs et privilèges du jeton au lancement du processus de l'application. Certaine applications, et notamment les applications liées à Internet, comme les navigateurs, messagerie instantanées ou client de messagerie, ne devrait jamais être lancée dans un contexte administrateur. L'application DropMyRights DropMyRights est une application très simple qui tente d'aider les utilisateurs qui veulent ouvrir une session administrateur mais lancer des applications dans un contexte plus sécurisé. L'application utilise le jeton de l'utilisateur courant, y enlève certains privilèges et SIDs, et en utilise ce jeton pour lancer un autre processus, comme Internet Explorer et Outlook. Cet outil fonctionne également correctement avec Mozilla's, Firefox, Eudora, et Lotus Notes e-mail. Le code ne peut être plus simple. Ci-dessous le cœur du code: ////////////////////////////////////////////////////////////////////////////////// DWORD wmain(int argc, wchar_t **argv) { DWORD fStatus = ERROR_SUCCESS; if (2 != argc && 3 != argc) { Usage(); return ERROR_INVALID_PARAMETER; } // get the SAFER level DWORD hSaferLevel = SAFER_LEVELID_NORMALUSER; if (3 == argc && argv[2]) { switch(argv[2][0]) { case 'C' : case 'c' : hSaferLevel = SAFER_LEVELID_CONSTRAINED; break; case 'U' : case 'u' : hSaferLevel = SAFER_LEVELID_UNTRUSTED; break; default : hSaferLevel = SAFER_LEVELID_NORMALUSER; break; } } // get the command line, and make sure it's not bogus wchar_t *wszPath = argv[1]; size_t cchLen = 0; if (FAILED(StringCchLength(wszPath,MAX_PATH,&cchLen))) return ERROR_INVALID_PARAMETER; SAFER_LEVEL_HANDLE hAuthzLevel = NULL; if (SaferCreateLevel(SAFER_SCOPEID_USER, hSaferLevel, 0, &hAuthzLevel, NULL)) { // Generate the restricted token we will use. HANDLE hToken = NULL; if (SaferComputeTokenFromLevel( hAuthzLevel, // SAFER Level handle NULL, // NULL is current thread token. &hToken, // Target token 0, // No flags NULL)) { // Reserved STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.lpDesktop = NULL; // Spin up the new process PROCESS_INFORMATION pi; if (CreateProcessAsUser( hToken, wszPath, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, p)) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } else { fStatus = GetLastError(); fwprintf(stderr,L"CreateProcessAsUser failed (%lu)\n",fStatus); } } else { fStatus = GetLastError(); } SaferCloseLevel(hAuthzLevel); } else { fStatus = GetLastError(); } return fStatus; } Le code source et l'exécutable sont disponibles en haut de cet article. Maintenant regardons comment configurer une application pour s'exécuter avec des privilèges restreints. Installation Copier simplement DropMyRights.exe dans un répertoire. Ensuite pour chaque application que vous souhaitez exécuter en mode restreint, suivez les étapes des trois sections suivantes. Créer un raccourci Créer un raccourci et sélectionner DropMyRights.exe comme application cible, suivit du chemin de l'application que vous souhaitez exécuter avec des privilèges moindres. Par exemple: C:\warez\dropmyrights.exe "c:\program files\internet explorer\iexplore.exe" La figure 1 montre ce qui doit apparaître sur votre écran. Figure 1. chemin de l'application a exécuté avec des privilèges moindres Précisez le nom du raccourci Ensuite, mettre un nom adapté au programme cible et non dropmyrights. J'utilise habituellement un mot après le nom de l'application pour indiquer que cette application s'exécute dans un mode plus sécurisé. "(Non-admin)" est une autre façon commune de faire, comme on le voit sur la Figure 2. Figure 2. Modifier le nom du raccourci Modifier l'icône et le mode d'exécution Enfin, une fois le raccourci créé, mettre l'option Run du raccourci à Minimized et si vous le souhaitez sélectionner une nouvelle icône. Figure 3. Fixer l'option Run a Minimized et optionnellement modifier l'icône Options Avancées Les arguments pour DropMyRights sont: DropMyRights {path} [N|C|U] La signification des arguments est: " Path est le nom de chemin complet de l'application. " N lance l'application en mode utilisateur normal. C'est la valeur par défaut si vous ne fournissez pas d'argument. " C lance l'application en tant que "constrained user". " U lance l'application en tant que "untrusted user". Il se peut, que cela perturbe certaines applications. Le meilleur moyen d'identifier ce que font ces différentes options est d'analyser le jeton du processus. La table suivante montre les changements effectués sur le jeton du processus. Table 1. Compte administrateur SIDS Restricting SIDS Privileges DOMAIN\Domain Users Everyone BUILTIN\Administrators BUILTIN\Users NT AUTHORITY \INTERACTIVE NT AUTHORITY \Authenticated Users \LOCAL None SeChangeNotifyPrivilege SeSecurityPrivilege SeBackupPrivilege SeRestorePrivilege SeSystemtimePrivilege SeShutdownPrivilege SeRemoteShutdownPrivilege SeTakeOwnershipPrivilege SeDebugPrivilege SeSystemEnvironmentPrivilege SeSystemProfilePrivilege SeProfileSingleProcessPrivilege SeIncreaseBasePriorityPrivilege SeLoadDriverPrivilege SeCreatePagefilePrivilege SeIncreaseQuotaPrivilege SeUndockPrivilege SeManageVolumePrivilege SeCreateGlobalPrivilege SeImpersonatePrivilege Table 2. Normal User ('N') SIDS Restricting SIDS Privileges DOMAIN\Domain Users Everyone BUILTIN \Administrators BUILTIN\Users NT AUTHORITY \INTERACTIVE NT AUTHORITY \Authenticated Users LOCAL None SeChangeNotifyPrivilege Table 3. Constrained ('C') SIDS Restricting SIDS Privileges DOMAIN\Domain Users Everyone BUILTIN \Administrators BUILTIN\Users NT AUTHORITY \INTERACTIVE NT AUTHORITY \Authenticated Users LOCAL DOMAIN\Domain Users Everyone BUILTIN\Users NT AUTHORITY \INTERACTIVE NT AUTHORITY \Authenticated Users LOCAL NT AUTHORITY \RESTRICTED SeChangeNotifyPrivilege Table 4. Untrusted ('U') SIDS Restricting SIDS Privileges DOMAIN\Domain Users Everyone BUILTIN \Administrators BUILTIN\Users NT AUTHORITY \INTERACTIVE NT AUTHORITY \Authenticated Users LOCAL NT AUTHORITY \RESTRICTED Everyone NT AUTHORITY \INTERACTIVE NT AUTHORITY \Authenticated Users BUILTIN\Users SeChangeNotifyPrivilege Les croix rouges indiquent que le SID est laissé dans le jeton mais est devenu un deny SID. Un SID avec cet attribut est un deny-only SID ; Quand le système fait un contrôle d'accès, il vérifie les ACEs access-denied lié au SID, et ignore les ACEs access-allowed du SID. Le plus important delta de Privilege est entre le compte administrateur et le compte utilisateur normal. Comme vous pouvez le voir, tous les privilèges sont enlevés du jeton excepté le privilège " Bypass Traverse " (aussi connu comme SeChangeNotifyPrivilege.) "Constrained" et "untrusted" ont des deltas plus petits à l'utilisateur normal, et vous devrez faire des tests pour voir si vos applications sortent en erreur de type "security restriction errors ". Mon conseil est d'utiliser Normal (valeur par défaut) pour la plupart des applications, et " Constrained " si vous pensez aller surfer sur des sites hostiles ou des sites Web potentiellement dangereux. Trouver la faiblesse en terme de sécurité… Un bon nombre de personnes ont planchés sur le bug de mon dernier article. La fonction CreateFile ouvre le fichier en mode " all access ", alors que le code ne fait qu'une lecture du fichier. FILE_ALL_ACCESS doit être remplacé par GENERIC_READ ou équivalent. C'est mauvais car de toute manière, seul un administrateur peut utiliser ce code, pas un utilisateur normal. J'ai souvent vu cette erreur. Pouvez vous identifier le point faible de ce code? C'est arrivé sur mon bureau l'autre jour comme étant un bug dans un truc Java DNS. C'est un bug intéressant, que j'ai ré écris en C# et en généralisant le point faible. Int16 req; ... while (true) { getRequest(); req++; arr[req] = DateTime.Now; } ________________________________________ Michael Howard est un Senior Security Program Manager dans le groupe Secure Engineering chez Microsoft et il est co auteur de Writing Secure Code, maintenant dans sa seconde édition, et l'auteur de Designing Secure Web-based Applications for Windows 2000. Il est également co éditeur du magazine Basic Training in IEEE Security & Privacy. Son principal but dans la vie est de "making sure people design, build, test, and document nothing short of a secure system". His favorite line is "One person's feature is another's exploit."

Dernière mise à jour le mardi 7 décembre 2004