The Logs Arrived Two Days Late — And Rewrote the Timeline
The incident timeline looked finished.
Initial access.
Execution.
Persistence.
Response.
The evidence had been documented.
Then, two days later, more logs appeared.
They were not new attacker activity.
They were old events arriving late.
And when Agent Foskett placed them where they actually belonged, the beginning of the attack moved.

Arrival Time Was Not Event Time.
Security telemetry can become queryable long after the activity occurred. Investigation timelines must preserve that distinction.
The timeline had looked convincing
There was a clear first suspicious action.
A series of follow-on events.
Then containment.
Agent Foskett had no reason to invent evidence that was not present.
But an investigation timeline is always based on the evidence available at that moment.
Two days later, the available evidence changed.
The new records had old timestamps
That created two different clocks.
When did the activity occur?
And:
When did the data become available to the investigation?
Agent Foskett needed both.
Measure event time against ingestion time
ingestion_time() to compare the event's timestamp with the approximate time the record was ingested into the analytics platform. This makes unusually delayed telemetry visible.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
DeviceProcessEvents
| where Timestamp > ago(7d)
| extend IngestionTime = ingestion_time()
| extend IngestionDelay = IngestionTime - Timestamp
| where IngestionDelay > 1h
| project Timestamp,
IngestionTime,
IngestionDelay,
DeviceName,
AccountName,
FileName,
ProcessCommandLine
| order by IngestionDelay descSome delay is normal. Two days was investigation-significant.
Different data sources and pipelines have different delivery characteristics.
Agent Foskett therefore treated the delay as a telemetry fact, not an attacker indicator.
But when evidence arrived roughly two days after the activity it described, that delay materially affected the incident reconstruction.
The late data had to be inserted by event time — not appended to the end of the story.
Find the most delayed records
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
DeviceProcessEvents
| where Timestamp > ago(7d)
| extend IngestionTime = ingestion_time()
| extend IngestionDelayMinutes =
datetime_diff("minute", IngestionTime, Timestamp)
| summarize Events=count(),
MaxDelayMinutes=max(IngestionDelayMinutes),
AvgDelayMinutes=avg(IngestionDelayMinutes)
by DeviceName, bin(Timestamp, 1h)
| order by MaxDelayMinutes descThe missing beginning appeared
The attacker had not started where the original timeline started.
The investigation had simply lacked the earlier telemetry.
The first observed event was not the first actual event represented by the now-complete evidence.
Rebuild the timeline using event timestamps
Timestamp was used to reconstruct the activity sequence, while ingestion time showed when each record became available to investigators.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
let StartTime = datetime(2026-10-01 00:00:00);
let EndTime = datetime(2026-10-04 00:00:00);
DeviceProcessEvents
| where Timestamp between (StartTime .. EndTime)
| extend IngestionTime = ingestion_time()
| extend IngestionDelay = IngestionTime - Timestamp
| project EventTime=Timestamp,
IngestionTime,
IngestionDelay,
DeviceName,
AccountName,
FileName,
ProcessCommandLine,
InitiatingProcessFileName
| order by EventTime ascThen ask why the data was late
The next investigation was operational: data-source availability, endpoint connectivity, forwarding, collection and ingestion behaviour all needed consideration.
If the affected source was monitored through Microsoft Sentinel health capabilities, health telemetry could also help identify collection or resource issues.
Late evidence requires two investigations: what the evidence says, and why the evidence arrived late.
Look for related Sentinel health evidence
SentinelHealth is available and enabled for the relevant resource type, Agent Foskett can inspect health events around the delay. Health coverage varies by supported Sentinel resource and configuration, so absence of a record is not proof that collection was healthy.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
let StartTime = datetime(2026-10-01 00:00:00);
let EndTime = datetime(2026-10-04 00:00:00);
SentinelHealth
| where TimeGenerated between (StartTime .. EndTime)
| project TimeGenerated,
SentinelResourceType,
SentinelResourceName,
OperationName,
Status,
Description,
Reason
| order by TimeGenerated ascThe incident report had to change
It reflected the evidence available when it was written.
But the late-arriving records changed material facts: the earliest observed activity, the sequence of execution and the amount of time the attacker may have been active before detection.
Agent Foskett updated the timeline and documented why it changed.
A mature investigation records uncertainty and revises conclusions when new evidence arrives.
Build the two-clock timeline
What Agent Foskett checked
What the evidence can and cannot prove
ingestion_time() can help analysts identify when a record was ingested relative to its event timestamp.A large difference demonstrates delayed availability of that record; it does not, by itself, explain the cause of the delay or prove attacker interference.
Different tables also use different event-time columns, so investigators must understand the schema of the source they are reconstructing.
Separate what happened from when the evidence became searchable.
The lesson
They described an older part of the same attack that the investigation had not been able to see.
Agent Foskett did not append those events to the end of the timeline.
He put them where they belonged.
Security timelines should follow event time while preserving ingestion time as evidence about when the analyst could actually know what happened.
Related investigations
Final thought
It is a reconstruction built from evidence.
When the evidence changes, the reconstruction may need to change with it.
Two days later, the logs did not merely add detail. They changed when the story began.
The Logs Already Knew! 🔎

