Один HTTP-запрос к публичному Content API - и атакующий забирает Admin API Key без единого credential. Не надо ничего брутить, не надо фишить админа, не надо даже знать, что сайт на Ghost. Просто crafted запрос к эндпоинту, который торчит наружу by design.
За три месяца после выхода патча более 700 доменов - включая площадки Harvard, Oxford и DuckDuckGo - превратились в платформу раздачи инфостилеров через ClickFix-цепочку. По данным QiAnXin XLab, как минимум две независимые группы атакующих конкурируют за контроль над заражёнными сайтами: удаляют скрипты друг друга и внедряют собственный код, иногда по несколько раз за сутки на одном домене. Прямо как два граффитиста на одной стене.
CVE-2026-26980 - CVSS 9.4 Critical, EPSS 0.70 (Top 1% по вероятности эксплуатации). Одна непараметризованная строка в CMS запускает цепочку от blind SQLi до выполнения PowerShell на машине конечного пользователя. Разберём, как это работает и как ловить.
Бизнес-логика атаки: зачем превращать блоги в оружие
Зачем злоумышленнику блог университета или техническая площадка SaaS-компании? Доверие домена. Классический фишинг через случайный домен фильтруется почтовыми шлюзами и вызывает подозрение у пользователя. Фейковая CAPTCHA на сайте Harvard - нет. Браузер не ругается, URL выглядит легитимно, SSL-сертификат валидный.Атакующий монетизирует цепочку через два вектора.
Первый - массовое распространение стилеров. Посетитель доверенного домена выполняет PowerShell-команду через ClickFix-приманку, на машину попадает инфостилер. Дальше - кража сессионных токенов, паролей из браузера, аутентификационного материала. Второй - повторное использование скомпрометированной инфраструктуры. Украденные Admin API Key и конфигурация Ghost CMS могут использоваться для lateral movement в другие бизнес-системы той же организации. Loader на заражённых страницах обращается к C2 - payload меняется без повторного взлома: сегодня стилер, завтра майнер, послезавтра browser exploit kit.
Для организации-владельца это репутационный ущерб, утечка данных посетителей, регуляторные последствия. Для пентестера на проекте - готовый вектор initial access с полным административным контролем над контентом клиентского сайта.
CVE-2026-26980: анатомия SQL-инъекции в Ghost CMS
Техническая механика Ghost CMS SQL injection
Ghost CMS - Node.js-платформа с открытым кодом, 50 000+ звёзд на GitHub, популярная среди университетов, медиа и техкомпаний. Уязвимость CVE-2026-26980 (CWE-89, Injection, категория OWASP A03:2021 - Injection) затрагивает версии с 3.24.0 по 6.19.0 включительно. Исправлена в 6.19.1, выпущенной 19 февраля 2026 года.Ключевые параметры:
| Параметр | Значение |
|---|---|
| CVSS 3.1 | 9.4 Critical |
| Вектор | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L |
| EPSS | 0.70, percentile 99.29 - Top 1% |
| CWE | CWE-89 (SQL Injection) |
| Affected | ghost (npm) 3.24.0 - 6.19.0 |
| Fix | ghost 6.19.1 |
Разбор CVSS-вектора: сетевой доступ (AV:N), низкая сложность эксплуатации (AC:L), привилегии не требуются (PR:N), взаимодействие пользователя не требуется (UI:N). Воздействие - высокая компрометация конфиденциальности и целостности (C:H, I:H), низкое воздействие на доступность (A:L). Короче - зайти может кто угодно, без пароля, из интернета.
По данным Cloud Security Alliance, уязвимость сидит в модуле
slug-filter-order.js - входном сериализаторе Content API. Значение slug из параметра запроса подставлялось напрямую в SQL-конструкцию ORDER BY через конкатенацию строк вместо параметризованного binding. Content API по архитектуре Ghost публичный и не требует аутентификации - Content API Key встроен прямо в HTML темы. Эксплуатация не требует ни учётных данных, ни предварительной разведки - достаточно одного crafted HTTP-запроса к публичному endpoint.Атакующий отправляет запрос с blind SQLi payload в параметре slug/order и посимвольно извлекает произвольные данные из БД. Главная цель - Admin API Key.
Публичный PoC доступен в репозитории
n0bitaemon/CVE-2026-26980-PoC на GitHub. Эксплойт также зарегистрирован в Exploit-DB под номером EDB-52555 (автор Maksim Rogov, дата публикации - 7 мая 2026). GitHub Security Advisory - GHSA-w52v-v783-gw97 от 16 февраля 2026.Почему Admin API Key - единственная точка отказа
В архитектуре Ghost два типа ключей. Content API Key - read-only, для фронтенда, только чтение опубликованного контента. Admin API Key - полный административный доступ: создание, редактирование, удаление постов, управление пользователями, темами и настройками сайта. Через endpointPUT /ghost/api/admin/posts/:id/ можно модифицировать статьи напрямую - без входа в дашборд, без MFA, без какого-либо интерактивного взаимодействия.Архитектурная проблема: Admin API Key хранится в той же базе данных, которую обслуживает публичный Content API. Любая уязвимость на чтение данных в Content API автоматически компрометирует административные credential. Классическое нарушение принципа разделения credential storage и публично доступных query paths - OWASP A01:2021 (Broken Access Control). По сути, ключ от сейфа лежит в прихожей.
Контекст применимости: [Внешний пентест, black box] Любая self-hosted Ghost CMS 3.24.0-6.19.0. Ghost(Pro) managed hosting обновляется автоматически и не подвержен атаке. WAF с generic SQLi-сигнатурами может заблокировать базовые payload'ы, но blind SQLi через ORDER BY-параметр обходит многие WAF, не настроенные на фильтрацию ordering-параметров Content API. На практике Cloudflare WAF в дефолтной конфигурации пропускал этот вектор - ordering-параметры просто не попадали в ruleset.
Атаки на CMS через уязвимости: полная цепочка от SQLi до малвари
Kill chain кампании по данным XLab разворачивается в пять этапов. Маппинг на MITRE ATT&CK:
| Этап | Действие | MITRE ATT&CK |
|---|---|---|
| 1 | Blind SQLi через Content API, извлечение Admin API Key | Exploit Public-Facing Application (T1190, Initial Access) |
| 2 | Модификация статей через Admin API, внедрение JS-loader | Valid Accounts (T1078, Persistence) - легитимный API-ключ |
| 3 | JS-loader загружает cloaking-скрипт с C2 | JavaScript (T1059.007, Execution) |
| 4 | Фейковая Cloudflare CAPTCHA, жертва копирует PowerShell-команду | Malicious Copy and Paste (T1204.004, Execution), PowerShell (T1059.001, Execution) |
| 5 | Загрузка стилера на машину посетителя | Ingress Tool Transfer (T1105, Command and Control) |
Двухстадийный loader стоит разобрать отдельно. Первая стадия - минимальный JS-фрагмент, вшитый в тело статьи через Admin API. Он кодирует origin сайта через
btoa(window.location.origin) и обращается к C2. В первой волне атак использовался endpoint clo4shara[.]xyz/11z77u3.php, во второй волне (с 16 мая) - com-apps[.]cc. C2 возвращает traffic distribution script - типичный cloaking-механизм, который собирает fingerprint посетителя и решает, показывать payload или нет.Обновлённая версия loader'а использует
localStorage браузера для отслеживания - cloaking-скрипт выполняется только один раз на устройство. Это снижает вероятность повторного детекта и усложняет жизнь аналитикам: зашёл второй раз - ничего не происходит. Для атакующего профит очевиден: смена payload на C2 не требует повторного взлома сайта. Один loader, 700+ заражённых доменов, бесконечная ротация нагрузки.По данным SentinelOne, активная эксплуатация CVE-2026-26980 фиксировалась с конца февраля 2026 - через 8 дней после выхода патча. Временная метка компиляции одного из DLL-файлов датирована 16 февраля - за три дня до публикации патча. Кто-то знал о баге раньше, чем вышел фикс.
ClickFix атака на веб-сайт: как работает социальная инженерия через доверенный домен
ClickFix - техника, при которой посетителю предлагают "подтвердить, что он человек", выполнив действие на своей машине. Цепочка в этой кампании: посетитель открывает статью на доверенном Ghost-сайте -> JS-loader подгружает cloaking-скрипт -> тот fingerprint'ит браузер -> при прохождении фильтров отображает iframe с фейковой Cloudflare-верификацией поверх контента. Пользователю предлагают открыть диалог Run (Win+R), вставить предоставленную команду и нажать Enter. Команда загружает и запускает вредоносную нагрузку.Это MITRE ATT&CK T1204.004 (Malicious Copy and Paste, Execution) - жертва сама выполняет вредоносную команду. Browser-level защиты обойдены, большинство endpoint-решений молчат, потому что исполнение инициировано пользователем. Техника работает именно потому, что миллионы людей приучены к легитимным Cloudflare-проверкам и не воспринимают их как угрозу. Мы сами натренировали пользователей нажимать на эти чекбоксы.
По данным XLab, в кампании использовались три типа payload'ов. DLL-loader'ы (
installer.dll) - с валидными code-signing сертификатами PuTTY client, что затрудняет детектирование на endpoint. JavaScript-дропперы (notepadplusplus.js). Electron-based infostealer (UtilifySetup.exe) - сбор сессионных токенов, credential из браузеров и аутентификационного материала с заражённых Windows-систем. 16 мая XLab зафиксировала новый installer.dll с нулём детектов на VirusTotal. Ноль из 70+ движков.Для blue team тут несколько неприятных моментов. ClickFix обходит стандартные email security gateway (атака идёт через веб, не через почту). Обходит browser isolation (команда выполняется вне браузера). Обходит endpoint detection, если пользователь сам запустил процесс. Детектирование возможно на сетевом уровне - DNS-резолвинг C2-доменов - и через анализ запущенных процессов: PowerShell с подозрительными аргументами после Win+R.
Обнаружение ClickFix кампании: практические методы для SQL-инъекции в CMS
Анализ логов на стороне сервера
Если Ghost CMS работала на любой версии с 3.24.0 по 6.19.0 после февраля 2026 - считайте её скомпрометированной, даже если в admin-панели всё чисто. Инъекция loader'а выполняется через Admin API, а не через редактор. В визуальном интерфейсе вы ничего не увидите.Первый шаг - проверка логов Admin API. Ищите вызовы
PUT /ghost/api/admin/posts/:id/ с нетипичных IP-адресов:
Bash:
grep "PUT /ghost/api/admin/posts" /var/log/nginx/access.log | awk '{print $1, $4, $7}' | sort | uniq -c | sort -rn | head -20
Дополнительно проверьте Content API на аномальные запросы с ordering-параметрами - именно через них шла эксплуатация SQLi. В Nginx-логах это запросы к
/ghost/api/content/ с необычно длинными query string в параметрах filter или order.Аудит контента на уровне базы данных
Проверять контент нужно именно на уровне БД, не через Ghost-редактор. Injected JS обычно сидит в конце HTML-тела статьи и может быть невидим в визуальном редакторе. Для MySQL/MariaDB:
SQL:
SELECT id, title, updated_at FROM posts
WHERE html LIKE '%<script%clo4shara%'
OR html LIKE '%<script%com-apps%'
OR html LIKE '%btoa(window.location.origin)%';
updated_at: оно покажет, когда именно была модифицирована статья. Сравните с вашим последним легитимным редактированием.Детектирование на сетевом уровне
На стороне корпоративной сети ClickFix-активность ловится по исходящим запросам к cloaking-доменам. Ключевые IoC по данным XLab:Threat Actor A: домены
clo4shara[.]xyz и com-apps[.]cc. Threat Actor B: XLab идентифицировала вторую группу с отдельным набором инъекционных характеристик - IoC опубликованы в полном техническом отчёте XLab.Для Elastic 8.x+ с Network Module - мониторинг DNS-резолвинга этих доменов через правило корреляции. CrowdStrike Falcon с DNS-мониторингом покроет тот же вектор. Для Splunk потребуется корреляция DNS-логов с proxy-логами по timestamp и source IP.
Ограничение детекта: cloaking-скрипт фильтрует посетителей по browser fingerprint. Если ваш анализатор трафика или SIEM-сенсор распознаётся как бот - ClickFix payload не отдаётся. Для верификации реплицируйте запрос с реалистичным User-Agent и типичным набором браузерных заголовков. Headless Chrome с дефолтными настройками не прокатит - cloaking его видит.
Чеклист: защита CMS от SQL-инъекций и реагирование на Ghost CMS уязвимость CVE
Готовый чеклист - можно включить в отчёт по пентесту или передать администратору как есть:
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Отдельная деталь, которая многое говорит о будущем. По данным CSA, уязвимость нашёл не пентестер при ручном ревью кода. Исследователь Anthropic Николас Карлини направил Claude на кодовую базу Ghost с задачей искать уязвимости. Через примерно 90 минут автономного анализа LLM идентифицировала blind SQLi в
slug-filter-order.js. Карлини ответственно раскрыл находку, Ghost выпустил патч 19 февраля. Но между патчем и массовой эксплуатацией прошло 77 дней - за которые сотни администраторов не обновились.AI сокращает время от кодовой базы до готового CVE с дней до часов. Атакующие подхватывают публичные PoC за считанные дни после disclosure. А на другом конце - self-hosted Ghost на сервере маркетингового отдела, который никто не мониторит и не патчит, потому что "это же просто блог".
Три месяца на критический CVE с EPSS в Top 1% - непозволительно. 8 дней от патча до первых признаков эксплуатации по данным SentinelOne. Окно сужается, и эта кампания это подтверждает числами.
Кто обслуживает self-hosted CMS - Ghost, WordPress, Joomla - и до сих пор не включил CMS-инфраструктуру в тот же цикл патч-менеджмента, что и ОС с сетевым оборудованием, рискует стать следующей строчкой в отчёте XLab. CMS - это не "блог для маркетологов". Это полноценный attack surface с API, базой данных и прямым сетевым доступом. Проверьте свою Ghost-инсталляцию прямо сейчас -
ghost version и SQL-запрос из раздела выше. Если версия ниже 6.19.1 и в базе нашлись чужие скрипты - у вас та же проблема, что и у Harvard.
Последнее редактирование модератором: