SRI Cannot Pin an Ad Tag, So Take the Tags Off the Money Pages
The control everyone reaches for first is unusable against mutable vendor assets, which leaves route architecture — not a header — as the only barrier between third-party code and a payment field.
Why the reflex control cannot actually be deployed
Subresource Integrity is the first thing every team reaches for. It cannot work here. SRI validates a byte-stable artifact against a pinned hash. Adtech vendors deploy continuously, and many generate per-request variants, so a pinned hash on an ad tag breaks ad delivery within a day of being added. That is why effectively no production site pins its ad tags. The control exists and is unusable. A CSP script-src allowlist does nothing either: the vendor origin was already allowlisted and trusted, and the poisoned bytes arrived from it with full same-origin privileges.
The controls that actually bite are architectural, not header-level:
| Control | Stops this pattern? | Cost | Where it fails |
|---|---|---|---|
| CSP script-src allowlist | No | Low | Origin was allowlisted; the file itself was poisoned |
| Subresource Integrity | In theory | Low to add, high to operate | Breaks on every vendor deploy |
| Trusted Types | Partially | Medium DOM-sink refactor | Constrains injection sinks, not legitimate DOM writes by allowed script |
| Third-party JS in sandboxed iframe or worker | Yes | High (Partytown-style rearchitecture) | Breaks tags that require main-thread DOM access |
| Zero third-party JS on payment routes | Yes | Medium routing plus org negotiation | Political, not technical |
| Runtime script-inventory monitoring | Detects only | Low | Prevents nothing; cuts time to detection |
Nothing in the telemetry moves
A rewritten wallet address throws no exception. Error rates stay flat and the funnel converts normally. CDN logs show a routine third-party fetch, and exfiltration rides channels indistinguishable from ordinary ad beaconing. The detection asymmetry is the part worth internalizing: the vendor found the compromise and published a date, so every downstream publisher learned about its own incident from someone else's disclosure. Dwell time remains undisclosed, which leaves the exposure window unbounded for anyone who loaded that file.
That is why runtime script inventory earns budget even though it prevents nothing. Making CSP report-only a permanent production signal, and diffing observed script origins against an approved manifest on every deploy, moves mean time to detection from a vendor blog post to minutes. Cheapest row in the table, and the only one that improves a number under local control.
An SBOM covers the code you build. It says nothing about what a vendor's CDN chooses to serve at request time, which is exactly where this payload lived.
The same shape, one layer down
Read this next to the second item in the same reporting: cheap Android TV boxes shipping preinstalled apps that rewrite hardware identity to impersonate Samsung, Huawei, Xiaomi and Vivo handsets, commit ad fraud, and convert the owner's broadband into a proxy exit. Both are upstream compromises that reach end users without ever touching the intermediary. Any fraud or abuse stack that weights IP reputation, ASN or device fingerprint attributes is now consuming attacker-authored inputs, and re-rating those signals by spoofability is separate work from anything on the payment pages.
The framing is where both sources converge: stop optimizing for never fails and start optimizing blast radius, detection latency and recovery time. In the browser that produces three concrete outputs. Serve transaction surfaces from a separate origin. Isolate anything not compiled in-house. Treat the browser as a monitored runtime with owned telemetry instead of someone else's problem. The negotiation with marketing gets easier when the ask is scoped to routes that render a payment destination rather than the whole property.
What to do
Enumerate every third-party script origin loading on payment-, wallet- and account-rendering routes, then remove all of them from any route that renders a payment destination
Promote CSP report-only telemetry to a permanent production signal this sprint and diff observed script origins against an approved manifest on every deploy
Prototype a sandboxed worker host for the tags marketing will not drop and measure tag breakage on a 5% traffic slice this quarter