Investigation SharePoint online & sites partagés
1. Architecture et hiérarchie forensique de SharePoint online
Section intitulée « 1. Architecture et hiérarchie forensique de SharePoint online »La maîtrise de l’arborescence structurelle de SharePoint Online est indispensable pour circonscrire l’incident et déterminer le périmètre exact d’exposition.
graph TD subgraph TenantScope ["Racine du Tenant SharePoint (contoso.sharepoint.com)"] Hub["Sites Hub (Agrégateurs directionnels)"] CommSite["Sites de communication (Intranet)"] TeamSite["Sites d'équipe (Liés à un groupe M365)"] PrivSite["Sites de canaux privés (Collections subordonnées)"] end
subgraph SiteScope ["Architecture de la collection de sites"] DocLib["Bibliothèques de documents ('Documents partagés')"] SubLists["Listes, pages et ressources applicatives"] Stage1["Corbeille de premier niveau (Accessible utilisateur - 93 j)"] Stage2["Corbeille de second niveau (Administrateur de site)"] PHL["Preservation Hold Library (Rétention légale Purview)"] end
TenantScope --> SiteScope DocLib -->|Suppression| Stage1 Stage1 -->|Vidage| Stage2 Stage2 -->|Purge sous rétention| PHLMatrice de portée forensique SharePoint
Section intitulée « Matrice de portée forensique SharePoint »| Niveau de conteneur | Entité structurelle | Gouvernance des accès | Événements d’audit clés | Signification forensique |
|---|---|---|---|---|
| Tenant | Racine Admin (-admin.sharepoint.com) | Administrateur SharePoint | SiteCollectionCreated, SiteDeleted | Configuration globale et politiques inter-sites |
| Collection de sites | URL du site (/sites/Finance/) | Administrateurs de collection | SiteCollectionAdminAdded, GroupAdded | Frontière de sécurité maître ; héberge les corbeilles |
| Bibliothèque | Magasin de documents (/sites/Finance/Documents) | Droits de bibliothèque / Rupture d’héritage | FolderCreated, LibraryDeleted | Espace principal de stockage documentaire |
| Élément / fichier | Objet binaire (.docx, .xlsx, .pdf) | ACLs uniques / Liens de partage | FileAccessed, FileDownloaded, SharingSet | Preuve d’interaction directe ou de fuite de données |
| Couche de rétention | Preservation Hold Library | Inaccessible aux utilisateurs standards | FileVersionsAllDeleted, HardDelete | Instantanés immuables des fichiers modifiés sous hold |
2. Télémétrie des fichiers : consultation (FileAccessed) versus téléchargement (FileDownloaded)
Section intitulée « 2. Télémétrie des fichiers : consultation (FileAccessed) versus téléchargement (FileDownloaded) »Dans le journal d’audit unifié (UAL), distinguer la prévisualisation dans le navigateur du téléchargement physique sur le poste client est fondamental pour les déclarations réglementaires de violation de données (RGPD).
flowchart TD UserAction[Interaction avec le document] --> Path{Mode d'accès}
Path -->|Aperçu Web / WopiFrame| Preview[Office Online / Lecteur WOPI] Preview --> Ev1["FileAccessed (ExtendedProperties: WOPI)"] Note over Ev1: Rendu côté serveur; AUCUNE copie locale créée sur le poste
Path -->|Téléchargement direct| Download[Requête HTTP GET vers /_layouts/download.aspx] Download --> Ev2["FileDownloaded (Client: Navigateur / Script)"] Note over Ev2: Transfert binaire sur l'endpoint; exfiltration physique prouvée
Path -->|Téléchargement groupé| ZipDownload[Téléchargement d'un dossier en ZIP] ZipDownload --> Ev3["FileDownloaded (UserAgent: OneDriveBrowserSync / Archive_Zip)"] Note over Ev3: Multiples fichiers compressés dans un flux sortant uniqueÉvénements critiques de manipulation de fichiers dans l’UAL
Section intitulée « Événements critiques de manipulation de fichiers dans l’UAL »| Opération | Déclencheur | Preuve médico-légale apportée | Niveau de preuve |
|---|---|---|---|
FileAccessed | Fichier ouvert dans le navigateur ou prévisualisé | Atteste de la prise de connaissance du contenu | Observé (Niveau 6) |
FileDownloaded | Téléchargement explicite vers le poste client | Prouve le transfert hors du cloud d’entreprise | Prouvé (Niveau 7) |
FileModified | Contenu modifié, métadonnées altérées ou chiffrement (ransomware) | Preuve d’altération malveillante | Prouvé (Niveau 7) |
FileDeleted | Élément envoyé vers la corbeille de premier niveau | Nettoyage anti-forensique ou sabotage | Observé (Niveau 6) |
FileRecycled | Déplacement vers la corbeille depuis l’UI web | Action utilisateur volontaire | Observé (Niveau 6) |
FileVersionRestored | Restauration d’une version antérieure | Tentative de remédiation ou manipulation | Observé (Niveau 6) |
3. Forensique des liens de partage et des permissions
Section intitulée « 3. Forensique des liens de partage et des permissions »Les attaquants détournent les liens de partage SharePoint pour exfiltrer des répertoires entiers sans nécessiter de connexions authentifiées suspectes.
sequenceDiagram autonumber actor Attacker as Attaquant (Compte compromis) participant SPO as Site SharePoint Online participant ExtActor as Récolteur externe (VPN / Tor) participant UAL as Journal d'audit unifié Purview
Attacker->>SPO: Création d'un lien anonyme sur le dossier Finance SPO->>UAL: Journalisation 'AnonymousLinkCreated' (/sites/Finance) SPO-->>Attacker: Restitution de l'URL invitée (https://contoso.sharepoint.com/:f:/g/...) Attacker->>ExtActor: Transmission du lien via canal C2 externe ExtActor->>SPO: Requête HTTP GET via le lien invité (Aucun login requis !) SPO->>UAL: Journalisation 'AnonymousLinkUsed' & 'FileDownloaded' (User: 'Guest') Note over UAL: FileDownloaded consigné sous l'identité 'urn:spo:guest' !Identification des artefacts de liens anonymes
Section intitulée « Identification des artefacts de liens anonymes »Lorsqu’un lien public anonyme est utilisé, le champ UserId de l’événement d’audit prend la forme d’un jeton invité spécifique :
{ "UserId": "urn:spo:guest#12345678-abcd-1234-abcd-1234567890ab", "UserType": "Guest", "Operation": "FileDownloaded", "SourceFileName": "Termes_Fusion.pdf", "ClientIP": "198.51.100.45", "UserAgent": "python-requests/2.31.0"}4. Analyse des corbeilles et triage anti-forensique
Section intitulée « 4. Analyse des corbeilles et triage anti-forensique »Lors d’attaques destructives ou de dissimulation de preuves, les adversaires procèdent au vidage systématique des corbeilles :
- Corbeille de premier niveau (
_layouts/15/AdminRecycleBin.aspx) :- Contient les éléments supprimés par les utilisateurs. Conservés pendant 93 jours.
- Les fichiers peuvent être restaurés directement par l’utilisateur ou l’administrateur de site.
- Corbeille de second niveau (administrateur de collection de sites) :
- Lorsque les fichiers sont supprimés de la corbeille utilisateur, ils basculent dans la corbeille de second niveau.
- Toujours conservés dans la limite des 93 jours initiaux.
- Preservation hold library (PHL) :
- Si une politique de rétention Purview ou une suspension légale (Litigation Hold) est active, la suppression depuis la corbeille de second niveau déplace immédiatement le fichier dans la bibliothèque cachée
PreservationHoldLibrary. - Protection immuable : les fichiers sous PHL ne peuvent être supprimés par aucun compte utilisateur ni administrateur tant que la période de rétention légale n’est pas échue.
- Si une politique de rétention Purview ou une suspension légale (Litigation Hold) est active, la suppression depuis la corbeille de second niveau déplace immédiatement le fichier dans la bibliothèque cachée
# Restauration des fichiers purgés de la corbeille de second niveau par un attaquantConnect-PnPOnline -Url "https://contoso.sharepoint.com/sites/Finance" -InteractiveGet-PnPRecycleBinItem -SecondStageOnly | Where-Object {$_.DeletedDate -ge (Get-Date).AddDays(-7)} | Restore-PnPRecycleBinItem5. Ingénierie de détection : requêtes de chasse KQL
Section intitulée « 5. Ingénierie de détection : requêtes de chasse KQL »// Détection de téléchargements anormaux et massifs sur SharePointCloudAppEvents| where TimeGenerated >= ago(7d)| where ActionType == "FileDownloaded"| extend Workload = tostring(RawEventData.Workload)| where Workload =~ "SharePoint"| extend SiteUrl = tostring(RawEventData.SiteUrl)| extend FileName = tostring(RawEventData.SourceFileName)| extend Extension = tostring(RawEventData.SourceFileExtension)| summarize DownloadCount = count(), DistinctFiles = dcount(FileName), Extensions = make_set(Extension, 10), Sites = make_set(SiteUrl, 5) by AccountDisplayName, IPAddress, bin(TimeGenerated, 1h)| where DownloadCount > 50 or DistinctFiles > 30| sort by DownloadCount desc// Corrélation entre création de liens anonymes et téléchargements invitéslet AnonLinks = CloudAppEvents| where TimeGenerated >= ago(14d)| where ActionType == "AnonymousLinkCreated"| extend SiteUrl = tostring(RawEventData.SiteUrl)| extend ObjectId = tostring(RawEventData.ObjectId)| project LinkTime = TimeGenerated, Creator = AccountDisplayName, CreatorIP = IPAddress, SiteUrl, ObjectId;CloudAppEvents| where TimeGenerated >= ago(14d)| where ActionType == "FileDownloaded" and RawEventData.UserType =~ "Guest"| extend TargetObject = tostring(RawEventData.ObjectId)| join kind=inner (AnonLinks) on $left.TargetObject == $right.ObjectId| project TimeGenerated, Creator, CreatorIP, DownloaderIP = IPAddress, TargetObject, RawEventData| sort by TimeGenerated desc<#.SYNOPSIS Audit des administrateurs de collection de sites pour détecter les élévations suspectes.#>Connect-SPOService -Url "https://contoso-admin.sharepoint.com"
$Sites = Get-SPOSite -Limit Allforeach ($Site in $Sites) { $Admins = Get-SPOUser -Site $Site.Url | Where-Object {$_.IsSiteAdmin -eq $true} foreach ($Admin in $Admins) { [PSCustomObject]@{ SiteUrl = $Site.Url AdminUser = $Admin.LoginName IsGroup = $Admin.IsGroup } }}6. Playbook d’investigation : réponse à incident SharePoint
Section intitulée « 6. Playbook d’investigation : réponse à incident SharePoint »-
Activation immédiate d’un gel de rétention d’urgence : Appliquer une politique de rétention Purview d’urgence sur l’ensemble des sites pour forcer la capture de toute modification ou suppression dans la Preservation Hold Library :
Fenêtre de terminal New-ComplianceSecurityFilter -FilterName "IR_Freeze_Hold" -SecurityFilterAction All -
Révocation de tous les liens de partage externes : Désactiver le partage anonyme sur les sites ciblés :
Fenêtre de terminal Set-SPOSite -Identity "https://contoso.sharepoint.com/sites/Finance" -SharingCapability ExistingExternalUserSharingOnly -
Audit des élévations de privilèges de site : Inspecter l’UAL pour détecter les événements
SiteCollectionAdminAddedetRoleAssignmentAddedaccordant des droits à des comptes non autorisés. -
Extraction de la liste complète des fichiers exfiltrés : Filtrer l’ensemble des événements
FileDownloadedassociés aux adresses IP de l’attaquant afin d’établir la liste exhaustive des fichiers compromis pour les autorités de protection des données.