Auditing OAuth Integrations After the Icarus Group’s Breach of Klue

Auditing OAuth Integrations After the Icarus Group’s Breach of Klue

pr0h0
oauthcybersecuritysaas-securityincident-response
AI Usage (80%)

The useful lesson from the Klue report is not “OAuth is bad.” It is that OAuth turns a third-party app into a standing API principal, and that principal often outlives the login event that created it.

BleepingComputer’s report says Klue had an OAuth-related breach, the victim list was growing, and a group calling itself Icarus had claimed the attack. That is enough to take seriously. It is not enough to fill in the blanks with confidence. If you run SaaS integrations, the safe move is to audit every delegated grant as if it were production access.

What the public reporting actually establishes

The reported facts: a Klue OAuth breach, a growing victim list, and an attack claim from Icarus Group

From the public reporting, I would treat only three things as established:

  • the incident is being described as an OAuth breach at Klue
  • the list of victims or affected parties is reportedly growing
  • the alleged attackers are claiming the incident through the Icarus Group name

That is the factual floor. Everything else — initial access path, dwell time, exact scope, and whether the claim matches the real operator — still needs proof.

What is not confirmed in the source material and should stay labeled as unverified

What I would not assume from the report alone:

  • that OAuth consent was the initial compromise vector
  • that the attacker only abused one app, rather than chaining several
  • that the breach was limited to read-only access
  • that revoking a user session would have stopped the activity
  • that the claim from Icarus Group is necessarily true

That uncertainty matters because a lot of teams hear “OAuth breach” and immediately think “password problem.” It usually is not one.

Why that uncertainty matters before you map the incident to your own stack

If you misread the incident, you will fix the wrong layer.

A password reset helps if the attacker only had interactive login. It does very little if the attacker has:

  • a refresh token
  • an admin-consented app grant
  • a service principal with API permissions
  • a mailbox or file scope that stays valid outside the browser

That is the real question for your own environment: what delegated authority still exists after the login event ends?

Why OAuth incidents spread farther than a normal login compromise

Tokens, consent grants, and refresh access outlive a password change

OAuth does not just say “this user signed in.” It says “this app may act on the user’s behalf, within these scopes, until the grant is revoked or expires.”

That creates three separate objects to keep straight:

ObjectWhat it meansWhy it matters
Access tokenShort-lived API credentialEasy to dismiss because it expires quickly
Refresh tokenCan mint new access tokensCan keep access alive after a password change
Consent grantDelegated permission recordMay outlive the original user session entirely

If your response plan only handles the user account, you miss the standing permission.

The real trust boundary is the connected app, not just the browser session

A browser session is only one way to reach the app. The connected app itself is where the privilege usually lives.

That is why OAuth incidents feel odd in review:

  • there may be no repeated failed password logins
  • the attacker may use the API directly
  • normal MFA prompts may never fire
  • activity can look like legitimate app traffic

In other words, the attack can be “authenticated” the whole time.

How one integration can expose multiple downstream SaaS systems

One grant often opens more than one door.

A single connected app may have permissions to:

  • read files from a document system
  • read or send mail
  • pull CRM records
  • create tickets
  • query customer or employee data
  • call other internal APIs via a backend token exchange

If the integration is trusted across a platform, compromise of that app can become a bridge into several SaaS systems at once.

Reconstructing the likely attack path without overclaiming

The most plausible entry points: malicious consent, stolen tokens, or abused app credentials

Without the vendor’s incident details, I would treat three paths as plausible:

  1. Malicious consent

    • a user or admin was tricked into approving a broad app
    • the app then kept access through valid tokens
  2. Stolen tokens

    • the attacker obtained access or refresh tokens from logs, endpoints, or a compromised host
    • the app was never “hacked” in the browser sense; its credentials were simply reused
  3. Abused app credentials

    • a client secret, certificate, or service account was exposed
    • the attacker used the app as designed, just from the wrong place

I am not saying any one of those happened at Klue. I am saying they are the cases your audit needs to test.

How an attacker can move from one integration to broader API access

A typical chain looks like this:

  1. gain one OAuth grant
  2. enumerate what the app can read or write
  3. use the app’s token to pull data
  4. look for adjacent permissions or privileged resources
  5. pivot into a second SaaS system if the app has cross-system trust

That is why these incidents often end up looking larger than the original click or token theft. The app becomes the pivot point.

Why these incidents are often detected late because nothing looks like a classic interactive login failure

OAuth abuse often leaves no obvious user-facing failure.

You may see:

  • successful API calls from unusual IPs
  • service-principal activity at odd times
  • unusual mail export volume
  • document access without a browser session
  • app activity from a geography no employee visits

You may not see:

  • a password reset event
  • an MFA bypass alert
  • a failed interactive login storm

That delay is common because the attacker is using valid delegated access, not breaking in through the front door.

Inventory every OAuth integration before you trust any of them

Build a complete list of connected apps, service accounts, and enterprise consent grants

Start with inventory, not response.

You want one list that includes:

  • first-party apps
  • vendor-managed integrations
  • employee-installed apps
  • admin-consented enterprise apps
  • service accounts and machine-to-machine clients

If you cannot answer “what apps can act for us?”, you cannot answer “what was exposed?”

A practical first pass is to export grants from your identity provider and compare them with the integrations your business still supports.

list-oauth-grants.sh
# Microsoft Graph example: list delegated permission grants
curl -sS -H "Authorization: Bearer $TOKEN" "https://graph.microsoft.com/v1.0/oauth2PermissionGrants?$select=clientId,resourceId,consentType,scope"

## Then compare clientId values to the apps your team still uses.
## Look for grants that no longer match a supported vendor or internal app.

Map each integration to the data it can read, write, or delete

Do not stop at vendor names. Map the actual authority.

IntegrationScope classWhat to verify
Internal productivity appRead/writeCan it modify records or only read them?
Mail/calendar connectorBroad mailbox accessCan it search, export, or send mail?
File sync appFiles and foldersCan it enumerate shared drives or only one folder?
CRM integrationCustomer dataCan it write notes, close deals, or export leads?

If the app can delete, send, or reconfigure data, treat it like production access.

Separate first-party apps from vendor-managed and employee-installed apps

These buckets fail differently.

  • First-party apps usually need internal code review and secret handling
  • Vendor-managed apps need contractual and technical review of scopes
  • Employee-installed apps are the most likely to drift into permission sprawl

The last group is often where “just a productivity shortcut” becomes a durable trust edge.

Audit the permissions, not just the vendor name

Review requested scopes and flag any broad offline or mailbox-style access

The first thing I look for is scope shape.

Red flags include:

  • offline_access
  • broad mailbox access
  • full-drive read/write
  • tenant-wide admin permissions
  • directory read plus write privileges

Broad scopes are not automatically malicious. They are often just lazy design. But lazy design is still blast radius.

Check whether the integration uses user consent, admin consent, or both

This matters because the approval path changes the risk.

  • User consent can be abused by a single compromised account
  • Admin consent can grant tenant-wide power
  • Both means user grants may quietly expand into privileged workflow later

If an app starts with user consent and later receives admin consent, re-evaluate it. The trust model changed.

Look for privileges that outlast the original business need

A lot of grants remain because nobody owns cleanup.

Ask:

  • Is this app still supported?
  • Does it still need the same scopes?
  • Did the original project end?
  • Did the vendor change the integration’s behavior?
  • Is a stale grant still holding access to production data?

If the answer is “maybe,” revoke it until someone proves the need.

Confirm whether tokens can be refreshed silently and for how long

This is the question that most incident summaries skip.

If refresh is possible without user interaction, then a single stolen token may become a long-lived foothold. If the platform allows persistent refresh and the app keeps a valid client credential, revocation policy matters more than login hygiene.

I would specifically verify:

  • refresh-token lifetime
  • whether re-authentication is enforced
  • whether secret rotation invalidates old tokens
  • what actually happens on grant revocation

Practical checks you can run in an admin console or with API calls

Export consent grants and compare them to the apps your team still supports

Do the boring thing first: export and diff.

You are looking for grants where:

  • the app is no longer in your approved catalog
  • the owner left the company
  • the scope is broader than the current use case
  • the app has not been active in months

A stale grant with valid tokens is not a harmless artifact. It is standing access.

Look for inactive apps that still hold valid tokens

Inactive apps are especially suspicious because they often survive by accident.

A useful triage rule:

  • active app + expected scope: review normally
  • inactive app + valid scope: investigate
  • inactive app + broad scope: revoke fast unless a business owner proves otherwise

Search logs for unusual token use, new geographies, or unexpected API volume

The log patterns to check are boring but effective:

  • token use from a new country or ASN
  • access at unusual hours
  • sudden enumeration of mailboxes or files
  • spikes in API calls from one client ID
  • access after a user left the company

The point is not to catch every attacker. The point is to find the app that should not be talking this much.

Verify whether revoked access actually kills active refresh tokens

Do not assume revocation works the way you want.

Test this in a safe environment:

  1. authorize a non-production app
  2. obtain a token
  3. revoke the grant
  4. retry the API call and refresh flow
  5. confirm what still works and for how long

If revocation is incomplete, adjust your incident playbook. Some platforms invalidate immediately; others leave windows you need to understand.

What to look for in a real incident response review

Which resources were exposed through the integration path

Start with data, not identity.

For every abused app, answer:

  • what system did it reach
  • what records were read
  • what objects were changed
  • whether exports occurred
  • whether downstream systems were reachable through the same principal

Whether the attacker only read data or could also change records, send messages, or create new access

Read-only theft is serious. Write capability is worse.

If the app could:

  • send mail
  • create accounts
  • modify records
  • add webhooks
  • grant more access

then the incident is no longer just a leak. It is a platform control problem.

How long access likely persisted before revocation or detection

Your timeline should include:

  • grant creation date
  • first suspicious use
  • peak activity window
  • revocation time
  • recovery actions

That gives you exposure duration, which is what the business actually cares about.

What evidence to preserve before rotating keys and deleting artifacts

Rotate credentials, yes. But preserve evidence first:

  • consent records
  • token issuance logs
  • service-principal sign-ins
  • API audit logs
  • affected resource snapshots

If you wipe the artifacts first, you lose the chance to answer what happened.

Fixes that reduce OAuth blast radius in practice

Minimize scopes and refuse broad default permissions

If the app only needs calendar lookup, it should not ask for mailbox-wide access.

The posture I recommend is simple:

  • ask for the smallest scope that works
  • reject scopes that are “future proofing”
  • force vendor justification for broad permissions

Use short-lived access tokens and tightly controlled refresh-token policies

Short-lived access tokens are good, but only if refresh is also constrained.

Controls that help:

  • shorter refresh lifetimes for risky apps
  • re-authentication after sensitive scope changes
  • secret rotation that actually invalidates old credentials
  • token binding or sender-constrained tokens where available

Require re-consent after meaningful scope changes

If the app adds new power, the old approval should not silently cover it.

A scope upgrade should trigger:

  • a new consent review
  • owner notification
  • admin approval for high-risk permissions
  • audit logging of who approved the change

Put risky apps behind allowlists and admin approval

Do not let every employee approve every connector.

For high-value systems, require:

  • approved vendor list
  • admin consent only
  • periodic access review
  • business owner signoff

That slows the sprawl, which is the point.

Revoke stale grants automatically instead of leaving them to drift

The safest stale grant is the one that no longer exists.

If an app has not been used for 90 days, or the vendor is no longer in service, remove it. Manual cleanup never keeps up with SaaS drift.

The defensive position I would take after this breach

Treat every third-party integration as production access, not a convenience feature

That is the mindset shift.

A connected app is not a UI shortcut. It is an identity with delegated power. If you would not give a contractor a direct API key to production, do not hand the same authority to a “helpful” SaaS connector without review.

Prioritize revocation and scope reduction over pure alerting

Alerting is useful, but it is not enough.

If the grant is too broad, the right answer is to remove it. If the app is stale, kill it. If the scope is vague, shrink it. Detection should support containment, not replace it.

Accept that OAuth security fails at the edges where vendor trust, user consent, and API permissions meet

That is where these incidents live.

Not in the login screen. Not in the password policy. In the edge where a user, an admin, and a vendor app all trust each other a little too much.

Further reading and verification points

Link back to the original report and any official vendor or platform documentation you used

Add OAuth and token-management references that let readers verify the audit steps themselves

If you want to validate your own environment, start with these checks:

  • enumerate every consent grant
  • map scopes to real data access
  • identify stale or unsupported integrations
  • test revocation behavior in a non-production tenant
  • review logs for token use, not just login events

That is the audit I would run first.

Share this post

More posts

Comments