A flaw hijacked 700 websites. The patch had been out for months.
Last week a critical flaw in Ghost CMS, the publishing platform behind a lot of company blogs and newsrooms, got weaponized at scale. The bug is CVE-2026-26980: an unauthenticated SQL injection in Ghost versions 3.24.0 through 6.19.0 that lets an attacker read straight out of the site database, including the admin API key. With that key, the attackers injected malicious JavaScript into articles and turned visitors into targets for a "ClickFix" malware lure. Researchers counted more than 700 hijacked domains, including pages at Harvard, Oxford, and DuckDuckGo.
Here is the part that should bother you more than the attack itself: the fix shipped months earlier. The vulnerability was disclosed in February and patched in Ghost 6.19.1. The 700 sites were not hit because the problem was unknowable. They were hit because nobody upstream of them had a fast, confident answer to a very simple question.
When a story like this crosses my feed, the question I get from clients is some version of "are we exposed to this one?" And the honest first move is not to launch a scan. It is to answer a smaller, faster question first: are we even running the affected thing? This piece is about why that question is the cheapest security work you will ever do, and how we answer it for our own products in the time it takes to read this paragraph.
A CVE is a claim about a specific piece of software. CVE-2026-26980 is not a statement about "websites." It is a statement about Ghost, a particular application with a particular database layer. If you do not run Ghost, this specific flaw cannot touch you, no matter how scary the headline is.
That sounds obvious. The problem is that most organizations cannot answer "do we run Ghost?" quickly or with confidence. The knowledge lives in someone's head, in a half-current inventory spreadsheet, or nowhere at all. So the headline lands, somebody gets nervous, and the response is either to do nothing and hope, or to spin up a full vulnerability scan and wait for a window when disrupting production is acceptable. Both are slow. One is a gamble.
The reason this matters is that the gap between disclosure and exploitation keeps shrinking. The Ghost flaw sat patched for months and still caught 700 sites, because "is this us?" never got asked in a way that produced a clear answer. The triage question is not a substitute for patching. It is the thing that tells you, in minutes, whether you need to care at all.
When the Ghost story broke, I asked one of our agents to check our own house. We run a handful of production apps, the same way we run engagements for clients. Here is what "checking" actually meant, and why it was fast.
The exploit has a precondition you can describe precisely: the target runs Ghost. And Ghost leaves fingerprints in a codebase. Its official packages are namespaced under @tryghost. Its content and admin APIs are reached at /ghost/api/ paths. Its software development kits show up as GhostContentAPI and GhostAdminAPI in the code. If none of those fingerprints exist anywhere in your source, you are not running Ghost, full stop.
So that is what we looked for. We read our actual code, every app we operate, and searched for every one of those fingerprints. We found none. Every one of our apps is built on a completely different stack, a modern React framework with a Postgres database behind a managed data layer, where queries are parameterized rather than stitched together as raw strings. The specific injection vector in the Ghost flaw does not exist in that architecture.
We went one step further, because the honest version of triage looks for the thing that could embarrass you. We publish a company blog. A blog is exactly the kind of surface that might be running a CMS like Ghost. So we checked it specifically: our blog is not a content management system at all. It is a static site, generated from plain text files at build time, with no live admin panel and no database sitting behind it to inject into. Nothing for this CVE to grab.
Now the honest part, because overclaiming on security is how you lose the trust you were trying to build.
Reading the code answers one class of question extremely well: "are we affected by a known vulnerability in a known piece of software?" When the precondition is binary, when you either run the thing or you do not, an agent that already understands your whole codebase settles it fast, with reasoning you can hand to a board or a client. That is genuinely valuable, and it is the question that comes up most often when a CVE makes the news.
It does not replace vulnerability scanning, and I would not let anyone tell you it does. Three honest limits:
When the next vulnerability makes the news, the cheapest and fastest security move is to answer "are we even running the affected thing?" by reading your own code, and an environment that can answer that in minutes is one you actually understand.
If a security headline ever sent your team into a scramble to figure out whether it applied to you, that scramble is the symptom worth fixing. Send us the last CVE that made you nervous and the rough shape of what you run. In a 30-minute call we will walk through how we would answer "is this us?" for your environment, and tell you honestly whether the slower scanning work is where your real exposure is.
We do not take every engagement, and we will tell you on the call whether we are the right partner.