Sigurnosna obavijest za Content Views
Ako ste od mene primili e-poruku koja upućuje na ovu stranicu, to je zato što se čini da vaše
web-mjesto koristi verziju dodatka Content Views – Post Grid & Filter (WordPress dodatak
autora Content Views / PT Guy, koji se u vašim datotekama nalazi na putanji
/wp-content/plugins/content-views-query-and-display-post-page/) koja spada u zahvaćeni raspon
poznatog sigurnosnog propusta. Ova stranica objašnjava u čemu je propust, kako procijeniti koliko
je važan za vaše web-mjesto, kako pravilno očitati svoju verziju bez zabune te kako se ažurirati.
Riječ je o propustu CVE-2026-15361, SQL injekciji u obradi pregleda unutar dodatka. Zahvaća svako izdanje starije od 4.5 i ispravljena je u verziji 4.5, objavljenoj 28. srpnja 2026. Ako koristite bilo što starije od 4.5, ažurirajte Content Views na verziju 4.5.1 ili noviju, koja je trenutačno izdanje u vrijeme pisanja (4. kolovoza 2026.). Za ovaj propust nije objavljena CVSS ocjena, pa vam je neću navesti, i nisam upoznat ni s kakvim javno dostupnim kodom za iskorištavanje.
Ne postoji starija verzija koja je sigurna. Ovo nije propust koji je uveden negdje usred povijesti dodatka i naknadno ispravljen. Provjerio sam svaku objavljenu oznaku izdanja u povijesti dodatka, od najranije iz 2014. do verzije 4.4, i zahvaćeni kod nalazi se u svima njima. Tvrdnja „moja je instalacija prestara da bi bila zahvaćena” ovdje ne vrijedi kao izlaz. Jedine verzije koje nisu zahvaćene jesu 4.5 i novije.
Prije svega, kvalifikacija koja odlučuje koliko je ovo važno za vaše web-mjesto, jer je radije želim navesti nego dopustiti da obavijest zvuči ozbiljnije nego što jest: ovaj propust može iskoristiti samo netko tko je prijavljen na vaše web-mjesto. Nije važno što njegov račun inače smije raditi, dovoljna je i najniža WordPressova uloga, ali račun je nužan. Dakle, pitanje koje odlučuje o vašoj izloženosti nije nikakva postavka u dodatku, nego tko može dobiti račun na vašem web-mjestu. Verziju vašeg dodatka mogu očitati iz javne datoteke, i mogu vidjeti poslužuje li WordPress svoju standardnu stranicu za registraciju, ali ne mogu vidjeti tko posjeduje račune na vašem web-mjestu, pa je ova obavijest preventivno upozorenje, a ne potvrđen nalaz o vama.
Uočite i što ta kvalifikacija nije. Ne postoji opcija koju možete isključiti, značajka koju možete ukloniti s objave, niti postavka koja vas izvodi iz zahvaćenog raspona. Zahvaćeni rukovatelj registriran je na svakoj instalaciji zahvaćene verzije, bez obzira jeste li ikada postavili mrežu objava na neku stranicu. Ako budete tražili kućicu za isključivanje, nećete je pronaći, jer ona ne postoji. Ažuriranje je ispravak.
Nekoliko riječi o hitnosti, jer je ova obavijest uvjetna. Ako ste jedina osoba s računom na web-mjestu i nitko drugi ga ne može dobiti, ažuriranje je uobičajeno održavanje dodatka. Ako vaše web-mjesto prihvaća registracije drugih ljudi, molim vas da to shvatite kao prioritet, i imajte na umu da registracije poprimaju više oblika od očitog: WooCommerce trgovina, dodatak za članstvo ili forum, blog s više autora i prilagođena stranica za registraciju svi stvaraju račune, a da pritom WordPressov vlastiti obrazac za registraciju nikada nije uključen.
Ako vaša WordPress stranica za registraciju jest otvorena posjetiteljima i ona vam nije potrebna, njezino isključivanje razuman je privremeni korak, jer sužava krug onih koji ovo mogu doseći. Ipak, molim vas nemojte to shvatiti kao potvrdu da je sve u redu. Zatvaranje registracije zatvara samo jedna od nekoliko vrata do računa i ne rješava ništa u vezi s računima koji već postoje. Ažuriranje dodatka jest ono što stvarno uklanja propust.
Vrijedi biti precizan i oko toga što ovaj propust jest, a što nije. On omogućuje osobi s niskopriviligiranim računom da čita podatke iz baze podataka vašeg web-mjesta koje njezin račun ne bi smio vidjeti. To je vrijedno ispravljanja, jer WordPressova baza podataka sadrži stvari poput e-adresa korisnika i hashiranih lozinki, a na nekim web-mjestima i podatke o članovima ili kupcima. No to nije preuzimanje administratorskog računa, nije način da si netko sam dodijeli administratorski račun, i nije udaljeno izvršavanje koda. Uže je od propusta koji dovode do potpunog kompromitiranja o kojima pišem na drugim mjestima, i radije ću iskreno postaviti razmjere nego vam ostaviti dojam strašniji od onoga što činjenice podupiru.
Ovo je propust dodatka, a ne jezgre WordPressa. Potpuno ažuriran WordPress ne štiti vas ako je sam dodatak Content Views na zahvaćenoj verziji.
Je li ova poruka vjerodostojna?
Jest. Riječ je o dobronamjernoj obavijesti u duhu odgovornog objavljivanja, od nezavisnog sigurnosnog istraživača. Ne tražim od vas novac, lozinke ni pristup web-mjestu i nisam pokušao u njega provaliti, registrirati se na njemu niti bilo što iskoristiti.
Pogledao sam samo stranice i datoteke koje vaše web-mjesto poslužuje svakom posjetitelju (jednako kao što je vaša naslovnica javna) i zabilježio broj verzije koji objavljuje dodatak. Jedna od stranica koje sam pročitao bila je standardna WordPress stranica za registraciju na vašem web-mjestu, kako bih vidio je li otvorena posjetiteljima, i čitanje je sve što sam s njom učinio. Izričito nisam poslao taj obrazac, nisam stvorio račun, nisam se prijavio i nisam poslao ništa zahvaćenoj značajki. Ništa u ovoj provjeri ne dira vaše podatke, vašu administraciju ni bilo koji privatni dio web-mjesta (više u odjeljku Što sam učinio, a što nisam u nastavku).
Ako želite provjeriti tko sam, kontakt podaci nalaze se na dnu ove stranice i na stranici O meni.
Zašto je to važno
Content Views na vašem web-mjestu gradi mreže objava, popise i pomične prikaze, tako da možete prikazati filtriran izbor objava ili stranica bez pisanja ikakvog koda. Dio toga kako to postiže jest rukovatelj zahtjeva koji iz zadanih postavki iscrtava pregled mreže.
U zahvaćenim verzijama taj rukovatelj provjerava sigurnosni token i time stane. Nikada ne provjerava smije li osoba koja šalje zahtjev uopće njime koristiti, a dotični token nije tajna: dodatak ga objavljuje svakom posjetitelju web-mjesta. Rukovatelj zatim gradi upit prema bazi podataka od postavki preuzetih izravno iz zahtjeva. Posljedica je da netko tko posjeduje ništa više od najniže priviligiranog računa na vašem web-mjestu može usmjeriti taj upit i pročitati podatke iz vaše baze podataka koje njegov račun nema nikakva posla vidjeti.
Preduvjet, ponavljam ga jer je dio koji se najlakše krivo shvati u oba smjera: račun, a ne konfiguracija. Ništa ne treba biti uključeno da bi rukovatelj bio dosežan, i ne postoji postavka koja zahvaćenu verziju izvodi iz zahvaćenog raspona. Ono što stoji između zahvaćene instalacije i ovog propusta jednostavno je pitanje može li se netko osim vas prijaviti. Na web-mjestu na kojem se svatko može registrirati, to nije neka velika prepreka. Na web-mjestu na kojem ste vi jedini korisnik, to jest stvarna prepreka.
A druga strana medalje, koja je jednako važna: web-mjesto sa zatvorenim WordPressovim obrascem za registraciju time nije sigurno. Računi dolaze mnogim putovima, i svaki od njih je dovoljan.
Ovo opisujem na razini koja je vlasniku web-mjesta potrebna da bi postupio, i ništa dalje. Ne objavljujem pojedinosti koje bi nekome omogućile da to reproducira i molim vas da to ne pokušavate ni na vlastitom ni na tuđem web-mjestu. Očitavanje broja vaše verzije, kako je opisano u nastavku, govori vam sve što trebate da biste odlučili što učiniti.
Ako je moja e-poruka navela ovaj propust, to znači da je verzija koju vaše web-mjesto prijavljuje starija od 4.5. Nisam provjeravao je li baš vaše web-mjesto iskoristivo i ne mogu vidjeti tko na njemu ima račune. Sve što sam opazio jest verzija, te poslužuje li se vaša stranica za registraciju posjetiteljima.
Jesam li zahvaćen?
Sve se svodi na jedno pitanje: koju verziju dodatka Content Views koristite?
Kratka napomena o tome o kojem je dodatku riječ, budući da se naziv dijeli s drugim proizvodom.
Ova obavijest odnosi se na besplatni dodatak objavljen na WordPress.org, onaj čija je mapa
content-views-query-and-display-post-page. Isti proizvođač zasebno prodaje i Pro liniju. Ako je
mapa vašeg dodatka upravo ta, nastavite čitati.
Iz administracije WordPressa (mjerodavan izvor):
- Prijavite se u nadzornu ploču WordPressa (obično na
yourdomain.com/wp-admin). - Idite na Dodaci, zatim Instalirani dodaci.
- Pronađite Content Views – Post Grid & Filter, stavku čija je mapa
content-views-query-and-display-post-page, i pogledajte verziju prikazanu ispod njezina naziva.
Iz javnog manifesta (bez prijave): otvorite
yourdomain.com/wp-content/plugins/content-views-query-and-display-post-page/README.txt
u pregledniku i pročitajte redak Stable tag: blizu vrha. Ovo je jedan od dva javna izvora
koje sam pročitao.
Pripazite na velika slova u tom nazivu datoteke. WordPress dodaci uobičajeno isporučuju
datoteku malim slovima, readme.txt, i tu adresu većina ljudi po navici i upiše. Paketi 4.x
verzije ovog dodatka isporučuju datoteku pod nazivom README.txt, velikim slovima, pa na
poslužitelju koji razlikuje velika i mala slova adresa malim slovima vraća 404 i izgleda kao da
datoteka ne postoji. Ona postoji. Prije nego što zaključite bilo što, pokušajte s inačicom pisanom
velikim slovima.
Iz izvornog koda vaše stranice (bez prijave): pogledajte izvorni kod svoje naslovnice i potražite vlastite resurse dodatka za klijentsku stranu, točno na ovim putanjama:
/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=...
Broj uz ?ver= pridodan tim datotekama vlastita je verzija dodatka. Na standardnoj
instalaciji one se učitavaju na svakoj stranici na klijentskoj strani, bez obzira prikazuje li se
na njoj mreža objava ili ne, pa je vaša naslovnica obično dovoljna. Na vrlo starim instalacijama
iste se dvije datoteke zovu public.js i public.css, i na njih se primjenjuje isto pravilo.
Zamka koju ovdje treba izbjeći, a lako je u nju upasti. Ovaj dodatak isporučuje ugrađene
primjerke nekoliko knjižnica treće strane unutar vlastite mape dodatka, a svaka od njih nosi
svoj vlastiti, posve nepovezan broj verzije. Izvorni kod vaše stranice može prikazivati Bootstrap u
verziji 3.3.5 ili 3.3.0, Select2 u verziji 3.4.5, html5shiv u verziji 3.7.0, respond.js u verziji
1.4.2 i bootstrap-paginator u verziji 0.5, sve na putanjama koje počinju mapom dodatka Content
Views. Operater koji u izvornom kodu stranice pretraži mapu dodatka i pročita prvu vrijednost
?ver= na koju naiđe lako može steći dojam da je dodatak na verziji „3.3.5”, a zatim se zapitati
kako se to uspoređuje s verzijom 4.5. To se uopće ne uspoređuje. Broj poput 3.3.5 ili 0.5 na
putanji bootstrap ili select2 verzija je posve drugog softvera. Verziju čitajte isključivo s
cv.js ili cv.css (ili s public.js / public.css na vrlo staroj instalaciji), a svaku drugu
vrijednost ?ver= na stranici zanemarite.
Ako iz izvornog koda stranice uopće ne možete dobiti čitljiv broj, to je uobičajeno i ne znači
ništa posebno: dodaci za predmemoriranje i optimizaciju rutinski uklanjaju vrijednost ?ver= s
adresa resursa ili spajaju datoteke u jedinstvenu skriptu. U tom je slučaju README.txt pouzdano
javno štivo, a zaslon u administraciji iz prve provjere uvijek daje odgovor.
Zatim primijenite ovo pravilo, imajući na umu da se verzije uspoređuju brojčano, a ne abecedno, pa bi 4.10 bila novija od 4.9 iako kao tekst izgleda manje:
- Bilo što starije od 4.5: zahvaćeno. Ažurirajte. Ne postoji granica ispod koje starije izdanje ponovno postaje sigurno.
- 4.5 ili novije: već ispravljeno u pogledu ovog propusta. Trenutačno izdanje u vrijeme pisanja jest 4.5.1, i preuzimanje najnovije dostupne verzije najbolji je potez.
Kako se nadograditi
Dodatak je besplatan, i dalje se objavljuje i aktivno se održava, pa je ispravak uobičajeno ažuriranje. Najsigurniji je put ažurirati se kroz sam WordPress, uz prethodnu sigurnosnu kopiju:
- Napravite sigurnosnu kopiju web-mjesta (datoteke i baza podataka) prije bilo kakvih promjena. Većina pružatelja hostinga nudi sigurnosne kopije u jednom kliku, ili upotrijebite dodatak za sigurnosne kopije WordPressa.
- U administraciji WordPressa idite na Nadzorna ploča, zatim Ažuriranja, ili na Dodaci, zatim Instalirani dodaci. Ako je navedeno ažuriranje za Content Views, instalirajte ga odavde.
- Ako vam je draža naredbena linija, WP-CLI radi isto:
wp plugin update content-views-query-and-display-post-page(naredba koristi naziv mape, a ne prikazani naziv). - Ako se ažuriranje ne pojavi, najnovije izdanje možete preuzeti izravno sa stranice dodatka u katalogu WordPress.org, Content Views – Post Grid & Filter, i ažurirati preko Dodaci, zatim Dodaj novi dodatak, zatim Prenesi dodatak.
- Nakon ažuriranja potvrdite novi broj verzije (4.5.1 ili noviji) prema gornjim koracima i provjerite prikazuju li se vaše mreže objava i eventualni filtri na njima i dalje ispravno.
Kad ste već tu, vrijedi provjeriti jesu li jezgra WordPressa i vaši ostali dodaci ažurni, jer isto načelo vrijedi za sve njih.
Nakon ažuriranja
Ažuriranje na verziju 4.5.1 ili noviju zatvara propust, i za većinu je web-mjesta to cijeli zadatak. Ova je stranica preventivna obavijest, a ne izvještaj o incidentu: nemam uvid u to je li se na vašem web-mjestu išta dogodilo i nisam gledao.
Dvije sitnice vrijedi obaviti dok je ažuriranje svježe:
- Potvrdite da se verzija stvarno promijenila, koristeći koju god od gornjih provjera vam je bila najjednostavnija, i učitajte stranicu koja prikazuje jednu od vaših mreža objava kako biste provjerili prikazuje li se i dalje ispravno.
- Ako ste imali otvorenu WordPress registraciju, a ona vam nije potrebna, razmislite o njezinu zatvaranju. To je opća higijena, a ne ispravak ovog propusta, koji je ažuriranje već obradilo, i vrijedi imati na umu da drugi dodaci na vašem web-mjestu mogu svejedno stvarati račune.
Primijetit ćete da na ovoj stranici nema popisa za provjeru tipa „pretpostavite da ste kompromitirani”, i to je namjerno, a ne propust. Ono što ovaj propust omogućuje jest čitanje baze podataka dosežno s niskopriviligiranog računa. Nikome ne predaje administratorski račun i ne izvršava kod na vašem poslužitelju, pa revizija administratorskih računa i vježba rotacije lozinki koje preporučujem nakon propusta koji dovodi do preuzimanja ovdje ne bi bile razmjerne. Ažurirajte, potvrdite i nastavite dalje.
Što sam učinio, a što nisam
Radi potpune transparentnosti o provjeri iza moje e-poruke, evo je u cijelosti. Pročitao sam stranice i datoteke koje vaše web-mjesto već poslužuje svakom posjetitelju:
- vašu naslovnicu i adrese resursa upisane na njoj;
- javnu datoteku dodatka
README.txtunutarwp-content/plugins/content-views-query-and-display-post-page/; - standardnu WordPress stranicu za registraciju na vašem web-mjestu, na adresi
/wp-login.php?action=register, kako bih vidio je li otvorena posjetiteljima. To je objavljena stranica, i čitanje je sve što sam s njom učinio.
Nisam poslao taj obrazac za registraciju, nisam stvorio račun i nisam se prijavio na vaše web-mjesto. Nisam poslao ništa zahvaćenoj značajki. Ta mi je posljednja točka najvažnija za pojasniti: propust je SQL-injekcijski „sink”, a slanje tereta prema tuđoj bazi podataka nije nešto što ovaj projekt radi, ni u laboratoriju ni u produkciji. Ništa nije poslano, testirano ni iskorišteno, i ništa nije dotaknulo vašu WordPress administraciju, vašu bazu podataka ni bilo koji privatni dio web-mjesta.
Također namjerno ne objavljujem pojedinosti koje bi nekome pomogle iskoristiti ovaj propust. Gornji opis staje na razini koja je vlasniku web-mjesta potrebna, i ne povezujem nikakav kôd za dokaz koncepta.
Ovo je opažanje utemeljeno na verziji: vaše web-mjesto prijavljuje verziju stariju od 4.5. To nije tvrdnja da je vaše web-mjesto u trenutku moje provjere bilo iskoristivo. Budući da korištenje ovog propusta zahtijeva da netko bude prijavljen, a ja ne mogu vidjeti tko posjeduje račune na vašem web-mjestu, web-mjesto u zahvaćenom rasponu vrlo dobro može uopće ne biti izloženo, a web-mjesto u tom rasponu može zasebno biti zaštićeno i drugim sredstvima, primjerice vatrozidom za web-aplikacije ili naknadno ugrađenim ispravkom.
Nemam webmastera / zapeo sam
Ako web-mjesto ne održavate vi, proslijedite ovu stranicu osobi koja to čini (vašem programeru, agenciji ili pružatelju hostinga). Gornje će korake brzo prepoznati.
Ako web-mjesto održavate sami i zapnete, rado ću vas besplatno usmjeriti u pravom smjeru. Javite se putem kontakata u nastavku.
Kontakt
Evan Harris, sigurnosni istraživač
- E-pošta: security@mail.mcpsec.dev
- X: @Evan__Harris
- GitHub: eharris128
- LinkedIn: Evan Harris
Javljam se povodom ovakvih pitanja isključivo kako bih pomogao operaterima da osiguraju svoja web-mjesta. Ako ne želite da vas ponovno kontaktiram, samo mi recite i poštovat ću to.
Izvori
Službene objave i praćenje
Proizvođač / dodatak