Social Dolphin Services
SDS · Field notes

The first question after a CVE drops is "am I even running that?"

A flaw hijacked 700 websites. The patch had been out for months.

Type
Field note
Date
26 May 2026
Audience
Founders and operators who own software

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.

Why "are we running that?" is the question most teams answer slowly

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.

How we actually answered it for our own products

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.

The whole exercise took a couple of minutes of an agent reading code it already understood. The output was not "probably fine." It was a specific, explainable answer: we are not at risk from CVE-2026-26980, because we do not run Ghost, and here is the search that proves it. A security answer you cannot explain is just a feeling.

Where reading the code stops and real scanning starts

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:

  • It does not find flaws in your own code. A SQL injection or a broken access check that you wrote has no package name to search for. Finding those needs real static analysis, code review, and dynamic testing against the running app. That is the slower, more disruptive work, and it is irreplaceable.
  • It is triage, not a complete inventory. Reading source for an obvious platform like Ghost is reliable because you would know if you ran it. For a vulnerability buried in a deeply nested dependency you have never heard of, a proper software bill of materials and a dedicated dependency scanner are more exhaustive than any quick read.
  • The durable defense is automation, not heroics. We keep our dependencies current with automated pull requests that the build verifies before anything merges. That is what keeps you off the list of 700 in the first place. The fast triage read is what you do the day the headline lands; the automation is what makes that day boring.
Reading the code is the cheap, fast, non-disruptive first pass that tells you whether the headline even applies to you. Scanning and review are the deeper passes you still run on a schedule. The first one buys you calm in minutes. The rest buy you actual coverage.

What this article is not

  • Not a claim that we replaced security scanning with a chatbot. We have not, and you should be suspicious of anyone who says they have.
  • Not a takedown of Ghost. Ghost is a good product, it disclosed and patched the flaw responsibly, and the sites that got hit were running unpatched software, which is a different problem than a bad platform.
  • Not a promise that "are we running it" is always a two-minute answer. It is fast when your code is readable and your environment is honestly documented. If your systems are a fog of undocumented servers, the first work is making them legible, and that is an engagement in itself.

One-sentence takeaway

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.

Talk to us

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.

Sources