Cloud Security Office Hours Banner

Okta Support System 2023

Step-by-step kill chain mapped to MITRE ATT&CK Cloud, sourced from official post-mortems and primary technical analyses.

September-October 2023 Critical Identity Provider

Okta Support System - Credential Saved to a Personal Google Profile → Support Case System → HAR Files Full of Session Tokens → Customer Sessions Hijacked

Between September 28 and October 17, 2023 an attacker had access to Okta's customer support case management system. The root cause Okta published is uncomfortably ordinary: an employee signed into their personal Google profile in Chrome on an Okta-managed laptop, Chrome saved a service account's username and password into that personal Google account, and the attacker obtained them when the personal account or device was compromised. The support system held HAR files - browser network traces that customers upload for troubleshooting, and which routinely contain live session tokens. The actor used those tokens to hijack legitimate Okta sessions at five customers. Files belonging to 134 customers were accessed. Detection came entirely from the customers. 1Password reported suspicious activity on September 29, BeyondTrust supplied the attacker IP on October 13, and Cloudflare detected and disclosed independently - while Okta's own investigation was blinded for fourteen days by a logging gap it later documented in detail.

19 days of access: September 28 to October 17, 2023
134 customers had files accessed; 5 had sessions hijacked
14 days lost to a logging gap during Okta's own investigation
Detected by: customers, not by Okta
📄 Okta Security - Root cause and remediation ↗ 📄 Cloudflare - How we mitigated another Okta compromise ↗
Initial Access - Chrome Saved a Service Account to a Personal Google Profile
01
An employee signed into a personal Google profile in Chrome on a managed laptop, and the browser synced a saved service account credential into that personal account
T1555.003 - Credentials from Web Browsers T1078 - Valid Accounts

Nobody did anything that felt wrong. The laptop was managed. The employee signed into their personal Google profile in Chrome, which is a thing hundreds of millions of people do daily. Chrome offered to save a password, as it always does, and synced it to the profile that was signed in - the personal one. From that moment a service account credential belonging to Okta lived in a consumer Google account outside Okta's control, subject to whatever security that individual's personal account and personal devices happened to have. Okta's own assessment is that the most likely exposure route was compromise of that personal account or device. This is shadow IT in miniature: the boundary was not crossed by a policy violation but by a browser feature doing exactly what it is designed to do.

Device: An Okta-managed laptop - not an unmanaged personal machine
Action: Employee signs into a personal Google profile in Chrome
Mechanism: Chrome saves and syncs the service account credential to the personal account
Okta's assessment: Most likely exposure was compromise of that personal account or device
Notable: No policy was knowingly broken; a browser feature worked as designed
Browser SyncPersonal ProfileService AccountT1555.003
🗂 Collection - A Support System Full of Other People's Session Tokens
02
The compromised service account could read the customer support case management system, where customers upload HAR files that routinely embed live session tokens
T1213 - Data from Information Repositories T1539 - Steal Web Session Cookie

A HAR file is a complete recording of a browser's network activity - every request, every response, every header. Support engineers ask for them because they are the fastest way to diagnose a login or federation problem, and customers produce them willingly. They also, by construction, contain whatever was in those headers, which for an authenticated troubleshooting session means live session tokens. So the support system of an identity provider quietly became an aggregation point for working credentials belonging to its customers, with none of the protection those customers applied to credentials they knew they had. Almost nobody on either side of a support ticket thinks of an attachment as a credential store, and that is precisely the gap.

Artifact: HAR files - full browser network traces uploaded for troubleshooting
Contents: Every request and response header, including live session tokens
Why they exist: The fastest way to diagnose a login or federation problem
Effect: A support system becomes an aggregation point for customers' working credentials
Blind spot: Nobody treats a support attachment as a credential store
HAR FilesSession TokensSupport ToolingT1539
🎫 Lateral Movement - Replaying Tokens Into Customer Tenants
03
Session tokens extracted from the HAR files were replayed to hijack legitimate Okta sessions at five customers, bypassing authentication entirely
T1550.004 - Use Alternate Authentication Material: Web Session Cookie

A session token is proof that authentication already happened, so replaying one skips the entire login path. No password, no MFA prompt, no sign-in event that looks like an attack - the session simply continues, and from the application's perspective the legitimate user is still working. This is the same property that made Storm-0558 and the Entra ID Actor token flaw so hard to detect, arriving here without any cryptography being broken: the tokens were simply lying in files people had uploaded voluntarily. Files belonging to 134 customers were accessed, and five had sessions hijacked - a conversion rate that reflects token lifetime more than anything else, since only tokens still valid when the attacker got to them were useful.

Technique: Replay a stolen session token; authentication has already happened
Bypassed: Password, MFA, and any sign-in-based detection
Files accessed: Belonging to 134 customers (under 1% of Okta's base)
Sessions hijacked: 5 customers
What limited it: Token lifetime - only still-valid tokens were useful
Token ReplayMFA BypassSession HijackT1550.004
🕳 Defense Evasion - A Logging Gap That Hid Fourteen Days
04
Okta's investigation was blinded for two weeks because opening a file from the Files tab generated a different log event than opening it from within a case
T1562.008 - Impair Defenses: Disable or Modify Cloud Logs

This is the most transferable detail in the whole incident, and Okta deserves credit for publishing it. Their support system logged file access differently depending on how a user reached the file: opening an attachment from within a support case produced one event type, while navigating directly to the Files tab produced an entirely different one. Okta's investigation queried case access, so the attacker's direct file downloads simply were not in the results, and for fourteen days the reasonable conclusion from the available evidence was that nothing had happened. The gap closed only when BeyondTrust handed over a suspicious IP address on October 13 that could be searched for directly. The general lesson is that "we have logs" and "our queries would surface this behaviour" are different claims, and the difference is usually only discovered during an incident.

The gap: File opened from within a case logs a different event than the same file from the Files tab
Consequence: Investigation queried case access; direct downloads did not appear
Cost: 14 days during which the evidence supported "nothing happened"
What broke it: A suspicious IP address supplied by BeyondTrust on October 13
Lesson: "We have logs" and "our queries would find this" are different claims
Logging GapEvent Type MismatchInvestigation Blind SpotT1562.008
📣 Detection - Three Customers Found It Before the Vendor Did
05
1Password reported suspicious activity on September 29, BeyondTrust supplied the attacker IP on October 13, and Cloudflare detected and published independently

The sequence matters. 1Password saw something wrong the day after access began and told Okta. BeyondTrust detected the token replay against its own tenant, escalated, and eventually provided the IP address that unblocked the investigation. Cloudflare detected it independently and published its own account. In each case a customer's monitoring of its own identity provider caught what the identity provider did not, which is an uncomfortable but genuinely actionable finding: your vendor's detection capability is not a substitute for your own, particularly for the vendor that sits at the centre of your access model. All three companies also published detailed public write-ups, and that transparency is why this incident is teachable at all.

September 29: 1Password reports suspicious activity - one day after access began
October 13: BeyondTrust provides the attacker IP that unblocks Okta's investigation
Independently: Cloudflare detects and publishes its own account
Pattern: Customers monitoring their own IdP caught what the IdP did not
Why we can learn from it: All three published detailed public write-ups
Customer Detection1PasswordBeyondTrustCloudflare
🛠 Response - Kill the Account, Kill the Browser Profile
06
Okta disabled the service account, blocked personal Google profiles in Chrome Enterprise on managed laptops, added support-system monitoring, and shipped network-based session token binding as a product feature

The remediation list is worth reading as a template because it addresses four different layers rather than just the immediate hole. The compromised service account was disabled. Personal Google profile sign-in was blocked via Chrome Enterprise policy on managed laptops, which closes the root cause structurally rather than by asking people to be careful. Detection and monitoring for the support system were improved, addressing the logging gap. And session token binding to network location was released as a product feature, which attacks the underlying problem: a bound token cannot be replayed from the attacker's network even if it leaks. That last one is the durable fix, because HAR files will keep containing tokens no matter what anyone asks customers to do.

Immediate: Disable the compromised service account
Root cause: Block personal Google profile sign-in via Chrome Enterprise policy on managed devices
Visibility: Enhanced detection and monitoring for the support system
Durable: Session token binding to network location, shipped as a product feature
Why the last one matters most: A bound token is useless from the attacker's network
Chrome Enterprise PolicyToken BindingStructural Fix

🛡 How to Defend Against This Chain

Sanitize HAR files before you upload them, and assume nobody else will. If your vendor asks for a browser trace, strip the tokens first - there are open-source HAR sanitizers, and the browser's own export includes everything by default. Then invalidate the session you captured it from. Treat any file containing full request headers as a credential dump for handling purposes, because that is exactly what it is.
Bind session tokens so a stolen one is useless elsewhere. The token replay only worked because a session token was portable. Where your identity provider offers it, enable binding to network location or device, and shorten session lifetimes for privileged roles so leaked tokens expire before they can be used. Okta shipped exactly this feature in response; the general principle applies to every session-issuing system you run.
Block personal browser profiles on managed devices with policy, not with training. The root cause was Chrome syncing a saved credential into a personal Google account. Chrome Enterprise policy can restrict sign-in to your organization's accounts, and equivalent controls exist for other browsers. Pair it with disabling the browser password manager for corporate credentials entirely and requiring an enterprise password manager - the failure here was a default behaviour, so the fix has to be a configuration rather than a request.
Monitor your identity provider yourself; your vendor's detection is not yours. Three customers found this before Okta did. Ingest your IdP's system logs into your own SIEM, alert on administrative actions, impossible-travel sessions, and privileged sessions from unfamiliar addresses, and specifically alert on sessions that appear without a corresponding authentication event - the signature of exactly this attack.
Test whether your logs actually answer the questions an investigation will ask. The fourteen-day gap came from two paths to the same file generating different event types. Before an incident, take real questions - who accessed this file, who read this record, who exported this data - and confirm your telemetry answers them regardless of which interface was used. Run that as a tabletop against your own logs; the gaps are rarely where you expect.
Treat vendor support systems as part of your attack surface. This one held live session tokens for hundreds of customers. Ask vendors what support artifacts they retain, for how long, who can read them, and how access is logged - then minimize what you send. The support ticket is a channel through which your credentials leave your control, and almost nobody governs it.

Related defense topics