Save Your Spot

Blog
/
Browser-based attacks

Device code phishing attacks have skyrocketed: here’s what you need to know

Device code phishing is an account takeover technique that abuses the OAuth 2.0 Device Authorization Grant to steal access tokens while bypassing standard access controls (like passwords, MFA, and even passkeys).

The OAuth 2.0 device authorization grant was designed to enable input-constrained devices to sign-in to apps by asking the user to complete the login on a separate device by entering a code. But today, it’s mainly used when accessing CLI tools, meaning that many users encounter the device code flow daily. 

Device code phishing attacks designed to exploit this authorization flow are not new — it was among the first techniques that we added to the SaaS attacks matrix back in 2023. But it’s taken until now for it to really enter mainstream adoption. 

The technique tricks a user into issuing access tokens for an attacker-controlled application (not a device, confusingly). Any app that supports device code logins can be a target. Popular examples include Microsoft, Google, Salesforce, GitHub, and AWS. That said, Microsoft is, as always, much more heavily targeted at scale now than any other app.

At the start of March, we’d observed a 15x increase in device code phishing pages detected by our research team this year, with multiple kits and campaigns being tracked — with the kit now identified as EvilTokens the most prominent. That figure has now risen to 37.5x. More on that later.

We’ve always been surprised that attackers haven’t commonly used device code phishing in their standard toolkit, preferring session-stealing AITM phishing and other social engineering attacks like ClickFix. But it’s pretty clear from the recent data that the shift to mainstream adoption has now happened. 

In this blog post, we’ll explore the history of device code phishing, what’s changed for it to enter mainstream adoption, how it works under the hood (with recent examples), and what security teams can do about it. 


A brief history of device code phishing

Device code phishing evolution 2019-2026.
Device code phishing evolution 2019-2026.

The technique was first documented in 2020, before Secureworks released the first tooling framework PhishInSuits a year later. A host of research followed, including SquarePhish v1 (using QR codes to trigger the 15 minute code expiration window), Dirk-Jan Mollema’s key research (chaining device code phishing via Microsoft apps into Primary Refresh Token (PRT) acquisition to gain full browser-level access) and Dennis Kniep’s DeviceCodePhishing tool which automates the entire flow with a headless browser. (Other recent noteworthy tools include SquarePhish2 and GitPhish, so shout out to those too). 

It wasn’t until August 2024 that in-the-wild exploitation was first identified, with Russia-linked campaigns then continuing into 2025 before entering mainstream criminal adoption. This trend has continued to gather momentum in 2026 with EvilTokens, the first reported criminal PhaaS kit for device code phishing, already powering massive campaigns after launching in February. 

PhaaS is key to the adoption of new phishing tools and techniques, providing broad access to criminal operators at scale while driving up execution standards. It has been central to the continued evolution of AITM and ClickFix, and is a strong indicator of what comes next for device code phishing.

Some of the noteworthy in-the-wild campaigns include:

  • Storm-2372, tracked by Microsoft and Volexity, linked to multiple Russia-aligned clusters, combining spear-phishing and social engineering with device code phishing payloads against strategic intelligence targets.

  • The massive Salesforce campaign operated by Scattered Lapsus$ Hunters (SLH) combined vishing with a device code phishing payload targeting Salesforce. The attacks morphed into a broader supply chain campaign using stolen credentials, ultimately resulting in 1000+ organizations being compromised and over 1.5 billion stolen records claimed. 

  • A massive spike in activity in late 2025 and 2026. This includes multiple threat clusters tracked using device code phishing techniques, more criminal operations linked to SLH, and hundreds of organizations being targeted via PhaaS architecture, which looks to be the same campaign as the recently uncovered EvilTokens PhaaS reported by Huntress (featuring abuse of the Railway PaaS platform). Abnormal has also reported on a closed-source PhaaS kit called Venom that offers device code phishing capabilities that appear visually and functionally similar to EvilTokens.   


What we’re seeing in the wild

As mentioned, we’ve also seen a huge spike in device code phishing activity this year, with multiple kits, page designs, and lure types. We’ve identified 10 distinct kits in circulation in the wild, with EvilTokens being the most prevalent. It’s clear that attackers are both spinning up their own kits and creative derivatives of others — we’ve seen kits that are visually similar to EvilTokens (close enough to be clones or forks) but with very different backends, for example AWS, Digital Ocean, 2cloud, and more. 

Since EvilTokens is the only one with public attribution, the names provided are internal codenames. The information per kit is by no means exhaustive and is likely to evolve over time. 


“ANTIBOT” (EvilTokens)

Huntress, Sekoia, and researcher Paul Newton have already done a great job of providing IOCs for the recent EvilTokens activity spike, including multiple backend Railway IPs in authentication events. 

Our codename for EvilTokens internally was derived from the overly descriptive page code describing its bot protection capabilities (a clear sign of vibe coding — thanks Claude!):

<!-- FIXED ANTI-BOT SYSTEM - WON'T REDIRECT REAL USERS -->

<!-- ENHANCED ANTI-BOT SYSTEM WITH SERVER-SIDE VALIDATION -->

Beyond the most widely observed implementation featuring a Cloudflare Workers frontend and Railway backend for authentication, we’ve also tracked additional versions of EvilTokens in circulation since January 2026 (many of which remain live along with the current “production” version of the kit). 

You can see an evolution of the kit in the videos and screenshots below, from early precursors seen in mid-January, the first mentions of ANTIBOT in the page code in late-January, the parallel development of a “Courts Access” fork that lacks the ANTIBOT references, and finally production EvilTokens in February. One of the key threads between the versions is the presence of a generateFallbackCode() JS function and use of a /generate-codes API call. 

Early implementations were quite different, for example using ScrapingBee to generate the displayed code, and varied hosting on vercel, fastly, edgeone, and others. 

After initially appearing on custom domains, the production version is now predominantly hosted on Cloudflare Workers, as per the broader tracking of the campaign. The descriptive HTML comments around ANTIBOT functions have also been removed in later versions. 

The production version of EvilTokens showcases common detection evasion techniques we've come to associate with PhaaS kits in the AiTM space — using multiple redirects through trusted sites before serving the malicious page, using bot protection to block security tools from analysing the page, and so on. It also uses a pop-up window for the device code entry rather than a redirect, reducing the friction for the victim (it looks pretty convincing, too).

Precursor A (Left) & B (Right): Different visual lures from January 2026.
Precursor A (Left) & B (Right): Different visual lures from January 2026.
Early ANTIBOT: First appearance of the ANTIBOT comments, mid-Jan.
Early ANTIBOT: First appearance of the ANTIBOT comments, late-Jan.
"Courts Access" lure with a similar security verification to Early ANTIBOT.
"Courts Access" lure with a similar security verification to Early ANTIBOT.
Production ANTIBOT: Current EvilTokens implementation.
Production ANTIBOT: Current EvilTokens implementation.

Frontend infrastructure

Workers.dev, vercel.app, github.io, fastly.net, edgeone.dev

Backend infrastructure

Example IP: (V3) 162.220.232.71 (Railway AS400940) (V2) 71.11.42.193 (V1) 72.218.25.107

Backend User Agent: (V3) node, (V2), Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683 Safari/537.36 OPR/57.0.3098.91 (V1) Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 OPR/56.0.3051.52 

Network paths

/api/rate-limit

/api/fingerprint 

/api/captcha-verify

/api/init /api/generate-code

/api/check-auth

Lure themes

Various MS lures (e.g. Outlook, SharePoint, Teams) DocuSign, Adobe

Example Domain

Precursor A: teams-zpfvwnpxuc[.]edgeone.dev

Precursor B: authenticate-m365-accountsecurity-m-pi[.]vercel.app

Courts Access: secure-systems-validations-courts[.]vercel.app

Early ANTIBOT: interface-auth-en-useast[.]global.ssl.fastly.net

Production ANTIBOT: index-z059-document-pending-reviewsign-xlss7994824[.]awalizer[.]workers.dev


“SHAREFILE”

Frontend infrastructure

No hosting markers visible.

Backend infrastructure

Example IP: 147.45.60.47 (Global Connectivity Solutions LLP AS215540)

Backend User Agent: node

Network paths

POST /api/device/start  POST /api/device/poll

Lure themes

Citrix ShareFile document transfer — file card with sender info, expiry warning, download/preview buttons

Example domain

cghdfg[.]vbchkioi[.]su

SHAREFILE kit.
SHAREFILE kit.

“CLURE”

Frontend infrastructure

API on api.duemineral.uk:8443 and api.loadingdocuments.uk:8443 (rotates).

Backend infrastructure

Example IP: 162.243.166.119 (DigitalOcean AS14061)

Backend User Agent: python-requests/2.32.5

Network paths

GET /api/status/{numeric_SID} (port :8443)

Lure themes

SharePoint "Team Site" doc library, SharePoint "Shared Document" individual share

Example domain

auth[.]duemineral[.]uk

CLURE kit.
CLURE kit.

“LINKID”

Frontend infrastructure

Adobe variant has Cloudflare challenge-platform iframe (CF-protected origin). Relative API paths — self-hosted.

Backend infrastructure

Example IP: 185.176.220.22 (2cloud.eu AS39845)

2600:1f10:470d:9a00:1437:ec30:be61:3494 (AWS AS16509)

Backend User Agent: axios/1.10.0 , axios/1.13.6

Network paths

POST /api/device/start

GET /api/device/status/{sessionId}

Lure themes

MS Teams meeting invitation (with interactive date/time picker), Adobe Acrobat Sign document review

Example domain

sdtr-site[.]cfd

LINKID landing page requires an email before serving the payload.

“AUTHOV”

Frontend infrastructure

workers.dev

Backend infrastructure

Example IP: 192.3.225.100 (HostPapa / ColoCrossing AS36352)

Backend User Agent:  python-httpx/0.28.1

Network paths

GET /landing/api/session-status?session_id=&token=

Lure themes

Adobe Acrobat document sharing (PDF preview, sender avatar)

Example domain

milosh-solibella-0dcio[.]sgttommy.workers.dev

AUTHOV kit. Notably uses a popup like prod EvilTokens.
AUTHOV kit. Notably uses a popup like prod EvilTokens.

“DOCUPOLL”

Frontend infrastructure

Github.io and workers.dev hosting

Backend infrastructure

Example IP: 144.172.103.240 (FranTech Solutions / RouterHosting / Cloudzy AS14956)

Backend User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19042

Network paths

POST /api/v1/landing-pages/public/{slug}/init

POST .../poll

POST .../track

Lure themes

DocuSign document signing. One sample is a full scrape of real docusign.com (free-account page) with kit injected.

Example domain

docufirmar[.]github.io


“FLOW_TOKEN”

Frontend infrastructure

workers.dev

Backend infrastructure

Example IP: 43.166.163.163 (Tencent Cloud AS132203)

Backend User Agent:  (null)

Network paths

POST /api/handler.php 

(actions: device_code_generate, device_code_poll_public)

Lure themes

DocuSign "Salary Adjustment Document — 2026", Microsoft banner · HR Department sender

Example domain

salaryadjustment-2afb52.pmb6fefc52b3f9aa5c2dbf[.]workers.dev

FLOW_TOKEN kit. Notably uses a popup like prod EvilTokens.
FLOW_TOKEN kit. Notably uses a popup like prod EvilTokens.

“PAPRIKA”

Frontend infrastructure

AWS S3 hosting

Network paths

POST /api/v1/loader

Lure themes

MS login clone ("Sign in to your account"), "Office 365" branding, fake "Powered by Okta" footer

Example domain

redirect-523346-d95027ec[.]s3.amazonaws.com

PAPRIKA kit.
PAPRIKA kit.

“DCSTATUS”

Frontend infrastructure

No hosting markers visible.

Network paths

GET /dc/status/{base64url_sid}

Lure themes

Generic "Microsoft 365 - Secure Access" verification page

Example domain

owa[.]apmmacleans[.]ca

DCSTATUS kit.
DCSTATUS kit.

“DOLCE”

Our suspicion is that this was a one-off — potentially for a red team exercise — rather than representative of a more widely used kit.

Frontend infrastructure

Microsoft PowerApps hosting

Backend infrastructure

Example IP: 34.53.159.84 (Google Cloud AS396982)

Backend User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36

Network paths

GET /api/generatecode (CloudFront)

Lure themes

Dolce & Gabbana branded, Italian language, MS account verification

Example domain

data-migration-dolcegabbana[.]powerappsportals.com

DOLCE kit.
DOLCE kit.

Clearly, device code phishing has entered mainstream adoption and we should be prepared for a lot more of it in future. So how does it work, and why is it so effective?


Device code phishing under the hood

The attacker POSTs to the authorization server's device authorization endpoint with its client_id (i.e. an application ID) and requested scopes or resources. The server responds with a device_code (used for polling), a user_code, a verification_uri, an expires_in value, and a polling interval. The user visits the URL, enters the code and approves the request. Meanwhile, the device polls the token endpoint. Once approved, the server returns an access token, a refresh token (if offline_access was requested), and an ID token (if openid was included). The attacker now has API access to the victim's account. 

Broadly, this gives the attacker a comparable level of control to a “normal” phishing attack (with conditions based on the scopes granted and specific app being targeted) while API access grants additional capabilities beyond standard browser sessions. When combined with other techniques, this access can be exchanged to open normal browser app sessions and access SSO connected apps (e.g. the PRT escalation technique for Microsoft that I mentioned in earlier research).

Device code phishing attack chain.
Device code phishing attack chain.

At this point, you can achieve a number of objectives both inside the app ecosystem and across SSO connected apps — e.g. data theft, disruption, and ultimately extortion.

Critically, the initial request to generate a device code is typically unauthenticated across all providers — anyone can generate one, from any machine, without proving any relationship to the target organization.

So, the attacker has to deliver a set of instructions via a phishing channel (e.g. email, social media DM, corp IM platform, and so on) with a device code that they have generated. The victim then enters this code on the legitimate device code login page for that app and issues the tokens to the attacker.

One of the key limitations of early device code phishing was that the code was being sent directly over email (as in the Russia-linked campaigns in 2024-5). This meant that the code would expire unless used immediately, requiring highly engaged social engineering to pull off. To get around this, modern device code phishing pages are continuously polling for fresh codes via API. This arguably makes them more discoverable than simply providing the code and instructions in a direct message, but is way more scalable for the attacker.

First-party vs. third-party apps

First-party applications are commonly abused in Microsoft-targeted attacks. These are real Microsoft applications registered in every Entra ID tenant. Not only are they allowed by default (unlike third-party apps that are often subject to additional restrictions and require additional tenant-level consent before they can be accessed by a user), they come with pre-consented permissions, and can even access undocumented “legacy” scopes. 

Many Microsoft first-party apps also belong to the Family of Client IDs (FOCI), meaning a refresh token obtained for one family member can be exchanged for access tokens to other family members without re-authentication. This means that an attacker can silently pivot to other apps and APIs from a single phished session.

These legacy scopes were abused in the Russia-linked ConsentFix campaign (a hybrid of ClickFix-style social engineering with OAuth abuse) reported by Push researchers. This created additional detection challenges as logging of activity against these scopes is not enabled by default.

In other cases third-party applications are leveraged. This doesn’t mean these are fresh, attacker created apps however (though it’s easier than ever for attackers to spin up their own OAuth apps using AI tools). They can simply be attacker-controlled instances of otherwise legitimate apps.


Why device code phishing is so dangerous

Device code phishing bypasses authentication controls (including passkeys)

A device code phishing attack cannot be prevented with authentication controls. This includes all forms of MFA and even “phishing-resistant” authentication methods such as passkeys. 

The device code authorization is effectively performed post-authentication. If you already have an active session in your browser, entering the device code and selecting your account from a drop-down menu is all that's needed. No password or MFA required. You can see an example in the video below.

Even if you do have to sign in again (because you're not already signed in for some reason), the attack still works because it isn't targeting the login — it's targeting the authorization layer instead.

This is what makes device code phishing different to other standard phishing methods like AiTM phishing (and arguably even more effective in environments with strict identity control enforcement). 

Device code logins are a feature, not a vulnerability, making attacks difficult to block

Device code authorization is a legitimate mechanism that is regularly used in an enterprise environment, particularly for CLI logins. This is a problem for security teams because the phishing attack effectively happens on the legitimate site. The code is delivered to the victim via message or webpage, but the attack itself only happens when that code is entered onto the real device code login page.

Since there’s no traditional phishing payload being delivered on the attacker’s webpage, these sites are more resistant to detection and less likely to be flagged by email and network analysis. And in many cases, there’s no email (or webpage) to analyze at all.

Various apps can be a target, all of which implement the device code flow in slightly different ways, and also offer different levels of control and default security around these logins. For example, Google Workspace is a significantly lower risk target than Microsoft, GitHub, or AWS because Google explicitly limits which scopes are available to the device code flow


Security recommendations

Security teams need to consider the risk posed by device code phishing across multiple apps where device code authorization grants are common, particularly for developers and technical users.

In an ideal world, you would simply block device code logins. But this can’t be done without causing serious disruption in some environments, while some apps simply don’t provide the tools required to do so. For example, device code is the default CLI sign-in method for GitHub. Developer-heavy organizations are likely to encounter higher levels of legitimate use.

Microsoft arguably offers the strongest control options (other than Google, who negate it right out of the gate), though they do require a fair amount of work. Microsoft now explicitly recommends blocking device code flow for tenants that haven't used it in the past 25 days. Their guidance is to create a custom CA policy: target relevant users, set the Authentication Flows condition to block Device Code Flow, and set the grant control to Block Access. Deploy in report-only mode first to identify any legitimate device code usage. 

Another Microsoft option is to prevent users from signing into first-party apps by pre-creating service principals for apps and requiring user assignment (also an option to mitigate broader OAuth attacks, including ConsentFix). This can limit which users can authenticate to specific apps without approval, but needs to be done for every first-party app deemed a risk.

For other apps, you’re mainly limited to monitoring and response. Ensuring you’re getting authentication logs for these apps is vital, and searching for unusual access patterns (e.g. unusual login protocols, having different IPs for the authorization grant and subsequent account activity).


How Push Security can help

Push customers can use our browser-based capabilities to overcome the limitations of app-level controls and detect, intercept, and shut down attacks in real time. 

Our research team is already tracking multiple device code phishing campaigns and toolkits, including the EvilTokens kit. Blocking controls are already in place to prevent customers from interacting with malicious pages that match our detections for these new toolkits, ensuring that these pages can be identified and blocked in real time regardless of the infrastructure. 

Using Push you can also configure in-browser warnings whenever a user accesses a URL used for device code logins. This provides universal, last-mile protection against even ‘zero-day’ device code phishing attacks using previously unidentified toolkits.  

DCP warning banner
Users visiting a device code login page will be required to click through a warning banner, emitting a webhook event.

When a user visits those URLs, Push will also emit a webhook event that the banner was shown and acknowledged. If a user opts to proceed, you can treat this as a high-fidelity alert for your security team to investigate, providing app-agnostic telemetry that may not already be provided in your logs from that particular vendor. You can also simply use Push to block users from accessing device login pages if you’re confident that disruption won’t be caused. 

Learn more about Push

Push Security's browser-based security platform detects and blocks browser-based attacks like AiTM phishing, credential stuffing, malicious browser extensions, ClickFix, and session hijacking. You don't need to wait until it all goes wrong either — you can use Push to proactively find and fix vulnerabilities across the apps that your employees use, like ghost logins, SSO coverage gaps, MFA gaps, vulnerable passwords, and more to harden your attack surface.

To learn more about Push, check out our latest product overview, view our demo library, or book some time with one of our team for a live demo.

Subscribe to get updates from Push
The latest news, articles, and resources, sent to your inbox