Aller au contenu

Taxonomie des techniques de persistance cloud M365

Dans la forensique des systèmes d’exploitation locaux, les mécanismes de persistance s’articulent autour d’ancrages sur l’hôte : clés de registre Run, tâches planifiées, abonnements d’événements WMI et démons système. Dans le cloud, la doctrine change radicalement. La persistance sous Microsoft 365 ne modifie aucun système d’exploitation physique ; elle s’ancre dans les architectures distribuées des objets d’identité Microsoft Entra ID, des configurations applicatives SaaS, des pipelines de routage de messagerie et des relations de confiance OAuth 2.0.

L’une des erreurs les plus fréquentes en réponse à incident cloud est la remédiation partielle : l’analyste révoque les sessions actives de la victime et réinitialise son mot de passe, considérant l’incident comme clos. Quelques heures ou jours plus tard, le cybercriminel réinvestit le tenant car les points d’ancrage secondaires — méthodes MFA compromises, applications OAuth avec offline_access, règles de boîte invisibles ou nouveaux secrets applicatifs — sont demeurés intacts.

Ce guide établit la Taxonomie de la Persistance Cloud en 5 Domaines pour Microsoft 365, analyse la matrice de survie aux actions de remédiation, cartographie les sources d’audit et fournit des méthodologies de chasse systématique.


1. La taxonomie de la persistance cloud en 5 domaines

Section intitulée « 1. La taxonomie de la persistance cloud en 5 domaines »

Les mécanismes de persistance dans Microsoft 365 se répartissent sur cinq plans architecturaux distincts :

graph TD
subgraph "Architecture de Persistance Cloud M365"
D1[Domaine 1 : Plan d'Identité<br/>Backdoors MFA, Méthodes SSPR, Injection TAP, Comptes Invités]
D2[Domaine 2 : Plan Applicatif & OAuth<br/>Consentements Illicites, Injection de Secrets/Certificats sur Service Principals]
D3[Domaine 3 : Plan Boîte Mail & Collaboration<br/>Règles de Boîte, Règles MAPI Invisibles, Délégations de Boîte]
D4[Domaine 4 : Plan de Routage & Transport<br/>Règles de Transport, Copie Cachée Auto, Connecteurs Sortants]
D5[Domaine 5 : Plan d'Administration & Rôles<br/>Rôles Permanents Entra, Manipulation PIM, Groupes Assignables]
end
COMPROMISE[Compromission Initiale Réussie] --> D1
COMPROMISE --> D2
COMPROMISE --> D3
COMPROMISE --> D4
COMPROMISE --> D5
Domaine de PersistancePoint d’Ancrage ArchitecturalTechnique Cybercriminelle TypiqueHorizon de Survie / Pérennité
1. Plan d’identitéObjet Utilisateur Entra IDAjout d’un téléphone ou d’une clé FIDO contrôlée par l’attaquant ; génération d’un Temporary Access Pass (TAP).Survit au changement de mot de passe ; détruit uniquement par la purge explicite des méthodes MFA.
2. Plan applicatif & OAuthService Principals & ApplicationsAutorisation d’applications multi-tenant (offline_access) ; injection de secrets clients sur des applications existantes.Indéterminé ; survit aux changements de mot de passe, de MFA et au départ du collaborateur.
3. Plan boîte mailMoteur Exchange Store DriverInjection de règles de boîte (ForwardTo), règles MAPI invisibles ou attribution de droits FullAccess / SendAs.Survit au renouvellement de mot de passe ; détruit uniquement par le nettoyage de la boîte aux lettres.
4. Plan de routage transportPipeline de Transport ExchangeCréation de règles de flux (Transport Rules) envoyant en copie cachée (BCC) tous les courriels financiers vers l’extérieur.Impacte l’ensemble du tenant ; totalement indépendant de l’état du compte utilisateur.
5. Plan d’administrationMoteur d’Attribution des Rôles EntraAttribution permanente de rôles d’annuaire (Global Administrator) ou altération des règles PIM.Permanent jusqu’à l’audit et la révocation manuelle des privilèges.

2. La matrice de survie aux actions de remédiation

Section intitulée « 2. La matrice de survie aux actions de remédiation »

Pour concevoir un plan d’endiguement exhaustif, l’analyste DFIR doit impérativement savoir quelles techniques résistent aux opérations classiques :

Technique de PersistanceSurvit au Changement de Mot de Passe ?Survit à Revoke-MgUserSignSession ?Survit à la Réinitialisation MFA ?Survit à la Suppression de Licence ?
Numéro mobile attaquant (MFA)OUIOUINON (si purge complète)NON (compte désactivé)
Temporary access pass (TAP)OUINONOUINON
Consentement OAuth (offline_access)OUIOUIOUIOUI (si grant applicatif)
Secret sur service principalOUIOUIOUIOUI (objet tenant)
Règle de Boîte (ForwardTo)OUIOUIOUINON (boîte inactive)
Règle de transport Exchange (BCC)OUIOUIOUIOUI (règle globale)
Délégation de Boîte (FullAccess)OUIOUIOUINON (boîte désaffectée)
Compte invité furtifOUIOUIOUIOUI (identité distincte)
Rôle d’annuaire permanentOUIOUIOUIOUI (rôle sans licence)

3. Surfaces de journalisation forensique par vecteur

Section intitulée « 3. Surfaces de journalisation forensique par vecteur »

Lors de la recherche des mécanismes de persistance, l’analyste doit croiser les journaux d’audit de Microsoft Entra ID et le Unified Audit Log (UAL) de Purview :

graph TD
HUNT[Audit Systématique de Persistance] --> L_ENTRA[Table AuditLogs Entra ID]
HUNT --> L_UAL[Unified Audit Log Purview]
L_ENTRA --> E1[Catégorie : UserManagement<br/>Opérations : User registered security info, User changed default authentication method]
L_ENTRA --> E2[Catégorie : ApplicationManagement<br/>Opérations : Add service principal, Consent to application, Update application - Certificates and secrets management]
L_ENTRA --> E3[Catégorie : RoleManagement<br/>Opérations : Add member to role, Add eligible member to role]
L_UAL --> U1[RecordType : ExchangeItem / ExchangeAdmin<br/>Opérations : New-InboxRule, Set-InboxRule, Add-MailboxPermission]
L_UAL --> U2[RecordType : ExchangeAdmin<br/>Opérations : New-TransportRule, Set-TransportRule, New-OutboundConnector]
Vecteur de PersistanceTable TélémétriqueNom d’Activité / OpérationChamps Essentiels à Analyser
Méthode MFA compliceAuditLogsUser registered security infoTargetResources[0].modifiedProperties (Numéro de téléphone, identifiant de clé).
Création d’un TAPAuditLogsGenerate temporary access passInitiatedBy, TargetResources[0].userPrincipalName.
Consentement OAuthAuditLogsConsent to applicationTargetResources[0].displayName, Permissions (offline_access).
Ajout de secret appAuditLogsUpdate application - Certificates and secrets managementTargetResources[0].displayName, date d’expiration du secret.
Règle de boîte mailCloudAppEvents / UALNew-InboxRule, Set-InboxRuleParameters.ForwardTo, Parameters.DeleteMessage, Parameters.MoveToFolder.
Délégation de boîteCloudAppEvents / UALAdd-MailboxPermissionParameters.User, Parameters.AccessRights (FullAccess).
Règle de transportCloudAppEvents / UALNew-TransportRule, Set-TransportRuleParameters.BlindCopyTo, Parameters.RedirectMessageTo.
Élévation de rôleAuditLogsAdd member to roleTargetResources[0].displayName (Global Administrator), InitiatedBy.

4.1 détection globale des altérations de persistance (30 derniers jours)

Section intitulée « 4.1 détection globale des altérations de persistance (30 derniers jours) »

Exécuter cette requête unifiée sous Microsoft Sentinel ou Defender Advanced Hunting pour balayer toutes les modifications de persistance en une seule opération :

let TargetOperations = dynamic([
"User registered security info",
"User changed default authentication method",
"Consent to application",
"Add service principal",
"Update application - Certificates and secrets management",
"Add member to role",
"Add eligible member to role",
"Add-MailboxPermission",
"New-InboxRule",
"Set-InboxRule",
"New-TransportRule",
"Set-TransportRule"
]);
union
(
AuditLogs
| where TimeGenerated >= ago(30d)
| where OperationName in (TargetOperations)
| project TimeGenerated, Source="EntraAudit", OperationName,
Initiator=tostring(InitiatedBy.user.userPrincipalName),
IPAddress=tostring(InitiatedBy.user.ipAddress),
Target=tostring(TargetResources[0].displayName),
Details=tostring(TargetResources[0].modifiedProperties)
),
(
CloudAppEvents
| where TimeGenerated >= ago(30d)
| where ActionType in (TargetOperations)
| project TimeGenerated, Source="PurviewUAL", OperationName=ActionType,
Initiator=AccountDisplayName, IPAddress,
Target=ObjectName, Details=tostring(RawEventData)
)
| sort by TimeGenerated desc

4.2 détection de l’ajout de secrets sur des applications existantes

Section intitulée « 4.2 détection de l’ajout de secrets sur des applications existantes »

Repérer l’injection d’un secret client ou certificat sur une application d’entreprise préexistante :

AuditLogs
| where TimeGenerated >= ago(30d)
| where OperationName has "Certificates and secrets management"
| extend InitiatedByUser = tostring(InitiatedBy.user.userPrincipalName),
InitiatedByApp = tostring(InitiatedBy.app.displayName),
TargetApp = tostring(TargetResources[0].displayName),
AppId = tostring(TargetResources[0].id)
| project TimeGenerated, OperationName, InitiatedByUser, InitiatedByApp, TargetApp, AppId, TargetResources
| sort by TimeGenerated desc

5. Script PowerShell d’audit systématique de la persistance

Section intitulée « 5. Script PowerShell d’audit systématique de la persistance »

Ce script permet d’auditer automatiquement l’ensemble des points d’ancrage de persistance du tenant :

Fenêtre de terminal
# Prérequis : Modules Microsoft.Graph, ExchangeOnlineManagement
# Connect-MgGraph -Scopes "Directory.Read.All","Application.Read.All","UserAuthenticationMethod.Read.All"
# Connect-ExchangeOnline
Write-Host "=================================================" -ForegroundColor Cyan
Write-Host " AUDIT FORENSIQUE DE PERSISTENCE DU TENANT M365 " -ForegroundColor Cyan
Write-Host "=================================================" -ForegroundColor Cyan
# 1. Audit des règles de transport Exchange
Write-Host "`n[*] Analyse des règles de transport (Mail Flow)..." -ForegroundColor Yellow
$transportRules = Get-TransportRule | Where-Object { $_.BlindCopyTo -or $_.RedirectMessageTo -or $_.ForwardTo }
if ($transportRules) {
Write-Warning "[!] Règles de transport suspectes identifiées :"
$transportRules | Select-Object Name, BlindCopyTo, RedirectMessageTo | Format-Table
} else {
Write-Host "[+] Aucune règle de transport avec redirection ou BCC détectée." -ForegroundColor Green
}
# 2. Audit des redirections au niveau des boîtes aux lettres
Write-Host "`n[*] Analyse des redirections de boîtes..." -ForegroundColor Yellow
$forwardedMailboxes = Get-Mailbox -ResultSize Unlimited | Where-Object { $_.ForwardingSmtpAddress -or $_.ForwardingAddress }
if ($forwardedMailboxes) {
Write-Warning "[!] Boîtes configurées avec transfert externe :"
$forwardedMailboxes | Select-Object DisplayName, UserPrincipalName, ForwardingSmtpAddress, ForwardingAddress | Format-Table
} else {
Write-Host "[+] Aucun transfert externe configuré au niveau boîte." -ForegroundColor Green
}
# 3. Audit des octrois de permissions déléguées OAuth
Write-Host "`n[*] Audit des autorisations d'applications OAuth2 (offline_access & Mail)..." -ForegroundColor Yellow
$grants = Get-MgOauth2PermissionGrant
$riskyGrants = $grants | Where-Object { $_.Scope -match "offline_access" -or $_.Scope -match "Mail\." }
Write-Host "[!] $($riskyGrants.Count) octrois avec permissions sensibles identifiés." -ForegroundColor Yellow
$riskyGrants | Select-Object ClientId, ConsentType, Scope | Format-Table -AutoSize
# 4. Audit des secrets applicatifs récemment créés
Write-Host "`n[*] Examen des mots de passe d'applications créés récemment..." -ForegroundColor Yellow
$recentThreshold = (Get-Date).AddDays(-30)
$apps = Get-MgApplication -All
foreach ($app in $apps) {
$recentSecrets = $app.PasswordCredentials | Where-Object { $_.StartDateTime -ge $recentThreshold }
if ($recentSecrets) {
Write-Warning "[!] L'application '$($app.DisplayName)' possède $($recentSecrets.Count) secret(s) créé(s) depuis moins de 30 jours !"
}
}
Write-Host "`n[+] Inventaire de persistance achevé." -ForegroundColor Green