Aujourd’hui on va voir **un des mécanismes les plus importants de Windows**
**les tokens de sécurité**.
Beaucoup de développeurs utilisent OpenProcess ou CreateProcess sans comprendre
**pourquoi ça marche parfois et parfois non**.
La réponse est presque toujours : **le token**.
Ici on va voir **ce qu’est un token**, comment Windows l’utilise, et comment le manipuler correctement en Win32.
---
# 1) C’est quoi un token
Un **token de sécurité** représente **l’identité de sécurité** d’un thread ou d’un processus.
Il contient :
* l’utilisateur
* les groupes
* les privilèges
* le niveau d’intégrité
* le type de token
Un token répond à une seule question :
> Est-ce que ce code a le droit de faire cette action ?
---
# 2) À quoi sert un token
Windows ne se base jamais sur :
* le nom du programme
* le chemin
* l’icône
Windows se base sur :
* le token
Chaque accès à :
* un fichier
* un processus
* un service
* une clé registre
est validé **via le token**.
---
# 3) Processus, thread et token
Un processus possède :
* un **token primaire**
Un thread peut posséder :
* un **token d’impersonation**
Priorité :
* si un thread a un token → il est utilisé
* sinon → token du processus
---
# 4) Ouvrir le token d’un processus
Pour ouvrir le token du processus courant :
Code: Select all
HANDLE hToken = NULL;
OpenProcessToken(
GetCurrentProcess(),
TOKEN_QUERY,
&hToken
);
* le token est un handle noyau
* il doit être fermé avec CloseHandle
---
# 5) Droits d’accès au token
Quelques droits importants :
* TOKEN_QUERY
* TOKEN_ADJUST_PRIVILEGES
* TOKEN_DUPLICATE
* TOKEN_IMPERSONATE
* TOKEN_ASSIGN_PRIMARY
Demander trop de droits peut échouer.
---
# 6) Informations d’un token
Pour récupérer des informations :
Code: Select all
GetTokenInformation(
hToken,
TokenUser,
buffer,
size,
&retSize
);
* TokenUser
* TokenGroups
* TokenPrivileges
* TokenIntegrityLevel
* TokenType
---
# 7) Les privilèges
Un privilège permet d’effectuer des actions sensibles.
Exemples :
* SeDebugPrivilege
* SeShutdownPrivilege
* SeBackupPrivilege
Un privilège peut être :
* présent
* absent
* désactivé
---
# 8) Activer un privilège
Pour activer un privilège :
Code: Select all
TOKEN_PRIVILEGES tp = {0};
LookupPrivilegeValueW(
NULL,
L"SeDebugPrivilege",
&tp.Privileges[0].Luid
);
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(tp),
NULL,
NULL
);
* AdjustTokenPrivileges peut réussir même si le privilège n’existe pas
* toujours vérifier GetLastError
---
# 9) Niveau d’intégrité
Le niveau d’intégrité limite ce que le token peut faire.
Niveaux courants :
* Low
* Medium
* High
* System
Un processus admin a :
* Medium (par défaut)
* High (après élévation)
---
# 10) Token primaire vs impersonation
Token primaire :
* associé à un processus
* utilisé pour CreateProcess
Token d’impersonation :
* associé à un thread
* utilisé pour accéder aux ressources
---
# 11) Dupliquer un token
Pour créer un nouveau token :
Code: Select all
DuplicateTokenEx(
hToken,
TOKEN_ALL_ACCESS,
NULL,
SecurityImpersonation,
TokenPrimary,
&hNewToken
);
* lancer un process sous une autre identité
* services
* sandbox
---
# 12) Lancer un processus avec un token
Code: Select all
CreateProcessAsUserW(
hNewToken,
NULL,
L"cmd.exe",
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi
);
* SeAssignPrimaryTokenPrivilege
* SeIncreaseQuotaPrivilege
---
# 13) Erreurs classiques
* confondre admin et privilèges
* oublier CloseHandle
* demander trop de droits
* ne pas vérifier GetLastError
* penser qu’un privilège est actif par défaut
---
# À retenir
Le token définit les droits réels.
Windows vérifie toujours le token.
Un thread peut impersoner.
Les privilèges doivent être activés.
Sans token, rien de sensible n’est possible.
Comprendre les tokens, c’est comprendre **la sécurité Windows**.
