Skip to content
Centriu
Centriu Dash

Creative Thumbnail Content Security Policy Automation: Open by Host, Not by Chance

Centriu Dash's own image security policy restricted every image on its social reporting screen to the app's own host plus generic in-page data — and measured directly against the real creative library, zero of the 2,235 real thumbnails actually lived there: 2,113 sat in the platform's own file storage, 49 on its own API domain, and the rest on the social network's own content-delivery network the creatives were originally collected from. Every single thumbnail in the library would have rendered as a broken image the moment this policy shipped, with a clean build, a clean typecheck and a passing test suite the entire time — none of those check what a real browser does against a real security header. The fix names the four specific hosts the real, measured data actually uses, deliberately not a wide-open rule for any secure image source, because an image address is itself a channel a browser will follow — and an unrestricted one would quietly become a way to leak data out through any unrelated bug that lets an attacker control what gets rendered on the page.
Named hosts, not a blank check
2,235 thumbnails measured
Channel connection status screen
Zero of 2,235 thumbnails lived on the one host allowed.

A security header failing correctly looks exactly like a design choice, from every angle except a real browser

A security policy that blocks an image is doing precisely what a security policy is supposed to do — refuse anything it was not explicitly told to allow. The failure mode here is not the policy behaving incorrectly; it is the policy being handed a list of allowed sources that never matched where the real data actually lives, and every layer of automated checking that would normally catch a defect (a build, a typecheck, an automated test) checks the code, not what a live browser does when it receives that policy header and tries to load a real image against it.

How the underlying problem shows up before you fix it

A security policy for images is written to a default that sounds reasonable in isolation — the app's own host plus generic in-page data — without measuring where the feature's ACTUAL data currently lives.

A build, a typecheck and a full automated test suite all pass cleanly, because none of them render a real page in a real browser against the actual security header being sent.

The symptom is entirely visual and entirely browser-side: a grid of broken-image icons where real content should be, with the underlying data (an engagement count, a caption) still completely intact and correct.

A feature that reads real external data (thumbnails collected from a connected social account) inherits that data's real hosting locations, which can span the app's own storage, a shared internal API domain, AND a third party's content-delivery network, all at once.

The fix's own scope matters as much as the fact of the fix: widening a security policy to accept any secure source at all closes the visible symptom but opens a much larger one — a data-exfiltration channel through any future defect that lets an attacker influence what image address gets rendered.

How the real hosting locations were measured, and why the fix is a named list, not a blank check

The social reporting screen displays a library of creative thumbnails pulled from a connected social account's own post history. The security policy protecting that screen restricted images to the app's own host plus generic in-page data sources — a policy that would be entirely correct if the thumbnails themselves lived on the app's own host. They do not, and the gap was closed by measuring, not assuming: querying the real, live creative library directly showed 2,113 of 2,235 thumbnails stored in the platform's own file storage (a different host than the app itself), 49 more on a separate, shared API domain, and the remainder on the social network's own content-delivery network, the original source the creatives were collected from in the first place. Under the original policy, every one of those 2,235 images would have been refused outright by the browser the instant a real person opened the screen.

The fix deliberately does not solve this by widening the policy to accept any secure image source at all. The commit's own reasoning is explicit about why: an image's address is not a passive detail, it is an active request the browser makes on the page's behalf, and a security policy that accepts image data from anywhere effectively hands any future unrelated defect — a cross-site-scripting bug, an injection point nobody has found yet — a ready-made channel to leak real data out disguised as a request for an image. So the fix names the four specific hosts the real, measured data uses today: the app's own host, the project's own file storage, the shared API domain, and the social network's own content-delivery network — deliberately narrow, deliberately tied to what was actually measured rather than what might theoretically be needed someday.

A second, smaller finding from the same investigation is folded into this same fix: the social network's own content-delivery addresses are not permanent — they expire over time by the network's own design, meaning a thumbnail that displays correctly today can legitimately go blank months later even though nothing about Dash itself changed. Left unexplained, that would read as a silent data-loss bug to anyone who noticed it later. The screen now states this directly: the engagement numbers next to a blank thumbnail remain fully real and intact, and a blank frame reflects an expired external image address, not lost data.

What is actually built today

Centriu Dash's image security policy names the exact, measured hosts real creative thumbnails come from — the app's own host, the project's own file storage, the shared API domain, and the social network's own content-delivery network — instead of a single restrictive default that never matched the real data.

The policy deliberately does not accept image sources from any secure host generally, specifically to avoid turning an open image policy into a data-exfiltration channel for an unrelated future defect.

The social reporting screen now explains, directly in its own interface, that a blank thumbnail can reflect an expired external content-delivery address rather than lost data — the underlying engagement figures are unaffected either way.

The fix is scoped to the exact hosts measured against the real, live creative library at the time of the fix — not a speculative list of every host that might someday be relevant.

No change to how a creative thumbnail is collected, stored, or displayed — the fix is entirely in which sources the browser is permitted to load an image FROM, governed by the security policy header.

Every other restriction in the same security policy (scripts, connections, frames) is unchanged — this fix is scoped specifically to the image-source rule that measurably did not match reality.

A library of real creative performance data, rendered as blank tiles (illustrative framing of the actual measured finding)

An agency opens Dash's social reporting screen to review which creative performed best in the last 30 days. Before the fix, the engagement numbers, captions and rankings all load correctly — but every single thumbnail next to them fails to render, refused outright by the browser's own security check, because none of the real image addresses match the narrow policy the page was sending. After the fix, the identical screen renders every thumbnail from its real, measured location — the app's own storage, the shared API domain, or the social network's own content-delivery network — exactly as the underlying data always intended.

What changes operationally

Centriu Dash's own security policy for images now matches where real creative thumbnails are actually hosted, measured directly against the live library rather than assumed — closing a gap where every one of 2,235 real thumbnails would have rendered as a broken image, invisibly to a build, a typecheck, or a test suite.

When this is not the right fit

This automation governs which image hosts Dash's own security policy allows a browser to load from — it does not change how a creative is collected from a connected social account, and it does not prevent a thumbnail from going blank when the SOURCE network's own content-delivery address expires by that network's own design.

A wide-open image policy vs. a policy tied to what the real data actually uses

Fixing a blocked-image problem by widening a security policy to accept any secure source at all is the fastest possible fix, and also the one that trades a visible bug for an invisible risk — an open image-source policy is a standing channel any future, unrelated vulnerability could use to move real data out disguised as an image request. Centriu's fix instead measured exactly where the real data lives today and named those specific hosts, closing the visible defect without opening a door that has nothing to do with fixing it.

Related systems

Main system: Centriu Dash.

What it does NOT do

  • Does not widen Dash's image security policy to accept sources beyond the specific, measured hosts real creative data uses today — a deliberate choice to avoid creating a broader data-exfiltration risk.
  • Does not prevent a thumbnail from eventually going blank when the social network's OWN content-delivery address expires — that expiration is controlled by the external network, not by Dash.
  • Does not affect the underlying engagement data, captions or rankings tied to a creative — those remain fully intact and correct regardless of whether a specific thumbnail is currently rendering.
  • Does not retroactively audit every other image or asset type across the platform for the same class of policy mismatch — this fix is scoped to the social reporting screen's creative-thumbnail library specifically identified in this investigation.
  • Does not change any other restriction in the same security policy (scripts, network connections, frames) — the fix is scoped to the image-source rule alone.
  • Does not replace an agency's own monitoring of whether a specific connected social account's data is displaying correctly.

Security and governance

Dash's image security policy now allows loading only from the specific, named hosts real creative data is measured to use, deliberately avoiding a broad rule that could otherwise be used to exfiltrate data through an unrelated future defect. Any business or client data referenced remains subject to Brazil's LGPD (Law No. 13,709/2018). Full detail on access control lives at /governanca and /iso.

Pricing and contracting

Available by monthly subscription, with tiered plans. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).

Frequently asked questions

Would this have actually broken the creative library?

Yes — measured directly, zero of the 2,235 real thumbnails in the library lived on the one host the original policy allowed; every one would have rendered as a broken image.

Why not just allow any secure image source and avoid the problem entirely?

Because an image address is a channel a browser will follow — an unrestricted policy would let any future, unrelated security defect leak real data out disguised as a request for an image.

What hosts does the policy allow now?

The exact four hosts measured against the real, live creative library: the app's own host, the project's own file storage, a shared API domain, and the social network's own content-delivery network.

Why would a thumbnail still go blank sometimes after this fix?

The social network's own content-delivery addresses expire over time by that network's own design — the screen now explains this directly, and the underlying engagement data is unaffected.

Did this affect anything other than images?

No — every other rule in the same security policy (scripts, connections, frames) was already correct and is unchanged by this fix.

What does Centriu Dash cost?

It is sold by subscription with a published starting price — exact current values are on the central pricing page.

See how Centriu Dash keeps real creative thumbnails loading safely

Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.

Sources

  1. Centriu Dash — public product page — Centriu, 2026-07-20 · link(primária)
  2. Centriu Dash — public factsheet (API, JSON) — Centriu, 2026-07-21 · link
  3. Law No. 13,709/2018 — Brazil’s General Data Protection Law (LGPD) — Presidência da República (Brazil), 2018-08-14 · link

Last material update on .

By · AI-assisted production, with human review