Technical Blog

Continuous Access Evaluation: Is it really tho?

· min read
Continuous Access Evaluation: Is it really tho?

This is a personal blog and all content herein is my own opinion and not that of my employer.


Background

Continuous Access Evaluation, or CAE, is one of those security controls with a wonderfully descriptive name.

Access is not supposed to be evaluated only when you first authenticate.

It is supposed to be evaluated continuously.

Normally, OAuth access tokens can remain valid for some time after issuance. That creates an obvious problem: what happens if the circumstances under which a token was issued change before the token expires?

Perhaps the user’s account is disabled. Perhaps their session is revoked. Perhaps their password changes. Or perhaps, as in this case, they move from a network location permitted by Conditional Access to one that is explicitly blocked.

CAE exists to reduce that window.

Rather than simply waiting for an access token to expire naturally, supported services can react to certain events and require the client to reauthenticate.

At least, that’s the theory.

While testing Conditional Access behaviour with Outlook Mobile, I discovered something rather different.

Entra said access was blocked.

Outlook carried on anyway.

And not merely with email already cached locally.

It continued receiving new mailbox data.


Continuous Access Evaluation: Is It Really Tho?

There is a slightly absurd aspect to having to ask that question about a feature with the word Continuous literally in its name, but here we are.

The expected model is straightforward.

flowchart TD A[User authenticates] --> B[Conditional Access evaluated] B -->|Policy satisfied| C[Access granted] C --> D[Session continues] D --> E{Security conditions change?} E -->|No| D E -->|Yes| F[CAE re-evaluates continued access] F --> G{Current conditions still satisfy policy?} G -->|Yes| D G -->|No| H[Reauthentication required / access interrupted]


The important part is that the user necessarily already has access. That is the security state CAE exists to re-evaluate.

Keep that in mind. It becomes important later.


Discovery

The test was simple.

I signed into Outlook Mobile normally from an allowed network location and confirmed that the mailbox worked as expected. I then changed the network context so that the device appeared to originate from a country explicitly blocked by Conditional Access.

In my testing I used a VPN endpoint in China.

The Conditional Access policy behaved exactly as expected.

Entra sign-in logs showed the access attempt being blocked because of the user’s location.

Interactive authentication could no longer satisfy the policy.

So far, so good.

Except Outlook Mobile continued working.

I could:

  • Open mailbox content.
  • Receive new email.
  • Send email.
  • Continue interacting with Exchange Online.

At various points Outlook would eventually display a sign-in prompt.

Ignoring that prompt did not necessarily stop mailbox access.

That was unexpected.


What I Expected To Happen

Once the user’s network context changed to a location that no longer satisfied Conditional Access, I expected CAE to force the session back through authorisation.

Conceptually:

sequenceDiagram participant U as User participant O as Outlook Mobile participant E as Microsoft Entra ID participant X as Exchange Online U->>O: Sign in from allowed location O->>E: Authenticate / obtain tokens E-->>O: Access permitted O->>X: Access mailbox X-->>O: Mailbox data Note over U,E: User changes to blocked network location O->>E: Continued session / token activity E-->>O: Conditional Access requires reauthentication O-xX: Mailbox access interrupted O-->>U: Sign in again


What I actually observed was closer to this:

sequenceDiagram participant U as User participant O as Outlook Mobile participant E as Microsoft Entra ID participant S as Microsoft-hosted service participant X as Exchange Online U->>O: Sign in from allowed location O->>E: Authenticate E-->>O: Access permitted O->>S: Establish / use Outlook service session S->>X: Access mailbox on behalf of user X-->>S: Mailbox data S-->>O: Mailbox data Note over U,E: User changes to blocked network location O->>E: Interactive authentication activity E-->>O: BLOCKED by Conditional Access Note over O,X: Outlook remains usable S->>X: Continued mailbox access X-->>S: New mailbox data S-->>O: New mailbox data


I cannot see Microsoft’s internal Outlook Mobile architecture, so the intermediary shown above should be treated as a model of the observed behaviour, not a claim about a specific undocumented implementation.

The important point is that mailbox access continued after the identity layer had determined that the user’s current access conditions no longer satisfied policy.


Testing Beyond The Access Token Lifetime

A reasonable first explanation would be that Outlook simply possessed an access token issued before the network location changed.

Access tokens are not usually instantaneous revocation mechanisms.

So I waited. And waited.

The session remained usable beyond the expected access token lifetime of 60-90 minutes.

New email continued arriving. That significantly changes the question.

This was no longer simply:

“An already-issued token works for a while.”

Something was continuing to provide Outlook Mobile with access to Exchange Online after Conditional Access had determined that the session no longer complied with policy.


Testing Explicit Session Revocation

Next I tried something less subtle.

From:

https://mysignins.microsoft.com

I selected Sign out everywhere.

That should invalidate the user’s sessions and require authentication again.

The effect was interesting.

Some active communication/session behaviour was terminated. Mailbox data access, however, did not necessarily stop immediately.

Outlook Mobile could continue accessing Exchange Online data after the session had explicitly been revoked.

At this point the test case had moved well beyond token expiry timing.

We now had three independent signals:

  1. Conditional Access said access was blocked.
  2. CAE should require reauthentication.
  3. The session had explicitly been revoked.

Yet Exchange Online mailbox access could continue.

The security-state transition looked like this:

stateDiagram-v2 [*] --> Authorised Authorised --> PolicyInvalidated: Location changes to blocked country PolicyInvalidated --> ReauthRequired: Conditional Access / CAE ReauthRequired --> Revoked: Sign out everywhere Revoked --> Revoked: Expected - mailbox access denied PolicyInvalidated --> MailboxStillAccessible: Observed ReauthRequired --> MailboxStillAccessible: Observed Revoked --> MailboxStillAccessible: Observed


That last transition is the problem.


It’s Not Just Cached Email

Outlook Mobile is, obviously, an offline-capable email client.

This distinction became important during the MSRC investigation. Reading an email that was already synchronised onto the device before session revocation is not particularly interesting.

The data is already there.

That is not the issue I reported.

The important observation was that Outlook Mobile continued retrieving new email arriving after the Conditional Access / CAE event. This demonstrated continued server-side access. The application was not simply displaying stale cached content. It was still talking to Exchange Online.


The Logs Get Interesting

The Entra logs made the behaviour even more interesting.

Interactive authentication attempts correctly showed Conditional Access blocking access from the restricted location.

But successful non-interactive sign-ins could continue. Those events did not originate from the IP address of the mobile device. They originated from Microsoft infrastructure.

For example, the user might appear to be connecting from the blocked country while successful backend authentication activity appeared to originate from Microsoft infrastructure in the UK.

The observed relationship looked roughly like this:

flowchart LR A[Outlook Mobile<br/>User in blocked location] --> B[Microsoft-hosted Outlook service] B --> C[Exchange Online] C --> D[Mailbox] A -. Interactive sign-in .-> E[Microsoft Entra ID] E -. Conditional Access: BLOCK .-> A B -. Non-interactive service activity .-> E E -. Successful activity from Microsoft infrastructure .-> B

That does not prove a particular token exchange, OBO implementation or backend design. It does, however, demonstrate something operationally important:

continued mailbox access was not simply originating from the user’s device in the way an administrator might reasonably expect.

The location of the user and the location of the Microsoft-hosted service acting in the data path were different security contexts. If downstream access is not bound tightly enough to the current validity of the originating user session, that creates an enforcement gap.


Is This Just How CAE Works?

I wanted to make sure I was not misunderstanding CAE itself. So I tested other Microsoft applications under the same Conditional Access policy.

Microsoft Teams

Teams reacted to the change in location and stopped access quickly.

Azure Portal

Azure Portal also correctly enforced the changed Conditional Access state.

Outlook Mobile

Outlook continued working. The behaviour was also reproduced across multiple Microsoft 365 tenants. That was an important control test.

If every CAE-aware application behaved the same way, this might simply have been a misunderstanding of Microsoft’s documented behaviour.

They did not.

The behaviour appeared specifically associated with Outlook Mobile / Exchange Online.

flowchart TD A[Same user] --> B[Same blocked location] B --> C[Same Conditional Access policy] C --> D[Teams] C --> E[Azure Portal] C --> F[Outlook Mobile] D --> G[Access interrupted promptly] E --> H[Access interrupted promptly] F --> I[Mailbox access continues]

Same policy. Same changed condition. Different enforcement.


Intune App Protection Was Still Working

The device was also subject to Intune App Protection Policy.

Those controls remained active.

For example:

  • Screenshot restrictions remained enforced.
  • Data protection controls remained enforced.
  • The managed application continued behaving as a managed application.

This was useful evidence because it showed that Outlook had not somehow fallen into a completely broken or unmanaged state.

The application was alive. Management was alive. Exchange access was alive.

The thing that was not being consistently enforced was the session validity decision.


Reproduction

Preconditions

  • Microsoft 365 mailbox.
  • Outlook Mobile on iOS or Android.
  • Conditional Access policy restricting access by location.
  • Continuous Access Evaluation enabled.
  • Optional Intune App Protection Policy.

Steps

  1. Sign into Outlook Mobile from an allowed network location.
  2. Confirm normal mailbox access.
  3. Change the device network context to a location blocked by Conditional Access.
  4. Observe the Conditional Access failure in Entra sign-in logs.
  5. Continue using Outlook Mobile.
  6. Confirm that new mailbox data remains accessible.
  7. Wait beyond the expected access-token lifetime.
  8. Confirm continued access.
  9. Use Sign out everywhere from mysignins.microsoft.com.
  10. Continue using Outlook Mobile.
  11. Observe whether new mailbox data remains accessible without successful reauthentication.

For comparison, repeat the location-change test using another Microsoft application such as Teams.


Detection And Hunting

During the investigation I used Entra sign-in telemetry to correlate blocked interactive authentication with successful non-interactive activity.

A simplified starting point looks something like:

let TimeWindow = ago(3d);

SigninLogs
| where TimeGenerated >= TimeWindow
| where AppDisplayName == "Outlook Mobile"
| where IsInteractive == true
| where ResultType != 0
| where ResultDescription contains "Access has been blocked by Conditional Access policies."
| project
    TimeGenerated,
    UserPrincipalName,
    AppDisplayName,
    IPAddress,
    Location,
    ConditionalAccessStatus,
    ConditionalAccessPolicies,
    ResultDescription
| order by TimeGenerated desc

The interesting part is then correlating these blocked events with successful non-interactive sign-ins for the same user and timeframe.

What you are looking for is roughly:

flowchart TD A[User session] --> B[Interactive sign-in] B --> C[Blocked country] C --> D[Conditional Access: FAILURE] A --> E[Outlook remains usable] A --> F[Non-interactive activity] F --> G[Microsoft infrastructure location] G --> H[Authentication / service activity: SUCCESS]

The useful hunting question is not merely:

“Did Conditional Access block the user?”

It is:

“Did resource access or associated non-interactive activity continue after Conditional Access blocked the user?”

Those are very different questions.


Security Impact

The issue is fundamentally about the continued validity of previously authorised sessions.

A user or attacker with an existing authenticated Outlook Mobile session may be able to retain mailbox access after security controls determine that the session should no longer be trusted.

Examples include:

  • The device moving into a geographically blocked location.
  • An administrator attempting to contain an incident by revoking sessions.
  • A user deliberately attempting to terminate active sessions.
  • Conditional Access determining that continued access no longer satisfies policy.

Mailbox content is among the most sensitive information held by many organisations.

Email frequently contains:

  • Password reset links.
  • Authentication notifications.
  • Confidential business information.
  • Legal correspondence.
  • Financial information.
  • Internal security notifications.
  • Links to documents and collaboration systems.
  • Information useful for further social engineering.

Session revocation is therefore not merely an authentication convenience.

It is an incident containment control.

If a security administrator revokes a session because they believe an account or device is compromised, they reasonably expect access to stop.


The Security Boundary

The important state transition is this:

flowchart TD A[AUTHORISED] -->|Conditions change| B[NO LONGER SATISFIES POLICY] B -->|CAE / Conditional Access| C[REAUTHENTICATION REQUIRED] C -->|Until satisfied| D[ACCESS BLOCKED]

The observed Outlook behaviour was instead:

flowchart TD A[AUTHORISED] -->|Conditions change| B[CONDITIONAL ACCESS BLOCKS SESSION] B --> C[REAUTHENTICATION REQUIRED] C --> D[OUTLOOK CONTINUES ACCESSING MAILBOX] D --> E[NEW MAILBOX DATA REMAINS ACCESSIBLE]

That is the entire issue. The fact that the user was authorised previously is not incidental. It is literally the security state CAE exists to re-evaluate.


Root Cause Hypothesis

Based on the observed behaviour, my hypothesis is that session validity signals are not being enforced consistently across all components involved in Outlook Mobile mailbox access.

Potential boundaries include:

  • CAE / Conditional Access evaluation.
  • Token refresh and issuance.
  • Outlook Mobile client-side session handling.
  • Microsoft-hosted intermediary services.
  • Service-to-service or on-behalf-of access paths to Exchange Online.
  • Exchange Online resource enforcement.

A simplified model looks like this:

flowchart LR A[User / Outlook Mobile] --> B[Identity evaluation] B --> C[Token / session state] C --> D[Microsoft-hosted Outlook service] D --> E[Exchange Online] B -. Access should be blocked .-> C C -. Revocation / CAE state .-> D D -. State not fully propagated or enforced? .-> E

I want to be explicit here: this is a hypothesis based on externally observable behaviour.

I do not have visibility into Microsoft’s internal implementation.

The externally verifiable finding is simpler:

Entra can determine that the user’s current session should not continue, while Outlook Mobile can continue receiving new Exchange Online mailbox data.


Responsible Disclosure

I reported the issue to the Microsoft Security Response Center (MSRC) on 26 April 2026.

The report included:

  • Detailed reproduction steps.
  • Conditional Access evidence.
  • Interactive and non-interactive sign-in analysis.
  • Cross-application testing.
  • Cross-tenant reproduction.
  • Screen recordings.
  • Screenshots.
  • Outlook Mobile diagnostic data.
  • Testing beyond the expected access-token lifetime.
  • Explicit session revocation testing.

Timeline

Date Event
26 April 2026 Initial report submitted to MSRC
27 April 2026 Additional KQL detection and hunting queries supplied
27 April 2026 Two-part video PoC uploaded
28 April 2026 Additional testing demonstrated inconsistent prompts and CAE logging
28 April 2026 Observed cases where logs showed access blocked while Outlook remained functional
28 April 2026 Confirmed issue appeared specific to Outlook Mobile after comparison testing
29 April 2026 Confirmed Teams and Azure Portal correctly enforced the same location policy
7 May 2026 MSRC confirmed engineering investigation was ongoing
15 May 2026 MSRC again confirmed engineering investigation
2 June 2026 Microsoft stated they had not yet reproduced the CAE trigger scenario
3 June 2026 Clarified that the issue included new email received after the CAE trigger, not only cached messages
9 June 2026 Further Outlook diagnostics, screenshots and video PoC supplied
18 June 2026 Asked whether any further evidence was required
26 June 2026 Requested an update
2 July 2026 Requested an update after almost one month without response to the additional PoC
3 July 2026 Advised Microsoft of intended disclosure after the 90-day CVD period
25 July 2026 90 days from original report
28 July 2026 Asked whether Microsoft was still actively investigating the issue
31 July 2026 Microsoft apologised for the lack of updates
7 August 2026 Asked for expected timeline for next update
26 August 2026 Requested another update
28 August 2026 MSRC closed the case as Moderate severity and below the bar for immediate servicing

Four months.


Microsoft’s Response

On 28 August 2026, MSRC closed the case.

The key part of the response was:

After careful review, this case was assessed as moderate severity and is below Microsoft’s threshold for immediate servicing. This is due to the requirement of requiring prior access to the accounts.

Microsoft confirmed that the issue had been assessed as Moderate severity.

No CVE will be issued. No bounty is payable. MSRC will no longer track the issue.

The report has instead been shared with the responsible engineering team for awareness and internal review.

Microsoft also offered recognition through the MSRC Special Mentions programme.


“Requires Prior Access”

This is where I fundamentally disagree with Microsoft’s reasoning.

The requirement for prior authorised access is not a mitigating precondition of this issue.

It is the entire purpose of Continuous Access Evaluation.

CAE exists to evaluate what happens when a previously authorised session no longer satisfies the conditions under which access was granted.

Without prior access there is no continuous session to evaluate.

Consider the logic:

flowchart TD A[User has authorised access] --> B[Security conditions change] B --> C[Previously authorised access is no longer permitted] C --> D[CAE should interrupt continued access] D --> E[Reauthentication required]

Saying that a CAE enforcement failure has reduced impact because the attacker requires prior access is rather like saying session revocation is less important because a session must exist before you can revoke it.

Of course it does - that’s the whole point.

The security question is not:

Did this user once have permission to access the mailbox?

The security question is:

Can that user continue accessing the mailbox after the identity platform has determined that the conditions permitting that access are no longer satisfied?

In my testing, the answer for Outlook Mobile was yes.

Or, to put it another way:

flowchart LR A[Prior authorised access] --> B[Exactly the state CAE is designed to re-evaluate]

Prior access is precisely the point.


Why Should You Care?

Modern identity security increasingly assumes that authorisation is dynamic.

Zero Trust architectures are built around the idea that access is not permanently trusted simply because authentication happened once.

We evaluate:

  • User identity.
  • Device state.
  • Network location.
  • Risk.
  • Session state.
  • Authentication strength.
  • Organisational policy.

And we keep evaluating those things.

That is exactly what makes CAE valuable.

But a security decision is only useful if it reaches the resource being protected.

flowchart LR A[Identity policy decision<br/>BLOCK] --> B[Token / session layer] B --> C[Service intermediary] C --> D[Protected resource] style A stroke-width:3px

Every component in that chain has to preserve the decision.

If one downstream component continues honouring the previous security state, the practical result is:

Entra: NO

Outlook: ¯\_(ツ)_/¯

The identity control becomes advisory rather than authoritative.


Revocation Is An Incident Response Control

This becomes even more important during incident response. Suppose a SOC believes a user’s account or mobile device has been compromised. One of the first containment actions will often be to revoke active sessions.

The administrator performing that action is making a security decision:

this existing access should stop.

They are not asking whether the attacker originally authenticated legitimately. They are explicitly invalidating previously legitimate access because it is no longer trusted.

If Outlook Mobile can continue accessing new mailbox data after that decision, the problem is not authentication.

It is enforcement.

And enforcement failures are particularly dangerous because they create false assurance. The portal tells the administrator that access has been revoked. Conditional Access tells them the new location is blocked. The sign-in logs tell them authentication failed.

Meanwhile:

You’ve got mail.


Why Backend Access Matters

The non-interactive sign-ins observed during testing are perhaps the most interesting part of this issue.

Modern mobile services frequently use cloud-hosted intermediary infrastructure.

There are perfectly legitimate architectural reasons for doing this.

It can improve:

  • Push notifications.
  • Synchronisation.
  • Battery usage.
  • Performance.
  • Reliability.

But introducing an intermediary also introduces another trust relationship.

The security state of the original user session must remain attached to any downstream activity performed on that user’s behalf.

Otherwise the architecture risks accidentally transforming:

flowchart LR A[User in blocked location<br/>Session no longer satisfies policy] --> B[Microsoft-hosted intermediary] B --> C[Service appears from trusted Microsoft infrastructure]

The backend service may be trusted. The user’s session no longer is. Those are not equivalent security states.


Secure By Design Means Following The Decision

There is a broader lesson here.

Modern security architectures contain enormous amounts of machinery dedicated to making access decisions.

Identity Protection evaluates risk. Conditional Access evaluates policy. CAE reacts to changing conditions. Session revocation provides containment. Authentication Context adds further policy boundaries.

Eventually all of that machinery produces something remarkably simple:

YES

or:

NO

The protected resource has to honour that decision.

Every hop. Every proxy. Every intermediary. Every service-to-service token exchange. Every on-behalf-of flow. Every synchronisation service.

Because the weakest enforcement point defines the real boundary.

flowchart TD A[Identity decision] --> B[Token / session] B --> C[Client] C --> D[Intermediary service] D --> E[Protected resource] A -. must remain authoritative through every hop .-> E

Mitigations

There are unfortunately limited customer-side mitigations for a service-side session enforcement issue.

However, there are still some things worth considering.

Do Not Treat Session Revocation As Instant Containment

During a suspected mailbox compromise, do not assume that selecting Sign out everywhere means every Microsoft service immediately stops processing activity associated with the user’s existing sessions.

Validate the effect.

Monitor Mailbox Activity

Use Exchange Online and identity telemetry to look for activity continuing after session revocation or Conditional Access failure events.

Correlate Interactive And Non-Interactive Sign-ins

Look for users experiencing interactive Conditional Access failures while associated non-interactive activity remains successful.

Particularly interesting cases include differing geographic contexts between the two.

Use Multiple Containment Controls

During active compromise, consider broader containment actions appropriate to your environment rather than relying solely on session revocation.

The important operational lesson is simple:

revocation should be verified, not assumed.


Responsible Disclosure Is A Two-Party Protocol

I have reported a number of security issues to Microsoft. I continue to believe responsible disclosure is usually the right thing to do. Researchers should give vendors reasonable time to investigate. We should provide reproducible evidence. We should avoid unnecessarily exposing customers while remediation is possible.

We should answer questions. We should test hypotheses. We should behave responsibly.

But coordinated disclosure requires coordination.

This report was submitted on 26 April 2026.

Over the following four months I supplied logs, queries, screenshots, video, diagnostics, comparative tests, multiple tenant reproductions and clarification that this involved new server-side mailbox content rather than merely cached email.

There were also extended periods where I received no substantive update until I asked again.

And again.

And again.

The eventual rationale for closure was that exploitation requires prior account access.

That rationale does not address the security property being tested. Prior authorised access is precisely the thing CAE exists to continuously evaluate.

Responsible disclosure cannot simply mean that researchers provide vendors with indefinite confidentiality while vendors decide whether an issue reaches an internal servicing threshold.

Responsibility exists on both sides of the protocol.


Closing Thoughts

This issue is not about whether Outlook can display cached email offline.It is not about whether an access token remains valid for another few minutes. And it is not about an unauthenticated attacker magically obtaining someone’s mailbox.

It is about something much simpler.

A user has access.

The circumstances under which that access was granted change.

Conditional Access determines that the user should no longer have access.

The session is explicitly revoked.

Outlook Mobile continues receiving mailbox data anyway.

That is precisely the scenario Continuous Access Evaluation exists to handle.

Microsoft assessed the issue as a Moderate-severity vulnerability but chose not to service it through MSRC because exploitation requires prior access. I think that reasoning misses the point.

Because prior access is precisely the point.

If a previously authorised session cannot be reliably stopped when it becomes unauthorised, the problem is not how the session started.

The problem is that it didn’t end.


As ever, thanks for reading and feel free to leave comments down below!

comments powered by Disqus