The Watchlist Said Trusted — The IP Wasn't
The sign-in looked suspicious.
A privileged account.
An unusual location.
An IP address nobody on the SOC recognised.
But the detection did not fire.
Why?
The source IP matched an entry in the organisation's trusted-IP watchlist.
That should have ended the investigation.
It didn't.
Agent Foskett asked the question the allowlist could not answer.
Was the IP still trusted — or was the watchlist simply out of date?

The Watchlist Matched. Reality Didn't.
Reference data can reduce noise and enrich detections. But an allowlist is only as trustworthy as the process that keeps it current.
The alert that never appeared
The account was privileged. The source address was unusual. The timing deserved attention.
Yet the expected Sentinel analytics rule had produced no alert.
Agent Foskett reviewed the rule logic and found the reason.
Events from IP addresses in the trusted-IP watchlist were excluded.
Watchlists are reference data — not evidence of trust
That makes them useful.
It also means a bad assumption in a watchlist can influence multiple detections at once.
The watchlist did not prove the IP was safe. It proved somebody had previously classified it as trusted.
Confirm the watchlist entry
_GetWatchlist(), and Microsoft recommends using the configured SearchKey for joins and frequent searches.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
_GetWatchlist('TrustedIPs')
| project SearchKey,
IPAddress = tostring(WatchlistItem.IPAddress),
Owner = tostring(WatchlistItem.Owner),
Purpose = tostring(WatchlistItem.Purpose),
ReviewDate = tostring(WatchlistItem.ReviewDate)
| where SearchKey == "203.0.113.25"The IP really was on the list
The source address matched the allowlist.
But the metadata beside it told a different story.
The entry referred to an old supplier connection. The service had been retired months earlier, and the organisation could no longer establish a current business reason for trusting the address.
The detection was not broken. The assumption feeding the detection was stale.
Do not use TimeGenerated as the business review date
Microsoft Sentinel refreshes watchlists periodically and updates the underlying
TimeGenerated field. That timestamp therefore should not be treated as proof that somebody recently reviewed or re-approved the business meaning of an entry.If trust needs an expiry or review date, store that governance information explicitly in the watchlist data or its source-of-truth process.
A refreshed record is not the same thing as a revalidated exception.
Show which sign-ins matched the trusted list
SearchKey as the watchlist join key makes the relationship explicit.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
let TrustedIPs =
_GetWatchlist('TrustedIPs')
| project SearchKey;
SigninLogs
| where TimeGenerated > ago(30d)
| lookup kind=leftouter TrustedIPs
on $left.IPAddress == $right.SearchKey
| extend TrustedByWatchlist = isnotempty(SearchKey)
| where TrustedByWatchlist
| project TimeGenerated,
UserPrincipalName,
IPAddress,
AppDisplayName,
ResultType,
ConditionalAccessStatus
| order by TimeGenerated descOne stale entry could hide more than one event
If the trusted IP had been stale for weeks or months, every rule using that same watchlist exception could have treated activity from the address differently.
Agent Foskett identified the exposure window and searched the retained telemetry for all activity associated with the address.
When an exception is wrong, investigate the period in which the exception was trusted.
Hunt the stale IP directly
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
let SuspiciousIP = "203.0.113.25";
SigninLogs
| where TimeGenerated > ago(30d)
| where IPAddress == SuspiciousIP
| project TimeGenerated,
UserPrincipalName,
AppDisplayName,
IPAddress,
Location,
ResultType,
ConditionalAccessStatus,
CorrelationId
| order by TimeGenerated ascThe watchlist had become part of the attack surface
They did not need to disable Microsoft Sentinel.
They simply benefited from a detection exception the organisation had failed to maintain.
That distinction matters because allowlists are often treated as operational housekeeping rather than security controls.
Anything capable of suppressing or changing detection behaviour deserves security governance.
Was the entry stale — or had somebody changed it?
He checked the watchlist's management history and the organisation's source process to determine whether the IP had simply remained too long, had been added incorrectly, or had been deliberately introduced as an exception.
The current watchlist entry answered what Sentinel was using now.
The management trail and business records were needed to explain why it was there.
Bad reference data can come from error, weak governance or deliberate tampering.
Fixing the watchlist was only the first response
It did not answer what had happened while the address was trusted.
Agent Foskett therefore treated remediation and investigation as separate tasks.
Fix the exception. Then hunt the exception window.
Build the watchlist investigation timeline
What Agent Foskett checked
What the evidence can and cannot prove
_GetWatchlist() proves that the queried value is present in the current watchlist data available to Sentinel.It does not prove the value is still trustworthy in the real world.
Likewise, finding suspicious activity from an allowlisted IP does not by itself prove that the watchlist was maliciously altered.
Separate the technical match, the business justification and the history of how the exception was maintained.
The lesson
The IP matched the trusted list, so the event was excluded.
The problem was that reality had moved on while the exception had not.
A watchlist is reference data. It is not a permanent certificate of trust.
If a watchlist can suppress detections, its entries need owners, justification, review and expiry just like any other security exception.
Related investigations
Final thought
Without exceptions, analysts can drown in known and expected activity.
But every exception creates an assumption.
And assumptions age.
The IP was trusted yesterday.
That did not make it trusted forever.
Agent Foskett followed the event the rule had ignored, challenged the reference data and rebuilt the missing timeline.
The Logs Already Knew! 🔎

