Aller au contenu

Securite et permissions

Ce que vous allez apprendre

  • Comment les permissions du registre fonctionnent (DACL, SACL, heritage)
  • Comment lire et modifier les permissions via Regedit et PowerShell
  • La redirection WoW64 pour les applications 32 bits sur systemes 64 bits
  • La virtualisation UAC et ses effets surprenants

Exemple concret d'abord

Regardons les permissions d'une cle du registre avec PowerShell :

$acl = Get-Acl "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
$acl.Access | Format-Table IdentityReference, RegistryRights, AccessControlType -AutoSize
Resultat attendu
IdentityReference              RegistryRights AccessControlType
------------------              -------------- -----------------
BUILTIN\Users                        ReadKey             Allow
BUILTIN\Administrators              FullControl             Allow
NT AUTHORITY\SYSTEM                 FullControl             Allow

Les utilisateurs peuvent lire, mais seuls les administrateurs et le systeme ont le controle total. C'est le modele de securite du registre en action.

Analogie

Les permissions du registre fonctionnent comme les serrures d'un immeuble. Certaines portes sont ouvertes a tous (lecture), d'autres ne s'ouvrent qu'avec la cle du proprietaire (ecriture), et quelques-unes sont reservees au gardien de l'immeuble (SYSTEM).

En resume

  • Get-Acl en PowerShell affiche les permissions d'une cle du registre
  • Les utilisateurs standards ont generalement un acces en lecture seule
  • Seuls les administrateurs et le compte SYSTEM disposent du controle total

Le modele de securite

Chaque cle du registre possede un descripteur de securite (security descriptor). C'est exactement le meme systeme que pour les fichiers NTFS.

Un descripteur contient 4 elements :

graph TD
    SD["Descripteur de securite"]
    SD --> O["Proprietaire<br/><small>Qui possede la cle</small>"]
    SD --> G["Groupe principal<br/><small>Rarement utilise</small>"]
    SD --> DACL["DACL<br/><small>Qui peut faire quoi</small>"]
    SD --> SACL["SACL<br/><small>Quels acces sont audites</small>"]
Element Role
Proprietaire Le compte qui possede la cle (peut toujours modifier les permissions)
Groupe principal Rarement utilise sous Windows
DACL (Discretionary ACL) Liste des regles : qui a le droit de faire quoi
SACL (System ACL) Liste des acces a enregistrer dans le journal de securite

DACL vs SACL

La DACL controle l'acces (autoriser / refuser). La SACL ne controle rien, elle enregistre les acces dans le journal d'evenements pour l'audit. Ce sont deux mecanismes complementaires.

En resume

  • Chaque cle du registre possede un descripteur de securite, identique au systeme NTFS
  • La DACL definit qui peut lire, ecrire ou supprimer une cle
  • La SACL enregistre les acces dans le journal d'evenements pour l'audit

DPAPI et chiffrement des secrets du registre

Le contrôle d'accès ne suffit pas toujours. Quand Windows doit stocker des secrets sensibles dans le registre, il s'appuie aussi sur DPAPI (Data Protection API).

DPAPI chiffre des blobs de données en s'appuyant sur une clé dérivée :

  • du mot de passe utilisateur pour les secrets liés à HKCU
  • de la clé machine pour les secrets liés à HKLM

L'idée est simple : même si une application peut stocker une donnée dans le registre, elle ne la laisse pas forcément en clair. Le registre devient alors un conteneur de blobs chiffrés, et non de secrets lisibles directement.

Emplacement Contenu chiffré
HKCU\Software\Microsoft\Protected Storage System Provider Anciens mots de passe IE/Outlook (DPAPI user)
HKLM\SECURITY\Policy\Secrets LSA Secrets : comptes de service, mots de passe machine (DPAPI system)
HKCU\Software\Microsoft\Credentials Gestionnaire d'informations d'identification Windows

Les LSA Secrets en pratique

Les LSA Secrets sont stockés sous HKLM\SECURITY\Policy\Secrets. Ils servent notamment à conserver :

  • des mots de passe de comptes de service
  • des secrets machine utilisés par Windows
  • certains identifiants VPN ou mécanismes d'auto-logon

Cette zone n'est pas seulement protégée par une ACL stricte. Elle est aussi réservée au contexte SYSTEM, ce qui explique pourquoi même un administrateur local ne peut pas simplement l'ouvrir dans Regedit ou avec PowerShell.

Constater que HKLM\\SECURITY exige le contexte SYSTEM
# Attempting to read LSA Secrets as admin — will fail
try {
    Get-ChildItem "HKLM:\SECURITY\Policy\Secrets" -ErrorAction Stop
} catch {
    Write-Warning "Access denied — SECURITY hive requires SYSTEM privileges: $_"
}
Exemple de sortie
WARNING: Access denied — SECURITY hive requires SYSTEM privileges: ...

Comprendre la surface d'attaque

Des outils offensifs comme Mimikatz abusent de DPAPI et du contexte SYSTEM pour extraire ou déprotéger ces secrets. Pour un défenseur, le point important n'est pas de mémoriser les commandes offensives, mais de comprendre qu'une élévation vers SYSTEM ouvre immédiatement l'accès à une partie critique du registre.

Manipulation tres sensible

Ne tentez pas d'accéder à HKLM\SECURITY\Policy\Secrets sur un système en production sans autorisation explicite. Ces clés contiennent des secrets actifs.

En résumé

  • DPAPI chiffre les secrets du registre avec une clé dérivée de l'utilisateur ou de la machine
  • HKLM\SECURITY\Policy\Secrets contient les LSA Secrets les plus sensibles
  • L'accès à ces données requiert en pratique le contexte SYSTEM, pas seulement des droits administrateur

Permissions detaillees

Permissions individuelles

Permission Description
Query Value Lire les valeurs d'une cle
Set Value Creer, modifier ou supprimer des valeurs
Create Subkey Creer des sous-cles
Enumerate Subkeys Lister les sous-cles
Notify Recevoir des notifications de modification
Create Link Creer des liens symboliques (reserve au systeme)
Delete Supprimer la cle
Write DAC Modifier les permissions
Write Owner Changer le proprietaire
Read Control Lire les permissions

Permissions groupees (ce que vous voyez dans Regedit)

Niveau Inclut
Lecture (Read) Query Value + Enumerate Subkeys + Notify + Read Control
Controle total (Full Control) Toutes les permissions

Analogie

Les permissions individuelles sont comme les cles d'un trousseau. La cle "Query Value" ouvre le tiroir en lecture, la cle "Set Value" permet d'y ecrire. Le niveau "Controle total" est le passe-partout qui ouvre tout.

En resume

Chaque cle a un descripteur de securite avec une DACL (qui peut faire quoi) et une SACL (quels acces sont audites). Les permissions vont du simple "Query Value" (lecture) au "Full Control" (tout).


Gerer les permissions

Via Regedit (graphique)

  1. Clic droit sur une cle > Autorisations
  2. Selectionnez un utilisateur ou groupe
  3. Cochez les permissions souhaitees (Lecture, Controle total)
  4. Pour des controles plus fins : cliquez sur Avance (heritage, audit, permissions individuelles)

Via PowerShell (scriptable)

Lire les permissions :

$acl = Get-Acl "HKLM:\SOFTWARE\MonApp"
$acl.Access | Format-Table IdentityReference, RegistryRights, AccessControlType
Resultat attendu
IdentityReference              RegistryRights AccessControlType
------------------              -------------- -----------------
BUILTIN\Administrators              FullControl             Allow
NT AUTHORITY\SYSTEM                 FullControl             Allow

Ajouter une permission :

$acl = Get-Acl "HKLM:\SOFTWARE\MonApp"

# Create a rule: Users can read the key
$rule = New-Object System.Security.AccessControl.RegistryAccessRule(
    "BUILTIN\Users",          # Who
    "ReadKey",                # What
    "ContainerInherit,ObjectInherit",  # Inherited by subkeys
    "None",                   # No propagation flags
    "Allow"                   # Allow or Deny
)

$acl.AddAccessRule($rule)
Set-Acl "HKLM:\SOFTWARE\MonApp" $acl
Resultat attendu
Aucune sortie si la commande reussit. Un message d'erreur apparait en cas de probleme (acces refuse, cle introuvable).

Prendre possession d'une cle :

$acl = Get-Acl "HKLM:\SOFTWARE\CleProtegee"
$admin = [System.Security.Principal.NTAccount]"BUILTIN\Administrators"
$acl.SetOwner($admin)
Set-Acl "HKLM:\SOFTWARE\CleProtegee" $acl
Resultat attendu
Aucune sortie si la commande reussit. Un message d'erreur apparait si le privilege SeTakeOwnershipPrivilege n'est pas disponible.

Droits requis

La modification des permissions necessite que vous ayez Write DAC sur la cle. La prise de possession necessite le privilege SeTakeOwnershipPrivilege. Dans les deux cas, vous devez executer PowerShell en tant qu'administrateur.


Via SubInACL (outil Microsoft)

rem Display permissions
subinacl /keyreg "HKEY_LOCAL_MACHINE\SOFTWARE\MonApp" /display

rem Grant read access to Users
subinacl /keyreg "HKEY_LOCAL_MACHINE\SOFTWARE\MonApp" /grant=Utilisateurs=r
Resultat attendu
HKEY_LOCAL_MACHINE\SOFTWARE\MonApp : new ace for Utilisateurs
HKEY_LOCAL_MACHINE\SOFTWARE\MonApp : 1 change(s)
Elapsed Time: 00 00:00:00
Done: 1, Modified 1, Failed 0, Syntax errors 0

SubInACL

SubInACL est un outil Microsoft telechargeable separement. Il est utile pour les scripts batch qui doivent manipuler les permissions en masse. Pour les taches ponctuelles, PowerShell est plus pratique.

En resume

Trois facons de gerer les permissions : Regedit (graphique, ponctuel), PowerShell (scriptable, recommande), SubInACL (batch, masse). Toujours executer en tant qu'administrateur pour modifier les permissions.


Heritage des permissions

Par defaut, les sous-cles heritent des permissions de leur cle parente. C'est comme un dossier dont les fichiers heritent des permissions.

graph TD
    A["HKLM\SOFTWARE\MonApp<br/><small>Admins = Full Control<br/>Users = Read</small>"]
    A -->|"heritage"| B["Config<br/><small>herite des permissions parentes</small>"]
    A -->|"heritage"| C["Data<br/><small>herite des permissions parentes</small>"]
    C -->|"heritage bloque"| D["Secrets<br/><small>permissions explicites uniquement<br/>Admins = Full Control</small>"]
    style D fill:#c44,stroke:#333,color:#fff

Trois comportements possibles :

Action Effet
Desactiver l'heritage La cle ne conserve que ses permissions explicites
Convertir les permissions heritees Les permissions heritees deviennent explicites, puis l'heritage est coupe
Forcer l'heritage La cle parente impose ses permissions a toutes ses sous-cles

Ne touchez pas aux cles systeme

Modifier les permissions de HKLM\SYSTEM, HKLM\SAM ou HKLM\SECURITY peut rendre Windows non demarrable. Ne modifiez jamais les permissions de ces cles sans une sauvegarde complete du systeme (image disque).

En resume

  • Par defaut, les sous-cles heritent des permissions de leur cle parente
  • L'heritage peut etre desactive, converti en permissions explicites, ou force par la cle parente
  • Ne jamais modifier les permissions des cles systeme (HKLM\SYSTEM, SAM, SECURITY) sans sauvegarde complete

Redirection du registre (WoW64)

Sur un systeme 64 bits, Windows isole les applications 32 bits grace a une redirection transparente.

Analogie

C'est comme un bureau de poste a double guichet. Les applications 64 bits vont au guichet principal, les applications 32 bits sont automatiquement redirigees vers un guichet secondaire. Chacune croit aller au meme endroit, mais elles accedent a des boites aux lettres differentes.

Comment ca marche

Quand une application 32 bits demande a acceder a une cle, Windows la redirige silencieusement :

L'application 32 bits demande... Windows la redirige vers...
HKLM\SOFTWARE\MonApp HKLM\SOFTWARE\WOW6432Node\MonApp
HKLM\SOFTWARE\Classes\CLSID\{GUID} HKLM\SOFTWARE\Classes\WOW6432Node\CLSID\{GUID}

Certaines cles sont partagees et ne sont pas redirigees (la meme cle est vue par les processus 32 et 64 bits) :

  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
  • HKLM\SOFTWARE\Classes (partiellement)

Forcer l'acces a une vue specifique

En code C, vous pouvez contourner la redirection :

// Force 64-bit view from a 32-bit process
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\MonApp",
             0, KEY_READ | KEY_WOW64_64KEY, &hKey);

// Force 32-bit view from a 64-bit process
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\MonApp",
             0, KEY_READ | KEY_WOW64_32KEY, &hKey);

En PowerShell, specifiez la vue :

# Open the 32-bit view from a 64-bit process
$key = [Microsoft.Win32.RegistryKey]::OpenBaseKey(
    [Microsoft.Win32.RegistryHive]::LocalMachine,
    [Microsoft.Win32.RegistryView]::Registry32
)
$subkey = $key.OpenSubKey("SOFTWARE\MonApp")

En resume

Sur un systeme 64 bits, les applications 32 bits sont redirigees vers WOW6432Node de maniere transparente. Utilisez les flags KEY_WOW64_64KEY ou KEY_WOW64_32KEY pour forcer l'acces a une vue specifique.


Virtualisation du registre (UAC)

C'est l'un des comportements les plus surprenants du registre.

Quand une application non elevee (sans droits admin) tente d'ecrire dans HKLM\SOFTWARE, au lieu de recevoir une erreur "Acces refuse", Windows redirige silencieusement l'ecriture vers :

HKCU\Software\Classes\VirtualStore\MACHINE\SOFTWARE\...

Le piege

L'application croit avoir ecrit dans HKLM, mais la donnee est en realite dans HKCU. A la relecture, Windows renvoie la version virtualisee. Cela peut creer des bugs tres difficiles a diagnostiquer : l'application fonctionne pour un utilisateur mais pas pour un autre, ou une modification "disparait" quand on passe en mode administrateur.

Conditions de la virtualisation

Condition Virtualisee ?
Application 32 bits sans manifeste d'elevation Oui
Application 64 bits Non
Processus eleve (administrateur) Non
Application avec manifeste requestedExecutionLevel Non

Comment detecter la virtualisation

Gestionnaire des taches > onglet Details > clic droit sur l'en-tete > 
Selectionner des colonnes > cocher "Virtualisation UAC"

Cela affiche une colonne indiquant si chaque processus est virtualise.

Bonnes pratiques pour les developpeurs

Pour eviter la virtualisation, ajoutez un manifeste a votre application avec <requestedExecutionLevel level="asInvoker"/>. Cela desactive la virtualisation et vous obtiendrez des erreurs "Acces refuse" explicites au lieu de redirections silencieuses.

En resume

La virtualisation UAC redirige silencieusement les ecritures dans HKLM\SOFTWARE vers HKCU\...\VirtualStore\... pour les anciennes applications 32 bits. C'est un mecanisme de compatibilite, pas une fonctionnalite. Pour les developpeurs, un manifeste d'elevation desactive ce comportement et rend les erreurs explicites.


Persistance et vecteurs d'attaque courants

Le registre est une cible de premier plan pour les attaquants qui cherchent une persistance. Une simple valeur ajoutée au bon endroit peut suffire à relancer un malware à chaque boot, à chaque logon, voire à détourner l'exécution d'un binaire légitime.

Les mécanismes suivants font partie du minimum à connaître pour tout audit de sécurité Windows :

Clé de registre Technique Niveau de risque
HKCU\Software\Microsoft\Windows\CurrentVersion\Run Programme lancé à chaque connexion utilisateur Élevé — très courant
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run Programme lancé au démarrage pour tous les utilisateurs Élevé — nécessite admin
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<exe> IFEO Hijacking — redirige l'exécution d'un EXE vers un autre Très élevé
HKLM\SYSTEM\CurrentControlSet\Services Service malveillant enregistré comme service Windows Critique
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon Modification de Userinit ou Shell Critique
HKCU\Software\Classes\<extension> Hijacking d'association de fichiers pour l'utilisateur courant Modéré

Run keys

Les clés Run et RunOnce sont les plus banales, donc les plus souvent vérifiées. Elles permettent de lancer un programme automatiquement à l'ouverture de session ou au prochain démarrage.

Leur force pour un attaquant est leur simplicité :

  • une simple valeur REG_SZ suffit
  • la persistance peut être limitée à l'utilisateur courant (HKCU) ou étendue à toute la machine (HKLM)
  • beaucoup d'environnements tolèrent encore des entrées légitimes dans ces emplacements, ce qui masque le bruit
Auditer les Run keys
# Audit Run keys — compare against a known-good baseline
$runKeys = @(
    "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
    "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
    "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
)
foreach ($key in $runKeys) {
    Write-Host "`n=== $key ===" -ForegroundColor Cyan
    Get-ItemProperty $key -ErrorAction SilentlyContinue |
        Select-Object * -ExcludeProperty PS* |
        Format-List
}

IFEO Hijacking

La clé Image File Execution Options (IFEO) est légitime : elle sert au débogage ou à certains mécanismes de compatibilité. Mais si une sous-clé contient une valeur Debugger, Windows peut lancer un autre programme à la place du binaire cible.

Pour un attaquant, c'est une technique redoutable :

  • elle détourne un exécutable de confiance
  • elle peut casser les outils de sécurité ou les utilitaires d'administration
  • elle est souvent oubliée lors des contrôles de routine
Détecter les entrées IFEO avec Debugger
# Detect suspicious IFEO entries (should have no Debugger value on production systems)
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" |
    Where-Object { $_.GetValue("Debugger") -ne $null } |
    Select-Object Name, @{N="Debugger";E={$_.GetValue("Debugger")}}
Exemple de sortie
(aucune sortie — aucun Debugger défini)

Winlogon

La clé Winlogon contrôle une partie du chemin critique d'ouverture de session. Deux valeurs doivent être surveillées en priorité :

  • Userinit, qui initialise la session utilisateur
  • Shell, qui définit l'interface lancée après authentification

Une déviation minime suffit pour obtenir une persistance très fiable, exécutée très tôt dans la session.

Vérifier l'intégrité de Winlogon
# Verify Winlogon integrity — Userinit and Shell must not be altered
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" |
    Select-Object Userinit, Shell
Exemple de sortie
Userinit : C:\Windows\system32\userinit.exe,
Shell    : explorer.exe

Indicateur de compromission fort

Toute valeur supplémentaire dans Userinit (ex. userinit.exe,malware.exe) ou un Shell autre qu'explorer.exe est un indicateur de compromission fort.

Base de contrôle minimale

Ces clés font partie des vérifications de base de tout audit de sécurité Windows. Automatisez leur surveillance via un script planifié ou un SIEM.

En résumé

  • Les Run keys, IFEO, Services et Winlogon sont des points de persistance prioritaires
  • Une simple comparaison avec une baseline saine permet souvent d'identifier des anomalies rapidement
  • L'automatisation de ces contrôles doit faire partie de l'hygiène défensive de base

En resume

La securite du registre repose sur 4 piliers :

  1. Permissions (DACL/SACL) : controle granulaire de l'acces a chaque cle, avec heritage
  2. Redirection WoW64 : isolation automatique des applications 32 bits sur systemes 64 bits
  3. Virtualisation UAC : redirection silencieuse des ecritures non elevees vers le profil utilisateur
  4. Acces restreint : certaines ruches (SAM, SECURITY) ne sont accessibles qu'au compte SYSTEM

Ces mecanismes se superposent pour proteger le systeme tout en maintenant la compatibilite avec les anciens logiciels.


Version simplifiee

Pour une introduction accessible a la securite du registre, consultez Le registre et la securite dans le guide pour debutants.