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