ChangeNOW Patched the Front-End Bug. The Leaked Data Set Is Permanent.

SignalShark
Guide

A security disclosure landed this week with no CVE number. No advisory ID. No post-mortem link. No component name. No affected-user count. No named auditor. No description of the flaw beyond a single clause — "a vulnerability in an integrated component used on our website" — and no exposure window.

It arrived, instead, as a press release. Distributed through a crypto media outlet, datelined Kingstown, St. Vincent and the Grenadines, and bundled inside the same document with a product announcement for an AI security lab that has no whitepaper, no named team, no architecture, and a launch date described only as "soon."

The company is ChangeNOW. It has operated a non-custodial instant-swap service since 2017. It claims millions of customers. It has no native token, which removes an entire class of risk from the table and, as I'll get to, removes the entire class of disclosure that this market actually knows how to price.

Here is the sentence that matters. It is not the one about the vulnerability.

Email addresses and transaction details were exposed.

That's the disclosure. Everything else in the document is packaging.

I have spent nine years reading breach notices as forensic documents rather than public statements — the Parity wallet library in December 2017, the Curve treasury outflow in July 2020, the Terra collateral mismatch in the weeks before it stopped mattering. The pattern is stable across all of them. The technical paragraph is short because the technical paragraph is the liability. The reassurance paragraph is long because the reassurance paragraph is the defense.

Volume spikes lie; liquidity flows tell the truth. Here the flow isn't on an order book. It's in what the document chooses to quantify and what it chooses to leave as a sentence fragment.

So let's do the accounting.


Context: When the Front-End *Is* the Product

You have to understand what kind of business this is before the disclosure makes sense.

ChangeNOW sits in a category that gets sloppily lumped into "exchange" but operates on a completely different threat model. It is a non-custodial instant swap: you send asset A to a deposit address, it routes liquidity on the back end, you receive asset B at another address. No account balance. No order book you're matching against. No user asset pool sitting anywhere for anyone to drain. Alongside that it runs staking, custody-adjacent services, and a broader "super app" front door — but the core primitive is the swap.

The competitive set is FixedFloat, SimpleSwap, StealthEX — same model, privacy-leaning, minimal KYC on pure crypto-to-crypto pairs. THORChain competes at the protocol layer with a genuinely on-chain design. 1inch and Jupiter compete for the aggregator slot. Different architectures, overlapping users.

Now the part that matters for risk assessment, and the part that almost never makes it into a security review.

*For a non-custodial swap desk, the web application is not a portal to the product. The web application is the product.*

Compare that to a DEX. On a DEX, the contract is the product. The interface is a convenience layer; if the front-end is compromised you can still interact with the contract directly, and the contract's behavior is verifiable by anyone. On a non-custodial swap desk, there is no contract to fall back on. There is a quote engine, an order database, a liquidity router, and a page. Take away the page and the business does not exist.

Which means the attack surface that actually determines whether this company gets hurt is not the treasury. There is no treasury to speak of — no pooled user funds, no hot wallet holding customer balances, no multisig to compromise. The attack surface is HTML, JavaScript, HTTP headers, and the long tail of third-party code that marketing, support, growth, and analytics teams have pasted into the page over eight years.

The sector has inverted its security spend against its actual risk. Non-custodial platforms publish proof-of-reserves and cold-storage architecture and multisig policies — controls for a threat they structurally don't have — while running a front-end assembled from a dozen vendor SDKs with no inventory, no integrity pinning, and no monitoring.

I want to be precise about what I'm claiming and what I'm not. I have not audited ChangeNOW's headers. I can't verify their CSP from a press release, and I'm not going to pretend a document with zero technical content tells me anything about their infrastructure. What I am saying is structural: an industry that will happily publish a contract audit PDF will not publish its Content-Security-Policy header, and the layer that just failed is the one nobody publishes.


Core: Reading the Disclosure as a Technical Artifact

The words "integrated component" do real work

Strip the phrase down. An "integrated component" is not ChangeNOW's own code. It's someone else's code, running inside ChangeNOW's perimeter, with ChangeNOW's users in front of it.

That single phrase relocates the vulnerability from the company to its supply chain. It's a meaningful distinction — a first-party bug is a competence failure, a third-party bug is a vendor-management failure — and it's also rhetorically convenient, because it moves the blame to a party the public can't identify.

But the phrase isn't useless. Combined with the data classification, it's actually a narrowing clue. Here's the deduction.

Integrated components fall into three families, and only two of them can leak what ChangeNOW says leaked.

Family one: client-side tags with no server credential. Analytics pixels, heatmap recorders, A/B testing scripts, ad attribution. These see what the browser sees — page URL, referrer, session behavior. They can exfiltrate session context. They generally cannot read your order history, because your order history lives behind an authenticated API call that these scripts are not making.

Family two: client-side widgets with an authenticated backend session. Live chat, support desks, in-app messaging, feedback tools. These are embedded in the page, they authenticate to their own vendor backend, and — critically — they are designed to carry context. A support widget that can't see which order you're asking about is a support widget nobody buys. So the integration is built to pass order identifiers, asset pairs, amounts, and timestamps into the vendor's system.

Family three: server-side integrations with an API key and an event stream. Transactional email delivery, customer data platforms, webhook relays, notification services. These don't sit in the browser at all. They sit behind the API, holding credentials that authorize writes and reads against production data.

Family two and family three are the only candidates. Both are designed to hold exactly the fields that were reported lost.

The field set is the fingerprint

This is the part I'd pull first if I had access, and it's the part nobody in the coverage has touched.

Look at what was reported: email address plus transaction details. Not session tokens. Not private keys, obviously — there are none to take. Not KYC documents. Email and transaction details.

Now think about what a transactional email template contains. It contains the recipient address. It contains the asset pair. It contains the amount. It contains the order ID. It contains a timestamp. It contains, in most implementations, a status string and a destination address prefix.

The leaked field set is nearly identical to the variable payload of an order-confirmation email.

That is not a coincidence and it is not a guess — it's a structural observation. Whatever component failed held a data shape that was assembled for the purpose of telling a specific person about a specific trade. Support desks hold that shape because agents need it. Notification services hold that shape because that's literally their job. CDPs hold that shape because they're built to receive every event in the product.

My primary hypothesis is a support-context integration or a notification/email pipeline, and my confidence is moderate — the disclosure is too thin to do better. But the hypothesis is testable, and that's the point. The field set narrows the suspect list in a way the prose does not.

There's a secondary inference that matters more. A component that can surface transaction details has server-side data access. That means the failure was not purely a client-side script injection. Somewhere in ChangeNOW's permission model, a third-party integration held credentials broad enough to read order records. That's an authorization-design problem, and authorization-design problems don't get fixed by patching a script. They get fixed by re-scoping API keys, which is a project, not a hotfix.

Why "transaction details" changes the severity class

If this were an email-only leak, I'd file it as a nuisance. Spam, credential-stuffing lists, a slow trickle of low-quality phishing. Annoying. Recoverable. The kind of thing that gets a footnote.

It isn't email-only.

Email plus asset pair plus amount plus timestamp plus order ID is not a list. It's a deanonymization primitive. For a privacy-leaning swap service, that's close to a product-level failure. The reason a person uses a non-KYC swap instead of a centralized exchange is precisely to avoid a durable, linked record of what they moved, when, and how much. That record now exists in a third party's hands, attached to an identifier — an email address — that resolves to a human being.

Three consequences follow, and they compound.

First, targeting. Asset pair plus size plus recency is a wealth filter. Anyone holding this data set can sort for large positions opened in the last ninety days and work down the list. That's not spray-and-pray fraud. That's account prioritization.

Second, cross-referencing. An email address is the join key for everything else. It links to exchange accounts, forum handles, ENS names, GitHub commits, leaked databases going back a decade. A single email plus a trade history is enough to build a profile that no amount of on-chain privacy protects, because the leak isn't on-chain. It's in a spreadsheet.

Third — and this is the one that will still be hurting people a year from now — the template. More on that in the contrarian section, because it's the most under-reported part of this entire event and it's the part I'd be loudest about if I were ChangeNOW's incident lead.

"No evidence of exploitation" is a weak negative

Read the two sentences side by side. This is the whole document.

Sentence one: there is no evidence the vulnerability was exploited.

Sentence two: the company cannot assume the reporting researcher was the only person who found it, and is investigating various scenarios.

ChangeNOW Patched the Front-End Bug. The Leaked Data Set Is Permanent.

Those two sentences cannot both be load-bearing. The first is offered as reassurance. The second withdraws it.

Here's the logical structure of "no evidence of exploitation," which is a phrase I have now read in roughly two hundred breach notices and which has never once meant what the writer wanted it to mean. Absence of evidence of exploitation requires evidence of absence of access. To assert it, you need complete read logs for the compromised component, retained for the full exposure window, and you need to know what the exposure window was.

ChangeNOW has published no exposure window.

So the honest reading of sentence one is: we have not found evidence, using logs we have not described, covering a period we have not defined, for a component we have not named. That's not a negative. That's a null.

And sentence two — the one about not assuming the researcher was the only finder — is the actual disclosure. It's buried mid-paragraph, phrased as diligence, and it says the company's own working assumption is that the vulnerability may have been known to parties who did not report it.

A document that says "no evidence of exploitation" and "we cannot assume we were the only ones who found it" in the same breath is not a reassurance. It's a scope statement. The scope is unknown. They're telling you it's unknown. Credit for the honesty. Zero credit for the framing.

The control that was probably missing, and the reason nobody deploys it

I want to spend real space on this, because it's the only genuinely actionable technical content I can extract from an otherwise empty disclosure, and because I have watched the same failure mode repeat for nine years.

Subresource Integrity.

SRI is a browser feature. You add an integrity attribute to a