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.
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 or tag containing a cryptographic hash of the exact bytes the browser is supposed to load. If the resource served from the CDN differs by a single byte โ a version bump, a compromised build, an injected payload โ the browser refuses to execute it. It's a pin. It's been available in every major browser for over a decade. It is the cheapest defense against third-party script tampering that exists.
Almost nobody in crypto uses it.
I know why, and the reason is organizational rather than technical. Vendors ship versioned CDN URLs that rotate without notice. Every rotation breaks the hash, the widget stops loading, a growth or support team files a ticket, and eventually someone removes the integrity attribute to make the problem go away. The control gets deleted by the team that doesn't own the risk, to unblock a launch that isn't theirs.
The second control is Content-Security-Policy. A strict script-src directive with nonces or hashes and a tight allowlist limits which origins can execute script at all. Paired with report-to, it gives you a stream of violation events โ a free intrusion-detection system pointed directly at your front-end, which is the layer that just failed.
When I do post-incident reviews, the CSP violation report stream is usually the first thing I ask for and usually the thing that doesn't exist. Not because it's hard. Because nobody turned it on. The header is one line of configuration and one reporting endpoint. It is the difference between finding out in nine minutes and finding out in nine months from a security researcher's blog post.
Speed is safety when the exploit is already live. ChangeNOW's response speed on the patch may well have been excellent โ I have no reason to doubt it, and they say the fix is deployed. But response speed is the second-fastest thing in the room. The fastest thing is the detection that would have started the clock. There's no evidence in this document that a clock was ever started by anything other than an outside researcher.
That's the systemic finding. Not "ChangeNOW got hacked." The finding is: an eight-year-old platform with millions of users had no visible mechanism to detect tampering in its own third-party code, and the sector treats that as normal.
Offshore jurisdiction, GDPR, and the notification that isn't in the document
ChangeNOW is registered in St. Vincent and the Grenadines. Kingstown. That's a standard, well-trodden offshore posture for crypto businesses, and I'm not going to moralize about it. It does specific things to the risk profile, though, and those things need stating plainly.
St. Vincent and the Grenadines does not have a comprehensive data protection regime with an EU adequacy finding. There is no local supervisory authority that will meaningfully investigate a breach at a Kingstown-registered entity on behalf of a user in Lisbon. The enforcement path for an affected individual is, functionally, nothing.
Which matters, because email addresses are personal data under GDPR, and transaction records attached to an identified individual are unambiguously financial personal data. If the affected population includes EU residents โ and a global swap desk with millions of customers that has processed volume since 2017 almost certainly has EU residents in the set โ then Article 33 applies. Seventy-two hours from awareness. Notification to a lead supervisory authority. Article 34 notification to affected individuals where there's high risk.
The release names no regulator. No data protection authority. No notification timeline. No mention of a Data Protection Officer or a GDPR assessment.
There are three possible explanations and I can't distinguish between them from outside. One: the affected set contains no EU residents, which I find implausible. Two: notification is happening on a separate track and simply isn't in a user-facing press release, which is defensible and common. Three: the offshore structure is being used as designed, which is to say, as a liability shield.
I'll note one more thing about the document's own framing, because it's a tell. The release emphasizes that ChangeNOW warned users about the risk before it was fully certain of the facts. Read that as a lawyer would. That sentence exists to establish that the company discharged a duty to warn. It is not generosity. It's an exhibit. When a security notice contains a sentence that only makes sense in a courtroom, the document has been reviewed by counsel, which means the omissions are deliberate, which means the missing component name and the missing user count are missing on purpose.
NOW AI: reading the announcement as a forensic artifact
Now the second half of the press release, which is the half that got the headline.
ChangeNOW announced NOW AI. An AI security lab. Here is the complete inventory of what the document says about it: it will raise security standards, it will detect danger earlier, it will be built into the product, and details will be published soon on a dedicated page.
Here is the complete inventory of what the document does not say: no architecture. No model class. No training data. No detection surface โ on-chain? Phishing domains? Front-end integrity monitoring? No team. No advisors. No partnerships. No benchmarks. No precision or recall figures. No latency targets. No threat intelligence sources. No audit. No timeline beyond "soon." No product.
And then, in a sentence that I have read four times and that I think is the single most revealing line in the entire document, the release states that the incident accelerated the NOW AI announcement.
That is the company telling you the causal order. The product announcement is a function of the incident, not a response to it.
I don't say that as an accusation of bad faith. Companies do this constantly and it's rational. But an analyst's job is to name what the artifact is. This is issue framing: take a negative event, attach a forward-looking positive narrative to the same document, and let the second half of the paragraph become the story. The vulnerability becomes the origin story of the security lab. The leak becomes the reason the lab exists. The problem becomes the pitch.
What would make NOW AI real? I have a short list, and I'll apply it to any security product announced inside a breach notice.
A published detection surface. "We detect X" is a claim. "We monitor front-end resource integrity across N properties with sub-minute alerting" is a product. Precision and recall on a labeled data set. Mean time to detection, measured, not asserted. A named threat intel feed with signed attribution. A takedown latency figure for phishing domains. A third-party evaluation.
What makes it marketing? A landing page and a token. In that order.
If NOW AI ships a token before it ships a measurable detection claim, the correct read is that the security lab was a vehicle, not a product, and the entire sequence โ breach, disclosure, lab, token โ was a narrative construction executed in public. I've watched this exact choreography before and it has never once ended with better security.
Contrarian: The Three Things Everyone Is Getting Wrong
One: non-custodial was never a privacy guarantee, and the sector let people believe it was
Here's the belief doing the damage, and it's the most expensive belief in this industry: not your keys, not your coins, therefore I am safe.
That's a statement about asset custody. It's true, as far as it goes. ChangeNOW doesn't hold your keys, so ChangeNOW can't take your funds, and in this incident no funds were taken. Good. Genuinely good. That's a real architectural advantage over a centralized exchange and I won't argue against it.
But it is not a statement about data custody. It has never been a statement about data custody. And the sector has let the first sentence do the work of the second for a decade.
Non-custodial protects the funds. It has never protected the person.
The person is who got hurt here. The person had an email address and a trade history in a vendor's database. The person is going to get a message with their real order ID in it and they're going to believe it, because why wouldn't they. The person's loss is not denominated in bitcoin.
And here's the uncomfortable corollary: *the privacy-leaning non-custodial segment has the worst data posture in the industry relative to its marketing.* A KYC-heavy centralized exchange at least has a compliance department, a DPO, a regulator with jurisdiction, and a reason to retain fewer records. A no-KYC swap desk has an offshore registration, a marketing site, a support widget, and a customer data platform. It sells anonymity while accumulating the exact records that destroy it.
That's the inversion nobody writes about. The product promise and the data architecture point in opposite directions, and the gap is where this incident happened.
Two: the leak is a phishing oracle, and it will outlive the patch by a year
I said I'd come back to this. It's the finding I'd put in bold if I were writing ChangeNOW's incident report, and it's the finding that got one sentence in the release.
The standard anti-phishing heuristic that every exchange, every wallet, and every security team in this industry teaches users is: check whether the message knows things only the real company would know. A generic "your account has been compromised, click here" is obviously fake. A message that names your asset pair, your amount, your order ID, and the date you traded is obviously real.
That heuristic is now inverted. It's an authenticity signal that has been handed to the attacker.
The leaked data set is not a mailing list. It is a template generator. Anyone holding it can reconstruct, with high fidelity, the exact shape of a ChangeNOW order notification โ because the fields that make it convincing are the fields that leaked. The attacker doesn't have to guess. The attacker has the payload.
This is why the severity assessment in most of the coverage is wrong. The vulnerability is patched. The vulnerability is the small problem. The data set is the problem, it cannot be patched, it cannot be recalled, and its operational value to a criminal doesn't decay on the same schedule as the news cycle. Order details from eight months ago are just as usable in a phishing template as order details from yesterday โ arguably more usable, because a message about a completed trade from eight months ago triggers less suspicion than one about a trade you don't remember making.
Practical consequence, and I mean this literally: treat every message that cites a real ChangeNOW order as hostile by default. Not suspicious. Hostile. The presence of accurate order details is now evidence against legitimacy, not for it. Verify only through a domain you typed yourself. Never through a link. Never through a phone number in the message. And understand that the support address published in the release is itself now a target for lookalike-domain registration โ the attacker's next move is a domain one character off, and it will arrive in the same thread.
Three: the disclosure was addressed to the audience that can't act on it
One more structural observation, and then I'll stop.
Security disclosures have two audiences. Users, who need to know to be careful. And defenders โ engineers at other platforms โ who need to know what component so they can check whether they're running it too.
This disclosure went out as a press release to a crypto media outlet. That reaches users. It does not reach defenders, because defenders don't read press releases, they read advisories, mailing lists, and CVE feeds. And the one piece of information that would let a defender act โ the component name โ is absent.
I'm not going to call that malicious. There are real reasons to withhold a vendor name: contractual confidentiality, not wanting to publicly attribute a flaw to a business partner, an active investigation. All legitimate.
But look at the aggregate effect. The audience that could have triggered industry-wide remediation got nothing. The audience that could only worry got a warning. Whether that was the intent or an accident of communications process, the outcome is the same: a supply-chain vulnerability in a widely-used category of component was disclosed without the one field that makes a disclosure useful to the supply chain.
And here's the test. If the failed component was genuinely bespoke โ custom-built for ChangeNOW โ then nobody else is exposed and the omission costs nothing. If it was a common vendor SDK, then every other swap desk running it has the same hole, right now, and doesn't know. We will find out which it was by waiting. If a second platform discloses the same class of component failure in the next sixty days, the omission was expensive. If nobody does, either it was bespoke, or the sector simply doesn't disclose.
We don't know the component. We don't know the window. We don't know the count. Three unknowns, one document, and a product launch in the back half.
Takeaway: What to Watch, and What to Stop Believing
The chart doesn't have a line for this. There's no ticker that prices a customer's order history being used against them eighteen months after the patch. ChangeNOW has no token, so there's no asset to reprice, which means the market's discipline mechanism โ price โ is entirely absent. The accountability has to come from somewhere else. Here's where I'd look.
The component name. If it never appears, treat the disclosure as incomplete indefinitely, not as closed. An advisory without an identifier is a story, not a record.
The second disclosure. Sixty days. If another platform reports the same class of third-party component failure, the common-mode risk was real and the omission was costly. If nothing surfaces, that's not proof of safety โ it's proof that the sector's disclosure culture is what I think it is.
The headers. Content-Security-Policy and integrity attributes on changenow.io are publicly observable. If they appear or tighten in the coming weeks, the security narrative is being backed by engineering. If the site's third-party script inventory stays unchanged, "security-first" is copy. This is the cheapest verification available to anyone reading this, and it requires no special access. Go look.
NOW AI's first measurable claim. Not a mission statement. A number. Detection latency, precision on a labeled set, takedown time. If the first artifact is a token instead of a metric, the sequence was narrative and you can stop paying attention.
The regulator. If EU users are in the affected set and no supervisory authority is named within the statutory window, the compliance posture is a legal fiction and users are absorbing the residual risk personally.
And for individuals: rotate nothing that wasn't leaked, but assume everything that was. The email is out. The trade history is out. The correct posture is not vigilance โ vigilance decays. The correct posture is a rule. Any message citing a real order is hostile until proven otherwise through a channel you opened yourself.
The real question isn't whether ChangeNOW patched a script. They say they did, and I have no evidence to the contrary. The question is whether this industry can break the habit of announcing a security product in the same document as a data loss, and calling the combination transparency. Because the pattern is now well-established, the playbook is public, and the next platform that gets hit is going to run it verbatim.
Nine years in, I've stopped being surprised by the bug. The bug is always the same bug โ third-party code with too much access and nobody watching it. What still gets my attention is the packaging. And this one was packaged very well.
That's the part I'd audit first.