Worked example · 2026-06
Polymarket — a compromised third-party frontend vendor injects wallet-draining JavaScript into the live site — Polygon / Ethereum — 2026-06-25
Summary
Polymarket is a prediction-market platform whose users trade on its official website using pUSD, a USDC-backed stablecoin, on Polygon. On 2026-06-25, an attacker compromised a third-party frontend vendor whose dependency Polymarket shipped as part of that website, and used it to inject malicious JavaScript into the live frontend served to real users.
The injected script hijacked active browser sessions and prompted users to approve fraudulent token-approval transactions. Users who approved had their pUSD moved to attacker-controlled addresses. At least 11 wallets were drained for a total of about $3.0–3.1M. Polymarket's backend, servers and smart contracts were not involved; the compromise was entirely in the client-side supply chain of the site.
The stolen pUSD was bridged from Polygon to Ethereum, swapped to roughly 1,893 ETH, and consolidated into a single wallet. Polymarket identified and removed the compromised dependency within hours, isolated the malicious script, began contacting affected users directly, and committed to full refunds; the loss figure was revised upward to about $3.1M two days later. The specific vendor and no indicators of compromise were published.
Timeline (UTC)
| When | Event | OAK ref |
|---|---|---|
| Pre-2026-06-25 | A third-party frontend vendor / dependency shipped in Polymarket's website is compromised | T15.002 (entry vector) |
| 2026-06-25 | Malicious JavaScript is served to real users on the official Polymarket frontend; it hijacks sessions and prompts fraudulent token approvals; |
T15.002 + T4.002 execution |
| 2026-06-25 | Stolen pUSD bridged Polygon → Ethereum, swapped to ~1,893 ETH, consolidated to a single wallet | T7.003 |
| 2026-06-25/26 | Polymarket contains the incident, removes the compromised dependency, contacts affected users, pledges full refunds; discloses publicly | (operator response) |
| 2026-06-27 | Loss revised to ~$3.1M | (updated accounting) |
What defenders observed
- Pre-event (frontend dependency and vendor trust). The compromise originated in a third-party dependency Polymarket shipped. Subresource integrity, script pinning, vendor/provenance review, and a restrictive content-security policy limit what a compromised dependency can do once it is on the page. These are web-delivery controls, distinct from smart-contract audits.
- At-event (approval prompt on the trusted domain). The drain relied on users approving transfers on the real site, where the domain itself lent the prompt legitimacy. Client-side transaction simulation and approval-warning tooling that flags an unexpected or excessive approval, independent of the originating site, is the user-facing control.
- At-event (backend intact, client-side drained). On-chain, Polymarket's contracts behaved normally; the loss was in signed user transactions solicited by injected code. Monitoring that watches for anomalous approval patterns from users of a given frontend, rather than only contract-level events, is the relevant detection surface.
- Post-event (fast containment plus refunds). Polymarket removed the dependency within hours and committed to refunds, which bounds user exposure even though the on-chain funds were bridged and consolidated quickly. Containment here is about pulling the malicious script and making users whole, not recovering the moved funds.
Public references
[bleepingpolymarket2026]— BleepingComputer, "Polymarket customers lose $3 million in supply-chain attack" (primary incident report; JS injection via frontend vendor, backend not impacted, PeckShield fund-flow): https://www.bleepingcomputer.com/news/security/polymarket-customers-lose-3-million-in-supply-chain-attack/[securityweekpolymarket2026]— SecurityWeek, "$3 Million Reportedly Stolen in Polymarket Hack" (~$3M pUSD to ~1,893 ETH, at least 11 victims, vendor unnamed): https://www.securityweek.com/3-million-reportedly-stolen-in-polymarket-hack/[halbornpolymarket2026]— Halborn, "Explained: The Polymarket Hack (June 2026)" (at least 11 wallets, Polygon → Ethereum bridge, consolidation to one wallet, contracts unaffected): https://www.halborn.com/blog/post/explained-the-polymarket-hack-june-2026[rescanapolymarket2026]— Rescana, "Polymarket Supply-Chain Attack Analysis" ("fewer than 15 accounts," no IOCs or vendor disclosed, prevention guidance): https://www.rescana.com/post/polymarket-supply-chain-attack-analysis-3-million-cryptocurrency-theft-via-compromised-third-party-dependency[coindeskpolymarket2026]— CoinDesk, "Polymarket hack updated to $3.1 million days after the platform promised users full refunds" (loss revision; refund-pledge context): https://www.coindesk.com/markets/2026/06/27/polymarket-hack-updated-to-usd3-1-million-days-after-the-platform-promised-users-full-refunds
Discussion
Polymarket 2026-06 is OAK's clean anchor for a frontend-vendor supply-chain compromise that drains users while the protocol's own contracts and servers stay intact. It belongs to the T15.002 family alongside the Ledger Connect Kit library compromise and the Nx Console extension compromise, but with a prediction-market frontend as the delivery surface and user token approvals as the extraction, which is why T4.002 is co-primary: the vendor compromise put the malicious code on the page, and the fraudulent approval prompt is how value actually left.
The case is worth keeping distinct from the earlier Polymarket trader-tooling campaign. That one poisoned npm packages and impersonated Polymarket to steal keys from developers and bot operators, and never touched Polymarket's own site. This one compromised a dependency Polymarket itself shipped and served malicious code from the official domain. The shared lesson is that "the protocol is secure" is not the same as "the website is safe to use," and the defensive unit for a wallet-facing product includes its frontend build and its vendor dependencies, checked with subresource integrity, provenance review, and a content-security policy, plus client-side approval-warning tooling for users. The vendor was never named, so the entry records the mechanism and leaves the specific dependency open.