Aller au contenu

Audit de boîte mail & analyse de MailItemsAccessed

Lors d’une investigation sur une compromission de messagerie (BEC), découvrir qu’un attaquant a réussi à s’authentifier sur la boîte mail d’un dirigeant ou d’un collaborateur ne constitue que l’étape initiale. Les directeurs juridiques, les DPO et les régulateurs (RGPD, HIPAA, SEC) posent immédiatement la question déterminante : « L’attaquant a-t-il réellement consulté ou exfiltré des emails sensibles, ou s’est-il contenté d’ouvrir une session ? »

Répondre à cette question exige la maîtrise de l’audit de boîte mail Exchange Online (Mailbox Auditing). Les journaux d’audit de boîte mail consignent les actions opérées au sein des boîtes par les propriétaires, les délégués et les administrateurs du tenant. Parmi ces opérations, MailItemsAccessed (RecordType 50) est l’événement forensique le plus déterminant de tout l’écosystème M365 : il fournit la preuve formelle et vérifiable de la lecture d’un message individuel ou de la synchronisation massive de dossiers de messagerie.

Ce guide propose une dissection architecturale et forensique approfondie du Mailbox Auditing, des contextes de connexion (Logon Types), des mécanismes internes de MailItemsAccessed (Bind vs Sync), des seuils de déduplication et de régulation, de la résolution des identifiants de messages et de l’évaluation juridique des fuites de données.


1. Architecture et configuration du mailbox auditing

Section intitulée « 1. Architecture et configuration du mailbox auditing »

Historiquement (avant janvier 2019), l’audit des boîtes mail sous Exchange Online était désactivé par défaut (AuditEnabled = false). Les équipes de réponse à incident se heurtaient alors systématiquement à une cécité forensique totale, à moins que l’entreprise n’ait explicitement activé l’audit par script sur chaque boîte.

Depuis 2019, Microsoft active l’audit de boîte mail par défaut sur tous les tenants. Toutefois, l’analyste DFIR doit impérativement valider deux niveaux de configuration dès la prise en main du tenant :

  1. Configuration globale du tenant : régie par Set-OrganizationConfig -AuditDisabled $false.
  2. Configuration spécifique de la boîte mail : régie par Set-Mailbox -AuditEnabled $true et les tableaux d’actions surveillées.
graph TD
subgraph "Magasin Exchange Online"
MBX[Objet Boîte Mail : victim@target.com]
PROP[Propriétés : AuditEnabled / AuditLogAgeLimit]
end
subgraph "Contextes de Connexion (Logon Types)"
OWNER[Owner : Titulaire du compte]
DELEGATE[Delegate : Boîte partagée / Send-As / FullAccess]
ADMIN[Admin : eDiscovery / Conformité / Admin Tenant]
end
subgraph "Pipeline d'Audit"
AUDIT_ENGINE[Moteur d'Audit de Boîte Mail]
RECOVERABLE[Dossier Recoverable Items / Audits]
PURVIEW_BUS[Ingestion UAL / API Office 365 Management]
end
OWNER -->|Opérations : MailItemsAccessed, SoftDelete...| AUDIT_ENGINE
DELEGATE -->|Opérations : SendAs, Create, Move...| AUDIT_ENGINE
ADMIN -->|Opérations : SearchQueryInitiatedExchange...| AUDIT_ENGINE
MBX --- PROP
AUDIT_ENGINE --> RECOVERABLE
RECOVERABLE --> PURVIEW_BUS

1.2 contextes de connexion (logon types) et actions auditées

Section intitulée « 1.2 contextes de connexion (logon types) et actions auditées »

Exchange Online segmente toute l’activité d’une boîte mail en trois Logon Types distincts :

Type de ConnexionDéfinitionActions Auditées par Défaut (E5 / Audit Premium)Rôle en Investigation DFIR
OwnerL’identité titulaire de la licence assignée à la boîte mail.MailItemsAccessed, Update, Move, MoveToDeletedItems, SoftDelete, HardDelete, CreateCrucial dans les attaques BEC où l’adversaire dérobe les identifiants directs (mots de passe, tokens de session AiTM).
DelegateUn tiers ou compte de service accédant à la boîte via une délégation (FullAccess, SendAs, SendOnBehalf).MailItemsAccessed, SendAs, SendOnBehalf, Create, Update, Move, MoveToDeletedItems, SoftDelete, HardDeleteEssentiel pour analyser les mouvements latéraux via des boîtes partagées ou des comptes d’assistants de direction.
AdminActions exécutées par des administrateurs Exchange, des officiers de conformité ou des processus d’administration globale.SearchQueryInitiatedExchange, Update, Move, MoveToDeletedItems, SoftDelete, HardDelete, SendAsIndispensable pour détecter les menaces internes, les administrateurs malveillants ou le détournement d’outils d’eDiscovery.

1.3 vérification et durcissement immédiat de l’audit en incident

Section intitulée « 1.3 vérification et durcissement immédiat de l’audit en incident »

En début d’investigation, vérifiez et durcissez immédiatement l’audit sur les boîtes des cibles critiques (comité de direction, direction financière, RH) :

Fenêtre de terminal
# Vérifier l'état global du tenant
Get-OrganizationConfig | Select-Object -Property AuditDisabled
# Contrôler la boîte ciblée
Get-Mailbox -Identity "victim@target.com" | Format-List AuditEnabled, AuditLogAgeLimit, AuditOwner, AuditDelegate, AuditAdmin
# Forcer l'audit complet et étendre la rétention locale sur la boîte victime
Set-Mailbox -Identity "victim@target.com" `
-AuditEnabled $true `
-AuditLogAgeLimit 365.00:00:00 `
-AuditOwner @{Add="MailItemsAccessed","Update","Move","MoveToDeletedItems","SoftDelete","HardDelete","Create"} `
-AuditDelegate @{Add="MailItemsAccessed","SendAs","SendOnBehalf","Create","Update","Move","MoveToDeletedItems","SoftDelete","HardDelete"} `
-AuditAdmin @{Add="MailItemsAccessed","Update","Move","MoveToDeletedItems","SoftDelete","HardDelete","SendAs","SendOnBehalf"}

Avant l’apparition de MailItemsAccessed, les enquêteurs dépendaient de l’action Update (ex. marquage d’un email non lu comme lu). Cependant, si un cybercriminel ouvrait un message déjà lu, le visualisait dans le volet de prévisualisation ou synchronisait l’intégralité du compte via ActiveSync ou IMAP, aucun événement d’audit n’était émis. L’attaquant bénéficiait d’une invisibilité forensique totale.

L’opération MailItemsAccessed (RecordType 50) comble cette brèche en enregistrant tout accès physique au message, indépendamment de toute modification d’état.

graph TD
ATTACKER[Adversaire Authentifié sur la Boîte Mail] --> METHOD{Vecteur d'Accès}
METHOD -->|Web / Client Lourd / Graph API| BIND[Opération Bind<br/>Consultation Unitaire de Message]
METHOD -->|IMAP / POP3 / ActiveSync / Cache Outlook| SYNC[Opération Sync<br/>Synchronisation Massive de Dossier]
BIND --> BIND_PAYLOAD[Payload d'Audit :<br/>- Objet / Subject<br/>- InternetMessageId<br/>- FolderId<br/>- ItemHexId]
SYNC --> SYNC_PAYLOAD[Payload d'Audit :<br/>- FolderId<br/>- Tableau FolderItems : ItemIds<br/>- Tronqué si seuil dépassé]
BIND_PAYLOAD --> EXFIL_PROOF[Preuve d'Exfiltration Directe :<br/>Lecture Ciblée Démontrée]
SYNC_PAYLOAD --> BULK_PROOF[Preuve d'Exfiltration Massive :<br/>Dossier Entier Téléchargé]

Une opération Bind correspond à l’accès interactif et unitaire à un message spécifique.

  • Un utilisateur double-clique sur un email dans Outlook Web App (OWA) ou le client lourd Outlook pour l’ouvrir.
  • Un email est sélectionné et reste affiché dans le volet de lecture/prévisualisation au-delà du seuil minimal.
  • Une application ou un script tiers lit un message ciblé via l’API Microsoft Graph (GET /v1.0/users/{id}/messages/{id}) ou EWS (GetItem).

Dans le Unified Audit Log (UAL), le JSON AuditData présente la structure suivante :

{
"CreationTime": "2026-03-20T14:22:15",
"Id": "a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d",
"Operation": "MailItemsAccessed",
"OrganizationId": "8f3b6a9c-2d1e-4b5a-9f8e-7c6b5a4d3e2f",
"RecordType": 50,
"ResultStatus": "Succeeded",
"UserKey": "victim@target.com",
"UserType": 0,
"Version": 1,
"Workload": "Exchange",
"ClientIP": "198.51.100.45",
"UserId": "victim@target.com",
"MailboxOwnerUPN": "victim@target.com",
"MailboxOwnerSid": "S-1-5-21-1234567890-123456789-123456789-1001",
"LogonType": 0,
"InternalLogonType": 0,
"MailboxGuid": "4a5b6c7d-8e9f-0a1b-2c3d-4e5f6a7b8c9d",
"MailboxResolvedOwnerName": "Alice Dupont",
"OperationProperties": [
{
"Name": "MailAccessType",
"Value": "Bind"
},
{
"Name": "IsThrottled",
"Value": "False"
}
],
"AppId": "d3590ed6-52b3-4102-aeff-aad2292ab01c",
"ClientAppName": "OWA",
"ClientInfoString": "Client=OWA;Action=ViaProxy",
"Folders": [
{
"FolderId": "LgAAAAB2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8g9h0i1j2k3l4AAAAAAEKAAAB",
"FolderItems": [
{
"InternetMessageId": "<SJ0PR03MB74129A8F7C6B5@SJ0PR03MB7412.eurprd03.prod.outlook.com>",
"ItemId": "RgAAAAB2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8g9h0i1j2k3l4AAAKAAAB",
"Subject": "CONFIDENTIEL : Audit Financier T1 et Coordonnées Bancaires"
}
],
"Path": "\Inbox"
}
]
}

Points clés pour l’analyste DFIR :

  • OperationProperties[MailAccessType] : vaut explicitement Bind.
  • Folders[].Path : le dossier source du message consulté (ex. \Inbox, \Sent Items).
  • Folders[].FolderItems[].Subject : l’objet exact de l’email ouvert par l’adversaire.
  • Folders[].FolderItems[].InternetMessageId : l’identifiant RFC 5322 immuable permettant le pivotement direct vers la Fiche 15 : Message Trace Exchange Online et la Fiche 16 : Message Trace vs Mailbox vs UAL.
  • ClientInfoString & ClientIP : identifie le client et l’adresse IP publique de l’attaquant.

Une opération Sync se produit lorsqu’un protocole ou un client synchronise un dossier contenant plusieurs éléments, téléchargeant les messages en masse dans un cache local.

  • Configuration d’un profil Outlook en mode cache (génération du fichier .ost).
  • Synchronisation mobile via Exchange ActiveSync (EAS).
  • Protocoles historiques : commandes RETR en POP3 ou requêtes FETCH en boucle sous IMAP4.
  • Outils d’exfiltration attaquant l’API Microsoft Graph par requêtes de pagination (GET /v1.0/users/{id}/mailFolders/inbox/messages?$top=50) ou tokens delta.

Dans un événement Sync, Exchange journalise le dossier et une liste d’identifiants ItemId :

{
"CreationTime": "2026-03-20T15:10:04",
"Id": "f9e8d7c6-b5a4-3210-9876-543210abcdef",
"Operation": "MailItemsAccessed",
"OperationProperties": [
{
"Name": "MailAccessType",
"Value": "Sync"
},
{
"Name": "IsThrottled",
"Value": "False"
}
],
"ClientAppName": "ActiveSync",
"ClientInfoString": "Client=REST;Client=AppleMail;Version=17.4",
"ClientIP": "203.0.113.88",
"Folders": [
{
"FolderId": "LgAAAAB2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8g9h0i1j2k3l4AAAAAAEKAAAB",
"FolderItems": [
{ "ItemId": "RgAAAAB2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8g9h0i1j2k3l4AAAKAAAC" },
{ "ItemId": "RgAAAAB2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8g9h0i1j2k3l4AAAKAAAD" },
{ "ItemId": "RgAAAAB2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8g9h0i1j2k3l4AAAKAAAE" }
],
"Path": "\Inbox"
}
]
}

3. Déduplication, agrégation et régulation (throttling)

Section intitulée « 3. Déduplication, agrégation et régulation (throttling) »

Le volume potentiel généré par l’audit de lecture est astronomique. Pour ne pas saturer le pipeline d’ingestion de Microsoft Purview, des règles strictes de déduplication et de régulation sont appliquées.

Si la même session client lit le même message plusieurs fois au cours d’une période de 24 heures, Exchange Online n’émet qu’un seul et unique enregistrement :

[Jour 1, 09:00 UTC] L'attaquant ouvre l'Email #1234 -> Journalisé (MailItemsAccessed: Bind)
[Jour 1, 09:15 UTC] L'attaquant ré-ouvre l'Email #1234 -> Supprimé (Dédupliqué)
[Jour 1, 14:00 UTC] L'attaquant transfère l'Email #1234 -> SendAs émis, mais Bind supprimé
[Jour 2, 09:01 UTC] L'attaquant ouvre l'Email #1234 -> Journalisé (Nouvelle fenêtre de 24h)

Impact forensique :

  • L’absence de nouveaux événements MailItemsAccessed ne prouve pas que l’attaquant n’a pas relu le message durant ces 24 heures.
  • L’horodatage conservé indique le premier accès observé dans cet intervalle de session.

3.2 la régulation de synchronisation (IsThrottled = True)

Section intitulée « 3.2 la régulation de synchronisation (IsThrottled = True) »

Lorsqu’un client synchronise un dossier contenant un volume massif d’éléments (généralement plus de 1 000 éléments en un laps de temps très court) ou enchaîne des boucles de synchronisation intenses, Exchange active le mécanisme de throttling :

  1. Le premier lot d’identifiants est consigné dans FolderItems.
  2. Si le volume dépasse le tampon système, les événements suivants positionnent :
    "OperationProperties": [
    { "Name": "MailAccessType", "Value": "Sync" },
    { "Name": "IsThrottled", "Value": "True" }
    ]
  3. Lorsque IsThrottled vaut True, le tableau FolderItems est partiellement tronqué ou totalement omis.

4. Décompression de FolderItems et résolution des ItemId

Section intitulée « 4. Décompression de FolderItems et résolution des ItemId »

Lorsqu’un événement Sync fournit une liste brute de chaînes ItemId sans objets ni expéditeurs, l’analyste doit réconcilier ces identifiants avec la base de données Exchange.

4.1 script PowerShell de résolution via l’API Microsoft graph

Section intitulée « 4.1 script PowerShell de résolution via l’API Microsoft graph »

Les identifiants de magasin Exchange (RgAAAAB...) sont des structures PR_ENTRYID encodées en Base64. Elles peuvent être traduites en identifiants REST Graph via l’endpoint de conversion :

Fenêtre de terminal
# Prérequis : Module Microsoft.Graph connecté avec les privilèges Mail.Read
# Connect-MgGraph -Scopes "Mail.Read"
# Chargement du JSON d'audit extrait du UAL
$ualJson = Get-Content -Path "C:\DFIR\MailItemsAccessed_Sync_Record.json" | ConvertFrom-Json
$auditData = $ualJson.AuditData | ConvertFrom-Json
$compromisedUser = $auditData.MailboxOwnerUPN
$folderPath = $auditData.Folders[0].Path
Write-Host "[*] Traitement de l'événement Sync pour : $compromisedUser dans le dossier : $folderPath" -ForegroundColor Cyan
# Parcourir chaque ItemId dans FolderItems
$accessedItems = @()
foreach ($item in $auditData.Folders[0].FolderItems) {
$storeItemId = $item.ItemId
# Traduire l'ItemId de magasin Exchange en ID REST Graph
$idTranslationBody = @{
inputIds = @($storeItemId)
sourceIdType = "ewsId"
targetIdType = "restId"
}
try {
$translatedId = (Invoke-MgGraphRequest -Method POST `
-Uri "https://graph.microsoft.com/v1.0/me/translateExchangeIds" `
-Body ($idTranslationBody | ConvertTo-Json)).value[0].targetId
# Récupérer les métadonnées réelles du message
$msg = Get-MgUserMessage -UserId $compromisedUser -MessageId $translatedId `
-Property "Subject,Sender,ReceivedDateTime,HasAttachments,InternetMessageId"
$accessedItems += [PSCustomObject]@{
StoreItemId = $storeItemId
InternetMessageId = $msg.InternetMessageId
Subject = $msg.Subject
Sender = $msg.Sender.EmailAddress.Address
ReceivedTime = $msg.ReceivedDateTime
}
}
catch {
Write-Warning "Impossible de résoudre l'élément : $storeItemId (Le message a peut-être été purgé par l'attaquant)"
}
}
# Export du catalogue forensique
$accessedItems | Export-Csv -Path "C:\DFIR\Messages_Exfiltres_Resolus.csv" -NoTypeInformation
Write-Host "[+] Reconstitution terminée : $($accessedItems.Count) emails identifiés avec succès." -ForegroundColor Green

5. Opérations critiques au-delà de MailItemsAccessed

Section intitulée « 5. Opérations critiques au-delà de MailItemsAccessed »

L’investigation de la messagerie ne s’arrête pas à la consultation : les adversaires modifient les structures de la boîte pour persister, manipuler les communications ou effacer leurs traces :

OpérationTechnique Cybercriminelle AssociéeMITRE ATT&CK
SendAsL’attaquant envoie un email usurpant directement l’identité du dirigeant (ex. fausse facture, instructions de virement bancaire).T1564.008
SendOnBehalfL’attaquant utilise une délégation ; le destinataire voit « Attaquant de la part de Victime ».T1098
CreatePréparation de brouillons d’emails malveillants ou staging d’éléments avant transmission.T1114.002
MoveDéplacement des messages de sécurité ou réponses de victimes vers des sous-dossiers discrets (ex. \RSS Subscriptions ou \Archive).T1564.008
MoveToDeletedItemsSuppression interactive de messages reçus pour masquer l’attaque à l’utilisateur légitime.T1070.008
SoftDeleteDéplacement d’un message vers le sous-dossier Recoverable Items\Deletions (restaurable par l’utilisateur).T1070.008
HardDeletePurge définitive vers Recoverable Items\Purges (tentative d’anti-forensics pour empêcher la restauration).T1070.008
UpdateFolderPermissionsOctroi de permissions déléguées sur un dossier à une identité externe ou un compte complice.T1098

6. Requêtes de chasse KQL (Sentinel / Defender XDR)

Section intitulée « 6. Requêtes de chasse KQL (Sentinel / Defender XDR) »

Pour chasser les activités illégitimes à grande échelle sur Microsoft Sentinel ou Microsoft Defender XDR (CloudAppEvents), utilisez ces requêtes prêtes pour la production :

6.1 détection des volumes anormaux de MailItemsAccessed par IP

Section intitulée « 6.1 détection des volumes anormaux de MailItemsAccessed par IP »

Repérer l’accès aux boîtes de direction depuis des adresses IP atypiques :

CloudAppEvents
| where TimeGenerated >= ago(14d)
| where ActionType == "MailItemsAccessed"
| extend RawData = parse_json(RawEventData)
| extend MailAccessType = tostring(RawData.OperationProperties[0].Value),
IsThrottled = tostring(RawData.OperationProperties[1].Value),
ClientIP = tostring(RawData.ClientIP),
ClientAppName = tostring(RawData.ClientAppName),
LogonType = tostring(RawData.LogonType),
Folders = RawData.Folders
| mv-expand Folders
| extend FolderPath = tostring(Folders.Path),
FolderItemsCount = array_length(Folders.FolderItems)
| summarize
AccessCount = count(),
TotalItemsAccessed = sum(FolderItemsCount),
AccessedFolders = make_set(FolderPath),
ClientApps = make_set(ClientAppName)
by AccountDisplayName, ClientIP, IPAddress, MailAccessType, IsThrottled, bin(TimeGenerated, 1h)
| sort by TotalItemsAccessed desc

6.2 corrélation entre connexion entra douteuse et purge anti-forensics (HardDelete)

Section intitulée « 6.2 corrélation entre connexion entra douteuse et purge anti-forensics (HardDelete) »

Identifier une corrélation directe entre une IP de connexion compromise et des opérations de suppression massive :

let CompromisedUsers = SigninLogs
| where TimeGenerated >= ago(7d)
| where ResultType == 0
| where NetworkLocationDetails has "Unknown" or RiskLevelDuringSignIn in ("high", "medium")
| distinct UserPrincipalName, IPAddress;
CloudAppEvents
| where TimeGenerated >= ago(7d)
| where ActionType in ("HardDelete", "SoftDelete", "MoveToDeletedItems")
| extend RawData = parse_json(RawEventData)
| extend ClientIP = tostring(RawData.ClientIP)
| join kind=inner (CompromisedUsers) on $left.AccountDisplayName == $right.UserPrincipalName, $left.ClientIP == $right.IPAddress
| project TimeGenerated, AccountDisplayName, ActionType, ClientIP, CountryCode, ObjectName, RawData
| sort by TimeGenerated desc

7. Arbre de décision : évaluation forensique de la fuite de données

Section intitulée « 7. Arbre de décision : évaluation forensique de la fuite de données »

Lors de la rédaction des conclusions forensiques pour le DPO et les instances réglementaires, appliquez cet arbre de décision rigoureux :

graph TD
A[Connexion Hostile Confirmée] --> B{Présence d'Événements MailItemsAccessed ?}
B -->|Non - Aucun Événement| C{L'Audit Était-il Actif & Conservé ?}
C -->|Oui| D[Conclusion : Accès Session Sans Lecture Démontrée<br/>Aucun contenu n'a été chargé durant la session]
C -->|Non / Cécité d'Audit| E[Conclusion : Indétermination Forensique<br/>Absence de logs : l'accès aux données ne peut être infirmé]
B -->|Oui - Événements Présents| F{Type d'Accès : MailAccessType ?}
F -->|Bind Unitaire| G[Conclusion : Exfiltration Ciblée Confirmée<br/>Seuls les emails répertoriés dans FolderItems ont été lus]
F -->|Sync| H{IsThrottled == True ?}
H -->|False| I[Conclusion : Exfiltration Massive Délimitée<br/>Tous les ItemId répertoriés ont été téléchargés]
H -->|True| J[Conclusion : Présomption de Compromission Totale du Dossier<br/>L'intégralité du dossier concerné doit être considérée compromise]
Scénario ConstatéConstat ForensiqueObligation de Notification RGPD
Authentification hostile réussie ; 0 événement MailItemsAccessed sur 24h ; Audit actif.Aucune lecture démontrée. L’attaquant n’a pas visualisé de contenu (abandon de session, blocage intermédiaire).Risque faible ; n’impose généralement pas de notification de fuite de données personnelles.
Événement Bind unique avec un InternetMessageId spécifique.Lecture ciblée confirmée. Seul le message ciblé et ses pièces jointes ont été exposés.Notification circonscrite strictement aux personnes physiques mentionnées dans ce message.
Événement Sync avec IsThrottled = False recensant 42 ItemId dans \Inbox.Compromission massive délimitée. 42 messages précis ont été synchronisés hors du tenant.Notification circonscrite aux expéditeurs, destinataires et données contenus dans ces 42 messages.
Événement Sync avec IsThrottled = True dans \Inbox (contenant 12 000 emails).Présomption de fuite intégrale du dossier. Les limites techniques interdisent d’exclure un email précis.Risque maximal ; notification obligatoire auprès de la CNIL considérant les 12 000 emails comme compromis.
Audit de boîte mail désactivé (AuditEnabled = False).Cécité forensique / indétermination. L’attaquant avait un accès total sans trace d’activité.Risque maximal ; le conseil juridique doit statuer sur la base du scénario le plus défavorable.