Agent Foskett Academy • KQL Academy • Module 13 • Lesson 153 • Cloud & SaaS Investigation

Lesson 153 — Hundreds of Files Were Downloaded in Eleven Minutes

Lesson 151 established unusually large pre-departure downloads. Lesson 152 added geographically inconsistent SharePoint access. Now the investigation reveals something else: the files were not collected gradually.

Hundreds of download events occurred inside an eleven-minute window. In this lesson we use KQL to measure download velocity, identify the source and workload behind the burst, compare it with the user's normal behaviour and determine whether the pattern looks like routine synchronisation, automation or suspicious data collection.

Total volume tells you how much data moved. Velocity tells you how the activity happened.
Agent Foskett KQL Academy high velocity SharePoint download investigation
Your case file

Between 2:00 PM and 2:11 PM, alex.wilson@contoso.com generates hundreds of SharePoint and OneDrive download events.

✓ Isolate the eleven-minute burst
✓ Measure downloads per minute
✓ Inspect client and operation context
✓ Compare velocity with the user's baseline

Case briefing

CASE FILE User: alex.wilson@contoso.com 13:59:48 — ordinary file activity ↓ 14:00:03 — download burst begins ↓ 14:00–14:11 HUNDREDS OF DOWNLOAD EVENTS ↓ SharePoint + OneDrive Multiple files and sites ↓ 14:11:02 — burst subsides THE QUESTION Was this a legitimate synchronisation process, an automated collection mechanism, or suspicious high-speed data acquisition?

Investigation objective

Use Microsoft 365 audit data in Sentinel to isolate the high-velocity download window, calculate event rates, identify the operations and client context involved, compare the burst with historical behaviour and determine what additional evidence is required before describing the activity as exfiltration.

Investigator's rule

Speed is a signal, not intent. Hundreds of events in minutes may be suspicious, but OneDrive synchronisation and other legitimate processes can also generate rapid activity. Investigate the mechanism before naming the motive.

Stage 1 — isolate the eleven-minute download burst

Start with the narrowest useful time window. Preserve operation, workload, file, site, IP and user-agent context for every download event.

01-isolate-eleven-minute-download-burst.kql
123456789101112131415161718
let TargetUser = "alex.wilson@contoso.com";
let StartTime = datetime(2026-08-18 14:00:00);
let EndTime = StartTime + 11m;
OfficeActivity
| where TimeGenerated between (StartTime .. EndTime)
| where UserId =~ TargetUser
| where OfficeWorkload in ("SharePoint", "OneDrive")
| where Operation in ("FileDownloaded", "FileSyncDownloadedFull")
| project TimeGenerated,
          UserId,
          Operation,
          OfficeWorkload,
          Site_Url,
          SourceFileName,
          SourceRelativeUrl,
          ClientIP,
          UserAgent
| order by TimeGenerated asc

Narrow windows reduce noise

When an anomaly has a known start and end time, a tightly scoped query makes the sequence easier to inspect and reduces unrelated Microsoft 365 activity in the result set.

Keep sync operations visible

Do not treat FileDownloaded and FileSyncDownloadedFull as interchangeable. A burst dominated by sync operations may require a very different explanation from repeated browser downloads.

Stage 2 — measure download velocity minute by minute

Aggregate the events into one-minute bins. This turns a long event list into a simple picture of how quickly the activity accelerated and whether it remained sustained.

02-measure-download-velocity.kql
12345678910111213
let TargetUser = "alex.wilson@contoso.com";
let StartTime = datetime(2026-08-18 14:00:00);
let EndTime = StartTime + 11m;
OfficeActivity
| where TimeGenerated between (StartTime .. EndTime)
| where UserId =~ TargetUser
| where OfficeWorkload in ("SharePoint", "OneDrive")
| where Operation in ("FileDownloaded", "FileSyncDownloadedFull")
| summarize Downloads=count(),
            UniqueFiles=dcount(SourceFileName),
            Sites=dcount(Site_Url)
          by bin(TimeGenerated, 1m)
| order by TimeGenerated asc

Why one-minute bins?

The incident window is only eleven minutes. One-minute bins preserve enough detail to reveal bursts without forcing the analyst to inspect hundreds of individual rows first.

Unique files matter

Event count and unique-file count are not always identical. Repeated operations against the same files can inflate activity, so keep both measurements visible.

Stage 3 — identify what generated the burst

Group the activity by operation, IP address, user agent and site. This helps determine whether one consistent client produced the downloads or whether several access patterns were involved.

03-identify-download-mechanism.kql
1234567891011121314
let TargetUser = "alex.wilson@contoso.com";
let StartTime = datetime(2026-08-18 14:00:00);
let EndTime = StartTime + 11m;
OfficeActivity
| where TimeGenerated between (StartTime .. EndTime)
| where UserId =~ TargetUser
| where OfficeWorkload in ("SharePoint", "OneDrive")
| where Operation in ("FileDownloaded", "FileSyncDownloadedFull")
| summarize Downloads=count(),
            UniqueFiles=dcount(SourceFileName),
            FirstSeen=min(TimeGenerated),
            LastSeen=max(TimeGenerated)
          by Operation, ClientIP, UserAgent, Site_Url
| order by Downloads desc

Browser or sync client?

User-agent and operation context can help distinguish interactive browser activity from synchronisation behaviour. Validate the actual values in your tenant rather than relying on a single string as proof.

One IP does not make it safe

A legitimate user, compromised session or automated process can all operate from a familiar source. Source consistency helps explain the activity but does not determine whether it was authorised.

Stage 4 — compare velocity with historical behaviour

Now calculate download counts in ten-minute windows across an earlier baseline period. Compare the incident burst with the user's normal short-window activity rather than only comparing daily totals.

04-build-download-velocity-baseline.kql
1234567891011
let TargetUser = "alex.wilson@contoso.com";
OfficeActivity
| where TimeGenerated between (ago(37d) .. ago(7d))
| where UserId =~ TargetUser
| where OfficeWorkload in ("SharePoint", "OneDrive")
| where Operation in ("FileDownloaded", "FileSyncDownloadedFull")
| summarize Downloads=count() by bin(TimeGenerated, 10m)
| summarize WindowsObserved=count(),
            AverageDownloadsPer10m=round(avg(Downloads), 1),
            MaximumDownloadsPer10m=max(Downloads),
            P95DownloadsPer10m=percentile(Downloads, 95)

Daily totals can hide bursts

A user might download a similar number of files on two different days but do so very differently: gradually across eight hours or in one automated-looking burst. Velocity exposes that difference.

Use percentiles carefully

The 95th percentile can provide useful behavioural context, but a statistical outlier is not automatically malicious. Business processes can legitimately create rare high-volume windows.

Stage 5 — reconstruct the activity around the burst

Expand slightly before and after the eleven-minute window and include file access and sharing operations. This helps determine what led into the burst and what happened immediately afterwards.

05-reconstruct-download-burst-timeline.kql
123456789101112131415161718
let TargetUser = "alex.wilson@contoso.com";
let StartTime = datetime(2026-08-18 13:50:00);
let EndTime = datetime(2026-08-18 14:25:00);
OfficeActivity
| where TimeGenerated between (StartTime .. EndTime)
| where UserId =~ TargetUser
| where OfficeWorkload in ("SharePoint", "OneDrive")
| where Operation in ("FileAccessed", "FileDownloaded",
                       "FileSyncDownloadedFull", "SharingSet",
                       "AnonymousLinkCreated")
| project TimeGenerated,
          Operation,
          OfficeWorkload,
          Site_Url,
          SourceFileName,
          ClientIP,
          UserAgent
| order by TimeGenerated asc

Look for preparation

Repeated file access immediately before bulk downloads may show the user browsing or selecting content. A sudden burst without preceding interaction may be more consistent with sync or automation.

Look for what happened next

External sharing or anonymous-link creation after collection would materially change the investigation. Data acquisition and data disclosure are separate questions and should be proved separately.

Agent Foskett's download-velocity timeline

13:59 Normal file activity ↓ 14:00 Download burst begins ↓ MINUTE-BY-MINUTE RATE rapid increase observed ↓ HUNDREDS OF EVENTS within eleven minutes ↓ OPERATION REVIEW browser download vs sync behaviour ↓ CLIENT + IP + SITE source context preserved ↓ HISTORICAL BASELINE incident window materially exceeds normal velocity ↓ POST-BURST ACTIVITY sharing and access events reviewed ↓ ASSESSMENT High-velocity data collection confirmed Intent and destination still require evidence
The number of files caught our attention. The eleven-minute window changed the investigation.

Your evidence board

EvidenceWhat it supportsWeight
Hundreds of download events in eleven minutesConfirms high-velocity data collection.Strong behavioural evidence
Many unique files across multiple sitesSupports broad rather than repetitive collection.Strong context
Velocity materially exceeds historical baselineShows the burst was abnormal for the user.Strong supporting evidence
Sync-oriented operation and familiar clientMay support a legitimate synchronisation explanation.Requires validation
Browser-style downloads from an unusual sourceMay strengthen concern about deliberate or compromised-session collection.Strong when corroborated
High velocity aloneDoes not prove theft, exfiltration or malicious intent.Insufficient alone

Write the finding like an investigator

Example: Microsoft 365 audit telemetry recorded hundreds of SharePoint and OneDrive download events associated with alex.wilson@contoso.com during an approximately eleven-minute period. The activity was analysed by minute, unique file count, workload, operation, site, client IP and user-agent context and compared with an earlier short-window behavioural baseline. The incident window materially exceeded the user's normal download velocity, supporting the conclusion that high-speed data collection occurred. The available telemetry should be used to determine whether the burst was produced by legitimate synchronisation, interactive downloading or another mechanism. High download velocity alone does not establish malicious intent or prove that organisational data was transferred outside Microsoft 365.

Lesson 153 key takeaways

  • Total download volume and download velocity answer different investigation questions.
  • Use narrow time windows when the suspicious burst is already known.
  • Bin events into short intervals to expose the shape of high-speed activity.
  • Compare event count with unique-file count.
  • Keep browser and synchronisation operations distinguishable.
  • Group activity by IP, user agent and site to investigate the mechanism.
  • Build short-window historical baselines rather than relying only on daily totals.
  • Statistical outliers identify unusual behaviour, not malicious intent.
  • Investigate activity immediately before and after the burst.
  • Prove data collection and data disclosure as separate parts of the investigation.

Module 13 — the cloud investigation deepens

Lesson 151 established unusual data volume. Lesson 152 added geographic inconsistency. Lesson 153 now proves that the collection occurred at unusually high speed. Next, we pivot away from file activity and investigate a different form of cloud persistence: an OAuth application granted consent.

Next: Lesson 154 — The OAuth Application Was Granted Consent.

Continue your KQL investigation training

Module 13 follows users, sessions, applications and data through Microsoft 365 and cloud services.

Related Agent Foskett Investigations

Continue investigating cloud data collection and suspicious Microsoft 365 activity using evidence-led KQL hunting.

🔎 KQL Academy — Module 13: Advanced Cloud & SaaS Investigation

Following users, sessions, applications and data through Microsoft 365 and cloud services.

Investigate high-volume SharePoint downloads with KQL

Lesson 153 of the Agent Foskett KQL Academy uses Microsoft Sentinel and Microsoft 365 audit data to investigate hundreds of SharePoint and OneDrive file downloads occurring within eleven minutes.

Measure Microsoft 365 download velocity with KQL

Learn how to calculate downloads per minute, compare unique files and operations, inspect source and client context, establish a short-window behavioural baseline and distinguish unusual collection from legitimate synchronisation.