Bezpečnostní upozornění k pluginu Content Views
Pokud jste ode mě obdrželi e-mail, který vás odkazuje na tuto stránku, je to proto, že se zdá, že
váš web běží na verzi pluginu Content Views – Post Grid & Filter (plugin pro WordPress od
Content Views / PT Guy, který se nachází ve vašich souborech na cestě
/wp-content/plugins/content-views-query-and-display-post-page/), která spadá do ovlivněného
rozsahu známého bezpečnostního problému. Tato stránka vysvětluje, o jaký problém jde, jak zjistit,
kolik toho pro váš web znamená, jak správně zjistit vaši verzi bez zmatení a jak provést
aktualizaci.
Jedná se o chybu CVE-2026-15361, SQL injection v obsluze náhledů pluginu. Postihuje každé vydání starší než 4.5 a je opravena ve verzi 4.5, vydané 28. července 2026. Pokud používáte cokoliv staršího než 4.5, aktualizujte Content Views na verzi 4.5.1 nebo novější, což je aktuální vydání v době psaní tohoto textu (4. srpna 2026). Pro tento problém není zveřejněno žádné skóre CVSS, takže vám žádné nebudu uvádět, a nejsem si vědom žádného veřejně dostupného kódu pro jeho zneužití.
Neexistuje žádná starší verze, která by byla bezpečná. Nejedná se o chybu, která by byla zavedena někde v polovině historie pluginu a později opravena. Zkontroloval jsem každé zveřejněné vydání v historii pluginu, od prvního z roku 2014 až po 4.4, a postižený kód je přítomen ve všech z nich. Argument „moje instalace je příliš stará na to, aby byla postižena” zde neplatí. Jediné verze, které postiženy nejsou, jsou 4.5 a novější.
Než cokoli dalšího, kvalifikátor, který rozhoduje o tom, kolik toho pro váš web znamená, protože bych ho raději uvedl, než abych nechal upozornění vyznít závažněji, než ve skutečnosti je: tuto chybu může zneužít pouze osoba přihlášená na váš web. Nezáleží na tom, co její účet běžně smí dělat, stačí i nejnižší role, kterou WordPress nabízí, ale účet mít musí. Otázka, která tedy rozhoduje o vaší exponovanosti, není žádné nastavení v pluginu, je to kdo může na vašem webu získat účet. Verzi vašeho pluginu mohu zjistit z veřejného souboru a mohu zjistit, zda WordPress zobrazuje svou standardní registrační stránku, ale nevidím, kdo má na vašem webu účty, takže toto upozornění je preventivním varováním, nikoliv potvrzeným zjištěním o stavu vašeho webu.
Všimněte si, čím tento kvalifikátor není. Neexistuje žádná možnost, kterou by šlo vypnout, žádná funkce, kterou by šlo zrušit, a žádné nastavení, které by vás z rozsahu vyjmulo. Postižená obsluha je registrována na každé instalaci postižené verze bez ohledu na to, zda jste kdy na stránku umístili post grid. Pokud budete hledat zaškrtávací políčko, které byste mohli vypnout, žádné nenajdete, protože žádné neexistuje. Aktualizace je řešením.
Slovo k naléhavosti, protože se jedná o podmíněné upozornění. Pokud jste jediná osoba s účtem na webu a nikdo jiný účet získat nemůže, je aktualizace běžnou údržbou pluginu. Pokud váš web umožňuje registraci ostatním lidem, považujte to prosím za prioritu, a mějte na paměti, že registrace mají více podob než tu očividnou: obchod na WooCommerce, plugin pro členství nebo fórum, blog s více autory a vlastní registrační stránka, to vše vytváří účty, aniž by se do toho kdy zapojil vlastní registrační formulář WordPressu.
Pokud máte otevřenou registrační stránku WordPressu pro návštěvníky a nepotřebujete ji, jejím vypnutím uděláte rozumný dočasný krok, protože to zúží okruh těch, kdo se k tomuto mohou dostat. Nečtěte to ale prosím jako čisté potvrzení bezproblémovosti. Uzavření registrace uzavírá pouze jedny z několika dveří k účtu a nic nedělá s účty, které již existují. Skutečně tento problém odstraňuje pouze aktualizace pluginu.
Za zmínku také stojí přesně vymezit, čím tento problém je a čím není. Umožňuje osobě s nízkoprivilegovaným účtem číst z databáze vašeho webu data, která by její účet vidět neměl. Za opravu to stojí, protože databáze WordPressu obsahuje například e-mailové adresy uživatelů a hashovaná hesla, a na některých webech i záznamy o členech nebo zákaznících. Není to ale ovládnutí administrátorského účtu, není to způsob, jak by si někdo mohl sám přidělit administrátorská práva, a není to vzdálené spuštění kódu. Je to užší problém než ty případy úplného kompromitování, o kterých píšu jinde, a raději bych stanovil rozsah přesně, než abych vám nechal dojem horší, než odpovídá faktům.
Jedná se o chybu pluginu, nikoliv jádra WordPressu. Plně aktualizovaný WordPress vás nechrání, pokud je samotný plugin Content Views na postižené verzi.
Je tato zpráva legitimní?
Ano. Jedná se o zprávu o zodpovědném odhalení chyby od nezávislého bezpečnostního výzkumníka, která vychází z dobré víry. Nežádám vás o peníze, hesla ani přístup k vašemu webu a nepokoušel jsem se do něj vlomit, zaregistrovat se na něm ani cokoli zneužít.
Jen jsem se podíval na stránky a soubory, které váš web poskytuje každému návštěvníkovi (stejným způsobem, jakým je veřejná vaše domovská stránka), a zaznamenal jsem číslo verze, které plugin zveřejňuje. Jednou ze stránek, které jsem četl, byla standardní registrační stránka vašeho webu na WordPressu, abych zjistil, zda je otevřená pro návštěvníky, a přečtení je vše, co jsem s ní udělal. Konkrétně jsem neodeslal tento formulář, nevytvořil jsem účet, nepřihlásil jsem se a nic jsem neposlal postižené funkci. Žádná část této kontroly se nedotýká vašich dat, administrátorské oblasti ani žádné soukromé části vašeho webu (více pod Co jsem udělal a co ne níže).
Pokud byste chtěli ověřit, kdo jsem, podívejte se na kontaktní údaje na konci této stránky a na stránku O mně.
Proč na tom záleží
Content Views vytváří na vašem webu mřížky, seznamy a rotující výpisy příspěvků, takže můžete zobrazit vybraný výběr příspěvků nebo stránek, aniž byste museli psát jakýkoli kód. Součástí toho, jak to plugin dělá, je obsluha požadavků, která vykresluje náhled mřížky podle zadaného nastavení.
V postižených verzích tato obsluha zkontroluje bezpečnostní token a tím to skončí. Nikdy nezkontroluje, zda osoba odesílající požadavek má oprávnění tuto funkci používat, a dotyčný token navíc není tajný: plugin ho zveřejňuje každému návštěvníkovi webu. Obsluha poté sestaví databázový dotaz z nastavení převzatého přímo z požadavku. Důsledkem je, že kdokoli s nejnižším možným oprávněným účtem na vašem webu může tento dotaz nasměrovat a přečíst si z vaší databáze data, která by jeho účet neměl vidět.
Podmínka, kterou stojí za to zopakovat, protože je to část, u níž hrozí nejsnazší mylný výklad jedním či druhým směrem: účet, nikoliv nastavení. Nic nemusí být zapnuto, aby byla obsluha dosažitelná, a neexistuje žádné nastavení, které by postiženou verzi vyjmulo z rozsahu. Jediné, co stojí mezi postiženou instalací a tímto problémem, je jednoduše to, zda se dokáže přihlásit ještě někdo jiný než vy. Na webu, kde se může zaregistrovat kdokoli, to není velká překážka. Na webu, kde jste jediným uživatelem, jde o skutečnou překážku.
A druhá strana téže mince, která je stejně důležitá: web s uzavřeným registračním formulářem WordPressu není tím pádem v bezpečí. Účty přicházejí mnoha cestami a stačí kterákoli z nich.
Popisuji to na úrovni, kterou potřebuje majitel webu k rozhodnutí, a ne dále. Nezveřejňuji podrobnosti, které by někomu umožnily chybu zopakovat, a žádám vás, abyste se ji nepokoušeli vyzkoušet na svém webu ani na webu kohokoli jiného. Přečtení čísla verze, jak je popsáno níže, vám řekne vše, co potřebujete k rozhodnutí.
Pokud můj e-mail odkazoval na tento problém, znamená to, že verze, kterou váš web uvádí, je starší než 4.5. Neověřoval jsem, zda je váš konkrétní web zranitelný, a nemohu vidět, kdo na něm má účty. Vše, co jsem pozoroval, je verze a to, zda je vaše registrační stránka zobrazována návštěvníkům.
Týká se to mě?
Rozhoduje o tom jediná otázka: kterou verzi Content Views používáte?
Slovo k tomu, o který plugin jde, protože tento název je sdílený. Toto upozornění se týká
bezplatného pluginu zveřejněného na WordPress.org, jehož složka je
content-views-query-and-display-post-page. Tentýž dodavatel prodává i samostatnou řadu Pro.
Pokud je i vaše složka pluginu tato, čtěte dál.
Z administrace WordPressu (autoritativní):
- Přihlaste se do administrace WordPressu (obvykle na adrese
yourdomain.com/wp-admin). - Přejděte na Pluginy a poté Nainstalované pluginy.
- Najděte Content Views – Post Grid & Filter, položku, jejíž složka je
content-views-query-and-display-post-page, a poznamenejte si verzi uvedenou pod jejím názvem.
Z veřejného manifestu (nepotřebujete se přihlásit): otevřete v prohlížeči
yourdomain.com/wp-content/plugins/content-views-query-and-display-post-page/README.txt
a přečtěte si řádek Stable tag: poblíž vrchu. Toto je jeden ze dvou veřejných zdrojů, které
jsem četl.
Dejte pozor na velká písmena v tomto názvu souboru. Pluginy pro WordPress obvykle zveřejňují
soubor readme.txt malými písmeny, a to je adresa, kterou by z zvyku napsala většina lidí. Balíčky
verze 4.x tohoto pluginu ale dodávají soubor jako README.txt velkými písmeny, takže na hostingu
rozlišujícím velikost písmen adresa malými písmeny vrátí chybu 404 a vypadá to, že soubor
neexistuje. Existuje. Než z toho něco vyvodíte, zkuste variantu velkými písmeny.
Ze zdrojového kódu vaší stránky (nepotřebujete se přihlásit): zobrazte zdrojový kód vaší domovské stránky a hledejte vlastní front-endové assety pluginu přesně na těchto cestách:
/wp-content/plugins/content-views-query-and-display-post-page/public/assets/js/cv.js?ver=...
/wp-content/plugins/content-views-query-and-display-post-page/public/assets/css/cv.css?ver=...
Číslo ?ver= připojené k těmto souborům je vlastní verzí pluginu. Na výchozí instalaci se
načítají na každé stránce na frontendu bez ohledu na to, zda se na ní zobrazuje post grid, takže
obvykle stačí vaše domovská stránka. Na velmi starých instalacích se tytéž dva soubory jmenují
public.js a public.css a platí pro ně stejné pravidlo.
Past, které je třeba se zde vyhnout, a je to snadné past. Tento plugin přibaluje kopie
několika knihoven třetích stran přímo do vlastní složky pluginu, a každá z nich má vlastní,
zcela nesouvisející číslo verze. Zdrojový kód vaší stránky může zobrazovat Bootstrap ve verzi
3.3.5 nebo 3.3.0, Select2 ve verzi 3.4.5, html5shiv ve verzi 3.7.0, respond.js ve verzi 1.4.2 a
bootstrap-paginator ve verzi 0.5, a to vše na cestách, které začínají složkou pluginu Content
Views. Provozovatel, který ve zdrojovém kódu stránky vyhledá složku pluginu a přečte první
hodnotu ?ver=, na kterou narazí, může snadno nabýt dojmu, že plugin je ve verzi „3.3.5”, a pak
se ptát, jak se to má k 4.5. Vůbec se to nesrovnává. Číslo jako 3.3.5 nebo 0.5 na cestě bootstrap
nebo select2 je verzí jiného softwaru. Čtěte verzi pouze ze souborů cv.js nebo cv.css (nebo
public.js / public.css na velmi staré instalaci) a všechny ostatní hodnoty ?ver= na stránce
ignorujte.
Pokud se vám nepodaří získat čitelné číslo ze zdrojového kódu stránky vůbec, je to běžné a
neznamená to nic zvláštního: cachovací a optimalizační pluginy běžně odstraňují hodnotu ?ver=
z adres assetů, nebo soubory sloučí do jednoho kombinovaného skriptu. V takovém případě je
README.txt spolehlivým veřejným zdrojem a obrazovka administrace z prvního bodu vždy obsahuje
odpověď.
Poté použijte toto pravidlo a mějte na paměti, že verze se porovnávají číselně, nikoliv abecedně, takže 4.10 by bylo novější než 4.9, i když to jako text vypadá menší:
- Cokoliv starší než 4.5: postiženo. Aktualizujte. Neexistuje žádná hranice, pod kterou by se starší vydání stalo znovu bezpečným.
- 4.5 nebo novější: co se tohoto problému týká, již opraveno. Aktuální vydání v době psaní tohoto textu je 4.5.1 a nejlepším krokem je použít nejnovější dostupnou verzi.
Jak aktualizovat
Plugin je zdarma, stále zveřejňovaný a aktivně udržovaný, takže oprava je běžnou aktualizací. Nejbezpečnější cestou je aktualizace přímo prostřednictvím WordPressu a předtím provedení zálohy:
- Zálohujte svůj web (soubory i databázi) před provedením jakýchkoli změn. Většina poskytovatelů hostingu nabízí zálohování jedním kliknutím, nebo můžete použít plugin pro zálohování WordPressu.
- V administraci WordPressu přejděte na Dashboard a poté na Aktualizace, nebo na Pluginy a poté na Nainstalované pluginy. Pokud je zde uvedena aktualizace Content Views, nainstalujte ji odtud.
- Pokud preferujete příkazovou řádku, WP-CLI provede totéž:
wp plugin update content-views-query-and-display-post-page(příkaz používá název složky, ne zobrazovaný název). - Pokud se žádná aktualizace neobjeví, můžete si stáhnout nejnovější vydání přímo ze stránky pluginu v adresáři WordPress.org, Content Views – Post Grid & Filter, a aktualizovat přes Pluginy, poté Přidat nový plugin a Nahrát plugin.
- Po aktualizaci potvrďte nové číslo verze (4.5.1 nebo novější) pomocí výše uvedených kroků a zkontrolujte, že se vaše mřížky příspěvků a případné filtry na nich stále zobrazují normálně.
Zatímco jste v administraci, vyplatí se ověřit, že jádro WordPressu a vaše ostatní pluginy jsou aktuální, protože stejný princip platí pro všechny z nich.
Po aktualizaci
Aktualizací na verzi 4.5.1 nebo novější je problém vyřešen a pro většinu webů je tím úkol hotov. Tato stránka je preventivním upozorněním, nikoliv hlášením o incidentu: nemám žádný přehled o tom, zda se na vašem webu něco stalo, a ani jsem to nekontroloval.
Dvě drobnosti stojí za to udělat, dokud je aktualizace čerstvá:
- Potvrďte, že se verze skutečně změnila, pomocí kterékoli z výše uvedených kontrol, která byla nejsnazší, a načtěte stránku, na které se zobrazuje jedna z vašich mřížek příspěvků, abyste se ujistili, že se stále vykresluje.
- Pokud jste měli otevřenou registraci WordPressu a nepotřebujete ji, zvažte její uzavření. Jde o obecnou hygienu, ne o opravu tohoto problému, kterou už aktualizace vyřešila, a stojí za to připomenout, že jiné pluginy na vašem webu mohou vytvářet účty bez ohledu na to.
Všimnete si, že na této stránce není žádný kontrolní seznam „předpokládejte, že jste byli kompromitováni”, a to je záměr, ne opomenutí. Tento problém přináší čtení z databáze dosažitelné z nízkoprivilegovaného účtu. Nepředává nikomu administrátorský účet a nespouští kód na vašem serveru, takže administrátorský audit a rotace hesel, které doporučuji po chybě vedoucí k ovládnutí účtu, by zde nebyly přiměřené. Aktualizujte, potvrďte a pokračujte dál.
Co jsem udělal a co ne
Pro úplnou transparentnost ohledně kontroly, která stála za mým e-mailem, zde je celý její popis. Četl jsem stránky a soubory, které váš web již poskytuje každému návštěvníkovi:
- vaši domovskou stránku a adresy assetů do ní zapsané;
- veřejný soubor
README.txtpluginu uvnitřwp-content/plugins/content-views-query-and-display-post-page/; - standardní registrační stránku vašeho webu na WordPressu na adrese
/wp-login.php?action=register, abych zjistil, zda je otevřená pro návštěvníky. Jde o zveřejněnou stránku a přečtení je vše, co jsem s ní udělal.
Neodeslal jsem tento registrační formulář, nevytvořil jsem účet a nepřihlásil jsem se na váš web. Neposlal jsem nic postižené funkci. Tento poslední bod chci uvést nejjasněji: tento problém je místem pro SQL injection a odeslání payloadu na cizí databázi není něco, co by tento projekt dělal, ani v laboratoři, ani v produkci. Nic nebylo odesláno, testováno ani zneužito a nic se nedotklo vaší administrátorské oblasti WordPressu, vaší databáze ani žádné soukromé části webu.
Úmyslně také nezveřejňuji podrobnosti, které by pomohly někomu tento problém zneužít. Popis výše končí na úrovni, kterou potřebuje vlastník webu, a neodkazuji na žádný kód pro demonstraci zranitelnosti.
Jedná se o pozorování založené na verzi: váš web hlásí verzi starší než 4.5. Není to tvrzení, že váš web byl v době kontroly zranitelný. Protože zneužití tohoto problému vyžaduje, aby byl někdo přihlášen, a nevidím, kdo má na vašem webu účty, web v postiženém rozsahu nemusí být vůbec exponovaný, a web v tomto rozsahu může být navíc chráněn jinými prostředky, jako je webová aplikační brána nebo zpětně portovaná oprava.
Nemám webmastera / nevím, kudy dál
Pokud nejste osobou, která web udržuje, prosím, přesměrujte tuto stránku na toho, kdo to dělá (vašeho webového vývojáře, agenturu nebo poskytovatele hostingu). Rychle poznají výše uvedené kroky.
Pokud web udržujete sami a zaseknete se, rád vám zdarma pomůžu najít správný směr. Kontaktujte mě pomocí kontaktních údajů níže.
Kontakt
Evan Harris, bezpečnostní výzkumník
- E-mail: security@mail.mcpsec.dev
- X: @Evan__Harris
- GitHub: eharris128
- LinkedIn: Evan Harris
O takových problémech vás kontaktuji čistě proto, abych pomohl provozovatelům zabezpečit jejich weby. Pokud byste raději nechtěli, abych vás znovu kontaktoval, stačí mi dát vědět a budu to respektovat.
Odkazy
Oficiální hlášení a sledování
Dodavatel / plugin