{"id":214,"date":"2026-02-11T16:40:09","date_gmt":"2026-02-11T15:40:09","guid":{"rendered":"https:\/\/helloblog.io\/hr\/kriticna-ranjivost-wpvivid-backup-arbitrary-file-upload\/"},"modified":"2026-02-11T16:40:09","modified_gmt":"2026-02-11T15:40:09","slug":"kriticna-ranjivost-wpvivid-backup-arbitrary-file-upload","status":"publish","type":"post","link":"https:\/\/helloblog.io\/hr\/kriticna-ranjivost-wpvivid-backup-arbitrary-file-upload\/","title":{"rendered":"Kriti\u010dna ranjivost u WPvivid Backup: kako neautentificirani napada\u010d mo\u017ee uploadati datoteku i preuzeti WordPress"},"content":{"rendered":"\n<p>Ako na projektima koristi\u0161 WPvivid Backup &#038; Migration (plugin slug: <code>wpvivid-backuprestore<\/code>), vrijedi odmah provjeriti verziju i konfiguraciju. Wordfence je objavio detalje o kriti\u010dnoj ranjivosti (CVSS <strong>9.8<\/strong>) koja omogu\u0107uje <strong>unauthenticated arbitrary file upload<\/strong> (upload proizvoljne datoteke bez prijave), a u praksi vrlo \u010desto zavr\u0161ava kao <strong>remote code execution (RCE)<\/strong> i potpuni takeover weba.<\/p>\n\n\n\n<p>Bitna nijansa: ovaj propust je <strong>kriti\u010dno opasan prvenstveno za instalacije koje imaju generirani klju\u010d u postavkama plugina<\/strong> kako bi drugi site mogao \u201cposlati backup\u201d na tvoj site. Ta mogu\u0107nost je <strong>po defaultu isklju\u010dena<\/strong>, a rok trajanja klju\u010da mo\u017ee se postaviti <strong>najvi\u0161e na 24 sata<\/strong>. Ipak, s obzirom na broj instalacija, realno je o\u010dekivati da je velik broj webova tu opciju koristio barem povremeno.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u0160to je pogo\u0111eno (sa\u017eetak iz Wordfence Intelligence)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Naziv ranjivosti: <strong>Unauthenticated Arbitrary File Upload<\/strong><\/li>\n\n\n<li>Pogo\u0111eni plugin: <strong>Migration, Backup, Staging &#8211; WPvivid Backup &#038; Migration<\/strong><\/li>\n\n\n<li>Pogo\u0111ene verzije: <strong><= 0.9.123<\/strong><\/li>\n\n\n<li>Zakrpljena verzija: <strong>0.9.124<\/strong><\/li>\n\n\n<li>CVSS: <strong>9.8 (Critical)<\/strong><\/li>\n\n\n<li>CVE: <strong>CVE-2026-1357<\/strong> (<a href=\"https:\/\/www.cve.org\/CVERecord?id=CVE-2026-1357\">cve.org zapis<\/a>)<\/li>\n\n\n<li>Napadni vektor: parametar <code>wpvivid_action=send_to_site<\/code><\/li>\n\n\n<li>Bug bounty nagrada: <strong>$2,145.00<\/strong> (istra\u017eiva\u010d Lucas Montes \/ NiRoX)<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Za\u0161to je ovo opasno: od uploada do RCE-a u jednom koraku<\/h2>\n\n\n\n<p>\u201cArbitrary file upload\u201d zvu\u010di kao jo\u0161 jedan u nizu propusta, ali u WordPress svijetu to je \u010desto najkra\u0107i put do kompromitacije. Ako napada\u010d uspije uploadati npr. <code>.php<\/code> datoteku u javno dostupnu mapu, onda je dovoljno pogoditi URL te datoteke i izvr\u0161iti kod na serveru. To se tipi\u010dno koristi za webshell (npr. za daljnje ubacivanje backdoora, kra\u0111u podataka ili lateralno kretanje po hostingu).<\/p>\n\n\n\n<p>U ovom slu\u010daju, Wordfence navodi da ranjivost omogu\u0107uje <strong>neautentificiranim napada\u010dima<\/strong> upload proizvoljnih datoteka, a zatim i <strong>izvr\u0161avanje malicioznog koda<\/strong> na serveru &#8211; \u0161to se u praksi vrlo \u010desto pretvara u potpuni takeover.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tehni\u010dka analiza: gdje je to\u010dno puklo<\/h2>\n\n\n\n<p>WPvivid ima funkcionalnost primanja backupa s drugog sitea (\u201csend backup to site\u201d), a to se autorizira kratkotrajnim klju\u010dem generiranim u postavkama. Kod za primitak datoteke prolazi kroz <code>send_to_site()<\/code> metodu u klasi <code>WPvivid_Send_to_site<\/code> i o\u010dekuje payload u <code>$_POST['wpvivid_content']<\/code> koji se base64-dekodira i zatim dekriptira.<\/p>\n\n\n\n<p>Problem nastaje u procesu dekripcije: plugin koristi RSA da dekriptira session key, a zatim taj klju\u010d koristi za simetri\u010dnu dekripciju (Rijndael\/AES preko <code>phpseclib<\/code>). Ako RSA dekripcija padne, klju\u010d postane <code>false<\/code>, ali izvr\u0161avanje se ne prekida na na\u010din koji bi sprije\u010dio daljnju obradu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) Neispravno rukovanje gre\u0161kama u RSA dekripciji<\/h3>\n\n\n\n<p>Prema Wordfence opisu, kada <code>openssl_private_decrypt()<\/code> ne uspije dekriptirati session key, plugin ne prekida obradu nego proslje\u0111uje boolean <code>false<\/code> u inicijalizaciju AES\/Rijndael \u0161ifre u <code>phpseclib<\/code> biblioteci. Klju\u010dni detalj je pona\u0161anje biblioteke: <code>false<\/code> tretira kao string null bajtova. Time napada\u010d dobiva predvidljiv \u201cklju\u010d\u201d (niz <code>\u0000<\/code>) i mo\u017ee pripremiti \u0161ifrirani payload koji \u0107e se uredno dekriptirati na strani \u017ertve.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2) Nema sanitizacije putanje (path) kod zapisivanja datoteka<\/h3>\n\n\n\n<p>Drugi dio lanca je jednako kriti\u010dan: plugin prihva\u0107a naziv datoteke iz dekriptiranog payloada bez adekvatne sanitizacije. To omogu\u0107uje <strong>directory traversal<\/strong> &#8211; izlazak iz \u201cza\u0161ti\u0107enog\u201d direktorija za backupe i upis datoteke u druge lokacije, uklju\u010duju\u0107i javno dostupne direktorije.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3) Nema provjere tipa\/ekstenzije datoteke (u ranjivim verzijama)<\/h3>\n\n\n\n<p>Wordfence isti\u010de da upload dio nije imao provjere tipa ili ekstenzije. Kombinacija predvidljive dekripcije + path traversal + izostanak provjere ekstenzije otvara vrata za upload npr. <code>.php<\/code> datoteka i potom RCE.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Koga to stvarno poga\u0111a: klju\u010dna konfiguracijska stavka<\/h2>\n\n\n\n<p>Ovo nije \u201csvaka instalacija je automatski otvorena\u201d. Kriti\u010dni scenarij je kad je u WPvivid postavkama generiran klju\u010d koji omogu\u0107uje drugom siteu da \u0161alje backup na tvoj site. Ta opcija je po defaultu isklju\u010dena, a klju\u010d mo\u017ee vrijediti maksimalno 24 sata. No ako je klju\u010d generiran (\u010dak i privremeno) i endpoint izlo\u017een, prozor napada postoji dok je klju\u010d valjan.<\/p>\n\n\n\n<div class=\"wp-block-group callout callout-warning is-style-warning is-layout-flow wp-block-group-is-layout-flow\" style=\"border-width:1px;border-radius:8px;padding-top:1rem;padding-right:1.5rem;padding-bottom:1rem;padding-left:1.5rem\">\n\n<h4 class=\"wp-block-heading callout-title\">Prakti\u010dna implikacija<\/h4>\n\n\n<p>Ako si ikad koristio\/koristila opciju primanja backupa s drugog sitea i generirao\/la klju\u010d, tretiraj ovo kao hitno: update + provjera logova i file systema.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Zakrpa u 0.9.124: \u0161to su promijenili<\/h2>\n\n\n\n<p>Developer je izdao zakrpu u verziji <strong>0.9.124<\/strong>. Prema Wordfence analizi, popravak ima dva bitna dijela:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>U <code>decrypt_message()<\/code> dodana je provjera da je dekriptirani <code>$key<\/code> valjan. Ako je <code>$key === false<\/code> ili je prazan, funkcija vra\u0107a <code>false<\/code> i prekida lanac koji je omogu\u0107avao null-byte klju\u010d.<\/li>\n\n\n<li>U <code>send_to_site()<\/code> dodana je provjera ekstenzije datoteke tako da su dopu\u0161teni samo tipi\u010dni backup formati: <code>zip<\/code>, <code>gz<\/code>, <code>tar<\/code>, <code>sql<\/code>. Uz to se naziv datoteke normalizira preko <code>basename()<\/code> i dodatnog <code>preg_replace()<\/code> kako bi se uklonili nedopu\u0161teni znakovi.<\/li>\n\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Wordfence mitigacije: tko je kada dobio firewall pravilo<\/h2>\n\n\n\n<p>Wordfence je isporu\u010dio firewall pravilo za blokiranje poku\u0161aja eksploatacije u sljede\u0107im terminima:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Wordfence Premium \/ Wordfence Care \/ Wordfence Response<\/strong>: za\u0161titno firewall pravilo isporu\u010deno <strong>22. sije\u010dnja 2026.<\/strong><\/li>\n\n\n<li><strong>Wordfence Free<\/strong>: ista za\u0161tita se isporu\u010duje <strong>30 dana kasnije<\/strong>, tj. <strong>21. velja\u010de 2026.<\/strong><\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Disclosure timeline (kronologija objave)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>January 12, 2026<\/strong> &#8211; prijava ranjivosti kroz Wordfence Bug Bounty Program.<\/li>\n\n\n<li><strong>January 22, 2026<\/strong> &#8211; Wordfence validira prijavu i potvr\u0111uje proof-of-concept; vendoru \u0161alje inicijalni kontakt i poziv na kori\u0161tenje <a href=\"https:\/\/www.wordfence.com\/threat-intel\/vendor\/vulnerability-management-portal\/\">Wordfence Vulnerability Management Portal<\/a>.<\/li>\n\n\n<li><strong>January 22, 2026<\/strong> &#8211; Premium\/Care\/Response korisnici dobivaju firewall pravilo.<\/li>\n\n\n<li><strong>January 23, 2026<\/strong> &#8211; vendor odgovara i bira komunikaciju emailom.<\/li>\n\n\n<li><strong>January 23, 2026<\/strong> &#8211; Wordfence \u0161alje full disclosure; vendor potvr\u0111uje i kre\u0107e raditi na fixu.<\/li>\n\n\n<li><strong>January 28, 2026<\/strong> &#8211; izlazi potpuno zakrpljena verzija plugina <strong>0.9.124<\/strong>.<\/li>\n\n\n<li><strong>February 21, 2026<\/strong> &#8211; Wordfence Free korisnici dobivaju istu za\u0161titu.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u0160to napraviti odmah (checklista za developere i maintainere)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Provjeri verziju WPvivid-a<\/strong>: ako je <strong>0.9.123 ili ni\u017ee<\/strong>, update na <strong>0.9.124<\/strong> je prioritet.<\/li>\n\n\n<li><strong>Provjeri je li ikad generiran \u201csend to site\u201d klju\u010d<\/strong> u postavkama (i je li opcija trenutno aktivna). Ako ti ne treba, ostavi je isklju\u010denu.<\/li>\n\n\n<li>Ako koristi\u0161 Wordfence, <strong>provjeri koristi\u0161 li Free ili Premium\/Care\/Response<\/strong> i u skladu s tim o\u010dekuj dostupnost firewall pravila (Premium je ve\u0107 imao za\u0161titu od 22.1.2026., Free dobiva 21.2.2026.).<\/li>\n\n\n<li>Ako sumnja\u0161 na kompromitaciju: tra\u017ei neo\u010dekivane <code>.php<\/code> datoteke u upload direktorijima i ostalim javnim lokacijama, te pregledaj logove prema requestovima koji uklju\u010duju <code>wpvivid_action=send_to_site<\/code>.<\/li>\n\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Zaklju\u010dak<\/h2>\n\n\n\n<p>CVE-2026-1357 je primjer kako kombinacija \u201csitnih\u201d propusta (neispravno rukovanje gre\u0161kama u kriptografiji + izostanak sanitizacije putanje + izostanak provjere ekstenzije) mo\u017ee zavr\u0161iti kao vrlo direktan put do RCE-a. Dobra vijest je da je problem adresiran u <strong>WPvivid Backup 0.9.124<\/strong>, a Wordfence je relativno brzo isporu\u010dio i firewall mitigaciju.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Reference \/ Izvori<\/h2>\n                <ul class=\"references-list\"><li><a href=\"https:\/\/www.wordfence.com\/blog\/2026\/02\/800000-wordpress-sites-affected-by-arbitrary-file-upload-vulnerability-in-wpvivid-backup-wordpress-plugin\/\" target=\"_blank\" rel=\"noopener noreferrer\">800,000 WordPress Sites Affected by Arbitrary File Upload Vulnerability in WPvivid Backup WordPress Plugin<\/a><\/li><li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/wpvivid-backuprestore\/migration-backup-staging-09123-unauthenticated-arbitrary-file-upload\" target=\"_blank\" rel=\"noopener noreferrer\">Migration, Backup, Staging &lt;= 0.9.123 &#8212; Unauthenticated Arbitrary File Upload<\/a><\/li><li><a href=\"https:\/\/www.cve.org\/CVERecord?id=CVE-2026-1357\" target=\"_blank\" rel=\"noopener noreferrer\">CVE-2026-1357<\/a><\/li><li><a href=\"https:\/\/wordpress.org\/plugins\/wpvivid-backuprestore\/\" target=\"_blank\" rel=\"noopener noreferrer\">WPvivid Backup plugin page (wpvivid-backuprestore)<\/a><\/li><li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/bug-bounty-program\/\" target=\"_blank\" rel=\"noopener noreferrer\">Wordfence Bug Bounty Program<\/a><\/li><li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vendor\/vulnerability-management-portal\/\" target=\"_blank\" rel=\"noopener noreferrer\">Wordfence Vulnerability Management Portal<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>WPvivid Backup (800k+ aktivnih instalacija) imao je kriti\u010dan propust koji u odre\u0111enoj konfiguraciji omogu\u0107uje neautentificirani upload proizvoljnih datoteka i RCE. Ako koristi\u0161 \u201csend backup to site\u201d klju\u010d, update na 0.9.124 je hitan.<\/p>\n","protected":false},"author":42,"featured_media":213,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[58,112,33,10,111],"class_list":["post-214","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sigurnost","tag-cve","tag-rce","tag-sigurnost","tag-wordpress","tag-wpvivid"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/hr\/wp-json\/wp\/v2\/posts\/214","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/hr\/wp-json\/wp\/v2\/users\/42"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/hr\/wp-json\/wp\/v2\/comments?post=214"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/hr\/wp-json\/wp\/v2\/posts\/214\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/hr\/wp-json\/wp\/v2\/media\/213"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/hr\/wp-json\/wp\/v2\/media?parent=214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/hr\/wp-json\/wp\/v2\/categories?post=214"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/hr\/wp-json\/wp\/v2\/tags?post=214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}