The Sensitive Document Never Left SharePoint — But Its Contents Did
SharePoint showed no evidence of a file download.
The document remained in its original library.
Yet a confidential pricing table appeared in an external message.
“The file never left SharePoint, Agent Foskett.”
“Wonderful. Did its contents?”
“We're still checking.”
“Then we've only proved the filing cabinet stayed put.” ☕

Case file: The information that escaped without the file
A fictional investigation into document access, copy-and-paste activity, browser uploads, Purview DLP signals and the limits of Microsoft 365 audit evidence.
The document was still there
FY27-Partner-Pricing.xlsx from a restricted SharePoint Online library. At 09:24 UTC, a partner reported receiving a message containing several confidential figures from the workbook. The security team searched for a matching file download and found none.This is a fictional training investigation. Times, identities and document names are illustrative. Audit event names and available fields depend on licensing, enabled audit and DLP policies, endpoint onboarding, retention and data collection. No single log proves that specific spreadsheet cells were copied.
The first mistake: treating “no download” as “no disclosure”
The investigator must distinguish document access, content extraction and external disclosure. Those are three different claims, requiring different evidence.
Preserve the evidence before it expires
KQL: Reconstruct SharePoint file activity
OfficeActivity table is available only when the Microsoft 365 data connector and relevant audit data are ingested. Operation names can vary; inspect your tenant’s actual events first. This query starts broadly with the target document name and projects core audit context. A FileAccessed event indicates an audited access, not which cells were read.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
// Microsoft Sentinel: requires OfficeActivity from Microsoft 365
let startTime = datetime(2026-10-22T09:00:00Z);
let endTime = datetime(2026-10-22T10:00:00Z);
OfficeActivity
| where TimeGenerated between (startTime .. endTime)
| where OfficeWorkload == "SharePoint"
| where SourceFileName =~ "FY27-Partner-Pricing.xlsx"
| project TimeGenerated, Operation, UserId, ClientIP,
OfficeObjectId, Site_Url, SourceFileName, UserAgent
| order by TimeGenerated ascKQL: Inspect Purview DLP activity without inventing a clipboard trail
SecurityAlert can provide useful leads. Its alert descriptions and entities are not guaranteed to include copied text, destination URLs or a complete activity record. Investigate the underlying Purview alert in the compliance portal to review supported evidence and matched policy conditions.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
// Microsoft Sentinel: requires DLP-related alerts in SecurityAlert
let startTime = datetime(2026-10-22T08:30:00Z);
let endTime = datetime(2026-10-22T11:00:00Z);
SecurityAlert
| where TimeGenerated between (startTime .. endTime)
| where ProviderName has_any ("Microsoft", "Purview")
or ProductName has_any ("Microsoft", "Purview")
| where AlertName has_any ("DLP", "data loss", "sensitive")
or Description has_any ("DLP", "sensitive information")
| project TimeGenerated, AlertName, ProviderName, ProductName,
AlertSeverity, Description, Entities, SystemAlertId
| order by TimeGenerated ascKQL: Check the endpoint and the destination
DeviceNetworkEvents can help identify connections from the analyst’s device to a suspicious external service. A network connection does not prove that workbook contents were transmitted. Correlate with browser events, Endpoint DLP activity explorer, proxy logs and authorised destination-side evidence when available.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
// Microsoft Defender XDR advanced hunting: DeviceNetworkEvents
let startTime = datetime(2026-10-22T09:10:00Z);
let endTime = datetime(2026-10-22T09:30:00Z);
DeviceNetworkEvents
| where Timestamp between (startTime .. endTime)
| where DeviceName =~ "FIN-LT-042"
| where isnotempty(RemoteUrl)
| project Timestamp, DeviceName, InitiatingProcessAccountUpn,
InitiatingProcessFileName, RemoteUrl, RemoteIP,
RemotePort, ActionType
| order by Timestamp ascA DLP alert is a lead, not a verdict
Review whether the relevant DLP policy was in audit-only, warn, block-with-override or block mode at the time. Check whether any override was permitted and recorded. Do not describe a blocked attempt as confirmed exfiltration.
The clue was the matching content, not the missing attachment
In this fictional scenario, the user acknowledged pasting a table into an unapproved external collaboration form while trying to speed up a legitimate business task. The resulting exposure was accidental rather than evidence of account compromise. The distinction matters: the control failure and remediation differ.
A six-stage evidence timeline
2. Confirm access: correlate SharePoint audit activity with the authenticated user and device.
3. Inspect DLP: verify the precise policy match, action, enforcement mode and destination context.
4. Review endpoint: examine browser, network and relevant endpoint activity without assuming that a connection equals data transfer.
5. Validate disclosure: compare preserved external content with the source and confirm recipient scope.
6. Document conclusions: separate established facts, plausible inferences and telemetry gaps in the final report.
Containment: protect the information, not just the file
Do not simply disable a user or block every external site without evaluating the operational impact and the actual exposure.
Defensive lessons for Microsoft 365 teams
Logs have boundaries. SharePoint access events, DLP alerts and endpoint network events each describe different parts of the story.
Policies need testing. Validate sensitivity labels, DLP enforcement, supported browsers and endpoint coverage using realistic scenarios.
Conclusions need evidence. Record what was observed, what was inferred and what cannot be determined.
Agent Foskett closes the case
“I know.”
“So the file is safe?”
“The file is exactly where we left it.”
“And the data?”
Agent Foskett looked at the incident report.
“The data had a meeting without us.” ☕
The Logs Already Knew!

