Bezpečnostní upozornění k pluginu Link Library
Pokud jste ode mě dostali e-mail odkazující na tuto stránku, je to proto, že váš web zřejmě
používá verzi pluginu Link Library (WordPress plugin od Yannicka Lefebvrea, který se ve
vašich souborech nachází v /wp-content/plugins/link-library/), jež spadá do rozsahu verzí
dotčených známým bezpečnostním problémem. Tato stránka vysvětluje, o jaký problém jde, jak
zjistit, jakou verzi máte, jak aktualizovat a co udělat poté.
Problém je evidován jako CVE-2026-16532, neautentizované SQL injection dosažitelné skrze zpracování odesílaných odkazů v pluginu. Týká se každého vydání před 7.9.3 a je opraven ve verzi 7.9.3. Aktuálním vydáním v době psaní je 7.9.4, které opravu rovněž obsahuje. Pokud používáte cokoli staršího než 7.9.3, aktualizujte Link Library na 7.9.3 nebo novější.
Jednu věc je třeba říct jasně: neexistuje starší verze, která by byla bezpečná. Nejde o chybu, která by byla v určitém okamžiku historie pluginu zanesena a pak opravena. Zranitelný kód je přítomen v každém zveřejněném vydání, které se mi podařilo prověřit, až po tu nejstarší verzi, kterou adresář WordPress.org stále poskytuje. „Moje instalace je příliš stará, než aby se jí to týkalo” tu jako únik neposlouží. Jediné verze, kterých se to netýká, jsou 7.9.3 a novější.
Neméně důležité: toto upozornění nezávisí na tom, jak máte web nastavený. Link Library obsahuje formulář, kterým mohou návštěvníci navrhovat odkazy, a přirozeně se nabízí předpoklad, že web je ohrožen jen tehdy, pokud takový formulář někam na stránky skutečně umístil. Ten předpoklad je mylný. Dotčený kód běží při každém běžném požadavku na veřejné části webu, ať už jste formulář pro odesílání odkazů někdy zveřejnili, nebo ne, a výchozí nastavení pluginu tomu nebrání. Pokud váš web běží na dotčené verzi, je dosažitelný. Tečka.
Jde o chybu pluginu, nikoli o chybu jádra WordPressu. Zcela aktuální WordPress vás neochrání, pokud je samotný plugin Link Library v dotčené verzi.
Je tato zpráva legitimní?
Ano. Jde o upozornění v duchu odpovědného zveřejňování, v dobré víře, od nezávislého bezpečnostního výzkumníka. Nežádám vás o peníze, hesla ani přístup k webu a nepokoušel jsem se do něj proniknout, nic mu poslat ani cokoli zneužít.
Jen jsem si prohlédl veřejně viditelné soubory, které váš web poskytuje každému návštěvníkovi (stejně jako je veřejná vaše úvodní stránka), a poznamenal si číslo verze, které plugin zveřejňuje. Výslovně jsem neodeslal nic do funkce pluginu pro odesílání odkazů, ani na vašem webu, ani na žádném jiném, a nic na této kontrole se nedotýká vašich dat, vaší administrace ani žádné soukromé části webu (podrobněji v části Co jsem udělal a co ne níže).
Pokud si chcete ověřit, kdo jsem, kontakty najdete v dolní části této stránky a na stránce O mně.
Proč na tom záleží
Link Library sestavuje a zobrazuje na vašem webu adresáře odkazů a umí přijímat návrhy odkazů od návštěvníků. Právě ve zpracování návrhů tento problém sídlí.
V dotčených verzích plugin při zpracování odeslaného odkazu ověřuje, zda takový odkaz už existuje, a databázový dotaz k tomu sestavuje vložením odeslaných hodnot přímo do něj. Hodnoty se sice ošetřují pro zobrazení, ale nejsou ošetřeny pro použití v SQL a dotaz běží bez připraveného výrazu. Důsledkem je, že nepřihlášený návštěvník může tento dotaz pozměnit a vyčíst data z databáze vašeho webu. Verze 7.9.3 dotaz přepisuje tak, aby používal připravený výraz, což problém uzavírá.
Abych zopakoval to, co je uvedeno hned v úvodu, protože právě to nejspíš svádí k falešnému uklidnění: ohrožení nezávisí na tom, zda je formulář pro odesílání odkazů někde na vašem webu zveřejněn. Cesta kódu, která odeslání zpracovává, naslouchá při každém požadavku na veřejné části webu a vše, co požadavek potřebuje, aby se k ní dostal, lze získat ze samotného pluginu, aniž by na kterékoli stránce existoval jakýkoli formulář. Zda je váš web ohrožen, závisí na jediné věci: na verzi, kterou používáte.
Také stojí za to být přesný v tom, co tento problém je a co není. Umožňuje útočníkovi číst data z databáze. To je samo o sobě závažné, protože databáze WordPressu obsahuje věci jako e-mailové adresy uživatelů a hashovaná hesla a na některých webech i záznamy o zákaznících nebo členech. Není to však samo o sobě vzdálené spuštění kódu, převzetí webu ani způsob, jak si útočník může přidělit účet správce. Je to užší než problémy s úplnou kompromitací, o kterých píšu jinde, a raději nastavím měřítko poctivě, než abych ve vás zanechal děsivější dojem, než jaký fakta podporují.
Popisuji to na úrovni, kterou majitel webu potřebuje k tomu, aby mohl jednat, a dál ne. Nezveřejňuji podrobnosti, které by někomu umožnily problém reprodukovat, a prosil bych vás, abyste to nezkoušeli na svém ani na cizím webu. Přečtení čísla vaší verze, jak je popsáno níže, vám řekne vše, co potřebujete k rozhodnutí, co dělat.
Pokud můj e-mail zmiňoval tento problém, znamená to, že verze, kterou váš web hlásí, je starší než 7.9.3. Netestoval jsem, zda je zrovna váš web zneužitelný; pozoroval jsem pouze verzi.
Týká se to mě?
Vše se scvrkává na jednu otázku: jakou verzi pluginu Link Library používáte?
Ve správcovské části WordPressu (rozhodující zdroj):
- Přihlaste se do nástěnky WordPressu (obvykle
vasedomena.cz/wp-admin). - Přejděte na Pluginy a poté Instalované pluginy.
- Najděte Link Library, položku, jejíž složka je
link-library, a přečtěte si verzi uvedenou pod jejím názvem.
Z veřejného manifestu (bez přihlášení): otevřete v prohlížeči
vasedomena.cz/wp-content/plugins/link-library/readme.txt. Řádek Stable tag: poblíž
začátku je verze, kterou vaše instalace hlásí, a je to týž veřejný soubor, který jsem četl.
U tohoto pluginu jsem ověřil, že u všech nedávných vydání odpovídá skutečně vydanému kódu,
takže jde o spolehlivou kontrolu.
Jedna kontrola, která u tohoto pluginu nefunguje, takže se na ni prosím nespoléhejte. Pokud
jste zvyklí odečítat verze pluginů z čísla ?ver= připojeného ke skriptu nebo stylu ve zdroji
stránky, tady vás to zavede špatným směrem. Čísla verzí u adres souborů tohoto pluginu jsou
zmrazené verze přibalených knihoven třetích stran (hodnoty jako 4.0.1, 1.0.0 nebo 1.3.9),
nebo verze jádra WordPressu. Žádné z nich není verzí pluginu a porovnávat kterékoli z nich
s 7.9.3 nedává smysl. Použijte správcovskou obrazovku nebo readme.txt.
Ještě jeden zvláštní případ: některé velmi staré instalace mají v readme.txt uvedeno
Stable tag: trunk. To vůbec není číslo verze. Pokud to uvidíte, použijte raději správcovskou
obrazovku pluginů a považujte instalaci za zasaženou, dokud vám obrazovka neřekne jinak,
protože instalace dost stará na to, aby uváděla trunk, je zcela jistě starší než 7.9.3.
Pak použijte toto pravidlo:
- Cokoli staršího než 7.9.3: zasaženo. Aktualizujte. Neexistuje žádná hranice, pod níž by se starší vydání stalo znovu bezpečným.
- 7.9.3 nebo novější: již opraveno. Opravu obsahuje i aktuální vydání 7.9.4.
Jak aktualizovat
Plugin je zdarma, stále je zveřejněný a aktivně udržovaný, takže oprava je běžná aktualizace. Nejbezpečnější cestou je aktualizovat přímo přes WordPress a předtím si udělat zálohu:
- Zazálohujte si web (soubory i databázi), než začnete cokoli měnit. Většina hostingů nabízí zálohy na jedno kliknutí, případně použijte zálohovací plugin pro WordPress.
- V administraci WordPressu přejděte na Nástěnka a poté Aktualizace, nebo na Pluginy a poté Instalované pluginy. Pokud je aktualizace pluginu Link Library v seznamu, nainstalujte ji odsud.
- Pokud dáváte přednost příkazové řádce, WP-CLI dělá totéž:
wp plugin update link-library. - Pokud se žádná aktualizace neobjeví, nejnovější vydání získáte přímo ze stránky pluginu v adresáři WordPress.org, Link Library, a aktualizujete přes Pluginy, poté Instalace pluginů a Nahrát plugin.
- Po aktualizaci si podle kroků výše ověřte nové číslo verze (7.9.3 nebo novější) a zkontrolujte, že se vaše adresáře odkazů stále zobrazují a chovají se normálně.
Když už u toho budete, vyplatí se ověřit, že jádro WordPressu a vaše ostatní pluginy jsou aktuální, protože tentýž princip platí pro všechny.
Po aktualizaci
Aktualizace na 7.9.3 nebo novější problém uzavírá: kontrola při odeslání nyní běží jako připravený výraz, takže odeslané hodnoty jsou brány jako data, nikoli jako součást dotazu.
Co aktualizace nedokáže, řečeno opatrně. Aktualizace zabrání tomu, aby se z vaší databáze do budoucna cokoli četlo. Nedokáže vzít zpět nic, co už mohlo být přečteno v době, kdy byl web v dotčené verzi. Nemám žádný přehled o tom, zda se to na vašem webu stalo, a nezjišťoval jsem to; většiny webů v dotčeném rozsahu se nejspíš nikdy nikdo nedotkl. Protože vám to však nemohu říct s jistotou, je namístě trocha opatrnosti, úměrná tomu, co vaše databáze obsahuje:
- Pokud je váš web běžný publikační web, kde databáze obsahuje vaše příspěvky, stránky a hrstku uživatelských účtů, rozumným krokem je nechat uživatele (a zvláště správce) změnit hesla. WordPress ukládá hesla hashovaná, nikoli v otevřené podobě, ale hashe slabých hesel lze prolomit mimo web, takže nové heslo tuto starost odstraní.
- Pokud váš web uchovává cokoli citlivějšího (záznamy o členech, údaje o zákaznících, API klíče nebo jiné přihlašovací údaje uložené pluginy), berte i tyto jako hodné výměny.
- Opětovné vygenerování bezpečnostních klíčů a „saltů” WordPressu v
wp-config.php(nové hodnoty jsou na jedno kliknutí v oficiálním generátoru klíčů) jednorázově odhlásí všechny uživatele a zneplatní případné odcizené tokeny relací.
Aby bylo jasno v tom, jak to celé chápat: jde o opatření, nikoli o prohlášení, že vaše data byla odcizena. Toto upozornění vychází z čísla verze, nikoli z jakéhokoli důkazu o útoku.
Co jsem udělal a co ne
Abych byl zcela transparentní ohledně kontroly, která stojí za mým e-mailem: četl jsem pouze
veřejné soubory, které váš web už tak poskytuje každému návštěvníkovi, konkrétně veřejný soubor
readme.txt pluginu a vaši úvodní stránku. Nepřistupoval jsem k administraci WordPressu,
k databázi ani k žádné soukromé části webu.
Především jsem nikdy nic neodeslal do funkce pluginu pro odesílání odkazů, ani na vašem webu, ani nikde jinde. Nic nebylo odesláno, uloženo, testováno ani zneužito. Tady na tom záleží víc než u většiny těchto stránek, protože právě zpracování odesílaných odkazů je to, čeho se tento problém týká, takže „nedotkl jsem se toho” je celý rozdíl mezi zveřejněním a průnikem.
Záměrně také nezveřejňuji podrobnosti, které by někomu pomohly tohoto problému využít. Popis výše končí na úrovni, kterou majitel webu potřebuje, a neodkazuji na žádný ukázkový kód.
Jde o pozorování založené na verzi: váš web hlásí verzi starší než 7.9.3. Web v tomto rozsahu už může být chráněn jinými prostředky, například webovým aplikačním firewallem nebo zpětně portovanou opravou. Toto upozornění není tvrzením, že váš web byl v době mé kontroly zneužitelný.
Nemám webmastera / nevím, kudy dál
Pokud web nespravujete vy, přepošlete prosím tuto stránku tomu, kdo to dělá (vašemu vývojáři, agentuře nebo hostingu). Výše uvedené kroky rychle pozná.
Pokud web spravujete sami a zaseknete se, rád vás nasměruji, zdarma. Ozvěte se pomocí kontaktů níže.
Kontakt
Evan Harris, bezpečnostní výzkumník
- E-mail: security@mail.mcpsec.dev
- X: @Evan__Harris
- GitHub: eharris128
- LinkedIn: Evan Harris
Kontaktuji provozovatele ohledně takových věcí výhradně proto, abych jim pomohl zabezpečit weby. Pokud si nepřejete být kontaktováni znovu, stačí dát vědět a budu to respektovat.
Odkazy
Oficiální hlášení a sledování
Dodavatel / plugin