Home/ Blog/ Security news/ Article
Blog · Security news

Adform's shared ad-tracking script was hijacked to swap crypto wallet addresses in visitors' browsers

Attackers trojanized Adform's shared trackpoint-async.js to swap Bitcoin, Ethereum, and Tron wallet addresses in visitors' browsers. Why SRI can't stop it.

A single conduit branching into many identical nodes with one element swapped

The advertising and analytics tags most websites paste into their pages are the least-verified code they run. Each one loads from a vendor's servers, changes whenever the vendor ships an update, and executes with full access to the page. When one of those vendors is compromised, every site carrying the tag serves the attacker's code without anyone touching its own infrastructure. That is what happened with Adform, and it is a category of risk that host-based defenses cannot see.

Around July 26 and 27, 2026, Adform's shared tracking script was altered to hijack cryptocurrency payments in the browsers of people visiting sites across its network. Researcher Kevin Beaumont disclosed the compromise, and Adform confirmed it removed the code. The theft technique is old. The delivery is the part worth studying.

What the tampered script did

The attackers scrambled two blocks of code with a six-byte XOR key and bolted them onto trackpoint-async.js, the tracking file Adform serves from s2.adform.net. One block listened for copy actions and polled the clipboard every few seconds, substituting any Bitcoin, Ethereum, or Tron address it saw for one the attacker owned. The second scanned the page's visible text and replaced addresses inside form fields and editable regions, moving the cursor back afterward so the edit was easy to miss. It also overrode the value setters on those fields, so even an address written by the site's own script got swapped, according to The Hacker News.

A separate request reached out to 84.32.102.230 on port 7744, carrying which page and path the visitor was on. Adform said its analysis indicated that kind of transmission may have been possible. When Beaumont looked, the file along with its domains and IP addresses was still showing clean on VirusTotal. Per BleepingComputer, the earliest captured copy dates to late on July 26, and Adform spotted the activity and pulled the code on July 27.

Adform script compromise: how the window played outJul 26: First sample. Jul 27: Adform pulls it. Jul 31: Public disclosure.Adform script compromise: how the window played outJul 26First sampleJul 27Adform pulls itJul 31Publicdisclosure
Sources: Kevin Beaumont; Adform; BleepingComputer. Times per public reporting.

Scope is the open question. Adform reported roughly 1,800 customers and about 1.5 billion ad displays a day in 2025, but has not said how many of those loads were served the tampered file, how the attackers got into its deployment path, or whether any money moved. Read the reach figure as the size of the network, not the count of people hit.

Why can't subresource integrity stop this?

Subresource integrity works by pinning a script to a known hash, so the browser refuses to run a file that has changed. Ad and analytics tags are built to change on the vendor's schedule, so you cannot pin them. The one control teams reach for on third-party scripts does not apply to the highest-reach third-party code on the web.

That leaves the controls that do not depend on the file staying constant. A content security policy with a strict connect-src allowlist would not have stopped the address swap, but it would have blocked or reported the callback to 84.32.102.230, because that host was never on the list of places the page is allowed to talk to. A report-uri or report-to endpoint turns that block into a log line you can alert on. Trusted Types and sandboxing third-party tags behind a tag manager or an isolated frame shrink what a rogue script can reach in the first place.

Detection lives in the browser, not the host

Nothing in this campaign touched the customer sites' back ends. No file changed on their servers, no process spawned, no login happened. Server logs, a web application firewall, and host monitoring on the origin all saw a normal day, because the malicious logic ran in the visitor's browser against addresses the visitor copied. The detection surface is the client.

Three signals are worth wiring up. Content security policy violation reports catch a script reaching an origin it should not. Real-user or synthetic monitoring that fetches your third-party scripts on a schedule and compares them against the last known good copy catches a silent change like this one, which no scanner flagged. And a current inventory of every third-party tag on your pages is what makes the other two possible, since you cannot watch a script you forgot you embedded.

The tag you paste is a trust boundary you inherit

Embedding a vendor's tag is a decision to run whatever that vendor's deploy pipeline produces, on your users, indefinitely. The blast radius is inverted from a normal breach: the attacker did not need to compromise 1,800 sites, only one file with the reach of the whole network, and the reputational damage lands on the sites that embedded it, not on Adform alone. We watched the same shape in a compromised web front end that redirected funds and in clipboard-swapping malware that rewrites crypto addresses. The clipboard clipper is a decade-old trick; delivering it through a legitimate ad content delivery network with zero antivirus detections is the new part.

It rhymes with the package-manager incidents we keep covering, from a poisoned npm package to code that runs the moment you open a project. The pattern repeats: the code you did not write, loaded from infrastructure you do not control, is where the modern web breaks.

Audit your third-party tags before one turns on you

Start with the inventory. List every external script your pages load, who owns it, and why it is there, then drop the tags nobody can justify. For the ones that stay, put a content security policy in front of them with a connect-src allowlist and a reporting endpoint, so an unexpected outbound call becomes an alert instead of a quiet theft. Add out-of-band monitoring that re-fetches those scripts and diffs them against a known-good copy. And on the user side, the durable habit against address-swapping is to check the first and last characters of any crypto address in the destination wallet before sending, because the value shown in the browser is exactly what this attack rewrites.

Topics

Frequently asked questions

What is the Adform supply-chain attack?

Attackers modified trackpoint-async.js, a tracking script Adform serves across its advertising network, to swap Bitcoin, Ethereum, and Tron wallet addresses in the browsers of people visiting sites that embed it. Adform detected and removed the malicious code on July 27, 2026, and researcher Kevin Beaumont disclosed it on July 31.

How did the malicious Adform script steal cryptocurrency?

The tampered script watched the clipboard and rewrote wallet addresses shown on the page, replacing them with attacker-controlled ones. If a visitor copied or was shown a Bitcoin, Ethereum, or Tron address to pay, the swapped address sent the funds to the attacker instead, all inside the browser.

Which sites and users were affected?

Any site embedding Adform's tracking tag could have served the altered file to visitors on July 27, 2026. Adform reported about 1,800 customers and 1.5 billion daily ad displays in 2025, but that reflects the network's size, not the number of people hit; it has not said how many loads got the malicious code or whether funds were stolen.

Would subresource integrity have blocked the attack?

No. Subresource integrity pins a script to a fixed hash, but ad and analytics tags are designed to change on the vendor's schedule, so they cannot be pinned. A content security policy with a strict connect-src allowlist is the more useful control, since it can block or report the script's outbound callback.

How can a site detect a compromised third-party script?

You detect it in the browser, because nothing about this attack touches your own servers. Collect content security policy violation reports to catch a script contacting an unexpected origin, re-fetch your third-party scripts on a schedule and compare them against a known-good copy, and keep a current inventory of every tag your pages load.

What should crypto users do to avoid address-swapping malware?

Verify the first and last characters of any cryptocurrency address in your destination wallet before sending, because address-swapping malware rewrites the address shown in the browser or clipboard. Where possible, use a saved address book or allowlist so you are not pasting an address the page can quietly change.

Ready to meet the Guardians?

Deploys fast - agentless for monitoring and cloud, a lightweight agent for deep endpoint security. Just Suriq, standing watch.