{"id":227,"date":"2026-02-11T16:39:15","date_gmt":"2026-02-11T15:39:15","guid":{"rendered":"https:\/\/helloblog.io\/sl\/kriticna-ranljivost-wpvivid-backup-neavtenticiran-upload-datotek\/"},"modified":"2026-02-11T16:39:15","modified_gmt":"2026-02-11T15:39:15","slug":"kriticna-ranljivost-wpvivid-backup-neavtenticiran-upload-datotek","status":"publish","type":"post","link":"https:\/\/helloblog.io\/sl\/kriticna-ranljivost-wpvivid-backup-neavtenticiran-upload-datotek\/","title":{"rendered":"Kriti\u010dna ranljivost v WPvivid Backup: neavtenticiran upload datotek lahko vodi v prevzem WordPress strani"},"content":{"rendered":"\n<p>Varnostne objave v WordPress ekosistemu so pogosto rutinske, a v\u010dasih naleti\u0161 na primer, ki je vreden takoj\u0161nje akcije. Tokrat gre za vti\u010dnik <strong>WPvivid Backup &#038; Migration<\/strong> (slug: <code>wpvivid-backuprestore<\/code>), ki ima po podatkih iz objave ve\u010d kot <strong>800.000 aktivnih namestitev<\/strong>. Wordfence je poro\u010dal o <strong>neavtenticirani ranljivosti za poljuben upload datotek (Unauthenticated Arbitrary File Upload)<\/strong>, ki se lahko eskalira v <strong>remote code execution (RCE)<\/strong> \u2013 v praksi to pogosto pomeni popoln prevzem strani.<\/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\">Klju\u010dna omejitev (a \u0161e vedno kriti\u010dno)<\/h4>\n\n\n<p>Ranljivost je po navedbah kriti\u010dno relevantna predvsem za namestitve, kjer je v nastavitvah WPvivid ustvarjen klju\u010d za funkcionalnost, ki omogo\u010da, da druga stran po\u0161lje backup na tvojo stran. Funkcija je privzeto izklopljena, veljavnost klju\u010da pa je mogo\u010de nastaviti najve\u010d na 24 ur.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Kaj je bilo ranljivo (na kratko, a tehni\u010dno natan\u010dno)<\/h2>\n\n\n\n<p>Wordfence je ranljivost prejel <strong>12. januarja 2026<\/strong> prek svojega <strong>Bug Bounty Program<\/strong>. Odkritje pripisujejo raziskovalcu <strong>Lucas Montes (NiRoX)<\/strong>, ki je ranljivost odgovorno prijavil zelo hitro po tem, ko je bila uvedena (po navedbah v 5 dneh). Za to je prejel nagrado <strong>2.145,00 USD<\/strong>.<\/p>\n\n\n\n<p>V Wordfence Intelligence je ranljivost opisana kot: <strong>Migration, Backup, Staging <= 0.9.123 - Unauthenticated Arbitrary File Upload<\/strong>. Gre za kriti\u010dno oceno <strong>CVSS 9.8<\/strong>, dodeljen je <strong>CVE-2026-1357<\/strong>, prizadete so razli\u010dice <strong><= 0.9.123<\/strong>, popravljena pa je <strong>0.9.124<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Vti\u010dnik: Migration, Backup, Staging &#8211; WPvivid Backup &#038; Migration<\/li>\n\n\n<li>Slug: <code>wpvivid-backuprestore<\/code><\/li>\n\n\n<li>CVE: <strong>CVE-2026-1357<\/strong><\/li>\n\n\n<li>CVSS: <strong>9.8 (Critical)<\/strong><\/li>\n\n\n<li>Prizadete razli\u010dice: <strong><= 0.9.123<\/strong><\/li>\n\n\n<li>Popravljena razli\u010dica: <strong>0.9.124<\/strong><\/li>\n\n\n<li>Bounty: <strong>$2,145.00<\/strong><\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Kje v funkcionalnosti se pojavi problem<\/h2>\n\n\n\n<p>WPvivid ima funkcijo, kjer lahko stran <strong>prejema backup z druge WordPress strani<\/strong>. Za to potrebuje\u0161 <strong>kratkoro\u010dno generiran klju\u010d<\/strong> (key), ki ga vti\u010dnik uporabi za varno komunikacijo. V analizi Wordfence izpostavi implementacijo sprejema datotek prek metode <code>send_to_site()<\/code> v razredu <code>WPvivid_Send_to_site<\/code>, ki obdeluje prejem backup datoteke skupaj z generiranim klju\u010dem.<\/p>\n\n\n\n<p>Klju\u010dni del te\u017eave je kombinacija dveh stvari: (1) neustrezno rokovanje z napako v postopku RSA de\u0161ifriranja in (2) pomanjkanje sanitizacije poti\/imen datotek pri zapisovanju prejetih datotek. Skupaj to napadalcu omogo\u010di, da pripravi \u0161ifriran payload, ki se de\u0161ifrira na predvidljiv na\u010din, nato pa vti\u010dnik uporabi napadal\u010devo ime datoteke brez zadostnih varnostnih omejitev.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) Napa\u010dno rokovanje z RSA de\u0161ifriranjem \u2192 predvidljiv klju\u010d (null bytes)<\/h3>\n\n\n\n<p>Po opisu je problem v tem, da v procesu de\u0161ifriranja sejne vrednosti (session key) vti\u010dnik posku\u0161a de\u0161ifrirati klju\u010d, in \u010de de\u0161ifriranje ne uspe (npr. zaradi napa\u010dnega klju\u010da), dobi <strong>boolean <code>false<\/code><\/strong>. Namesto da bi v tem trenutku prekinil izvajanje, koda ta <code>false<\/code> posreduje inicializaciji simetri\u010dnega \u0161ifranta (AES\/Rijndael) iz knji\u017enice <strong>phpseclib<\/strong>. Wordfence pojasni, da knji\u017enica <code>false<\/code> obravnava kot niz ni\u010delnih bajtov (null bytes), kar posledi\u010dno pomeni <strong>predvidljiv \u0161ifrirni klju\u010d<\/strong>.<\/p>\n\n\n\n<p>\u010ce je klju\u010d predvidljiv, lahko napadalec izdela zlonameren payload, \u0161ifriran s tem null-byte klju\u010dem, in ga vti\u010dnik nato \u00bbuspe\u0161no\u00ab obdela. V analizi je to vezano na situacijo, ko vti\u010dnik pri de\u0161ifriranju uporablja <code>openssl_private_decrypt()<\/code> in pri napaki ne zaklju\u010di izvajanja, kar spro\u017ei opisani ne\u017eeleni tok.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2) Brez sanitizacije poti in brez preverjanja tipa datotek \u2192 upload PHP + directory traversal<\/h3>\n\n\n\n<p>Drugi del verige je, da funkcija za upload (prejem) datoteke po navedbah <strong>ne preverja tipa ali kon\u010dnice datoteke<\/strong>. \u0160e ve\u010d: vti\u010dnik sprejme imena datotek iz de\u0161ifriranega payloada brez ustrezne sanitizacije, kar omogo\u010da <strong>directory traversal<\/strong> (pobeg iz za\u0161\u010ditene backup mape). To napadalcu omogo\u010di, da zapi\u0161e poljubno datoteko \u2013 vklju\u010dno s <strong>PHP datoteko<\/strong> \u2013 v javno dostopen direktorij in jo nato prek HTTP zahteve spro\u017ei, kar vodi do <strong>RCE<\/strong>.<\/p>\n\n\n\n<p>Wordfence izrecno omenja, da je RCE izvedljiv prek parametra <strong><code>wpvivid_action=send_to_site<\/code><\/strong>. Kot pri ve\u010dini ranljivosti tipa arbitrary file upload je tipi\u010den nadaljnji korak namestitev webshella in kasnej\u0161a popolna kompromitacija (npr. kraja podatkov, dodajanje admin uporabnikov, pivotanje v notranje sisteme ipd.).<\/p>\n\n\n\n<div class=\"wp-block-group callout callout-danger is-style-danger 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\">Zakaj je to razred ranljivosti, ki ga jemljemo resno<\/h4>\n\n\n<p>Poljuben upload datotek + mo\u017enost zapisovanja v spletno dostopne direktorije je ena najnevarnej\u0161ih kombinacij. Tudi \u010de je inicialni vektor vezan na specifi\u010dno funkcijo, uspe\u0161na zloraba obi\u010dajno hitro eskalira v popoln prevzem WordPress instance.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Kako je ranljivost odpravljena v 0.9.124<\/h2>\n\n\n\n<p>Razvijalec je ranljivost odpravil v razli\u010dici <strong>0.9.124<\/strong>. Wordfence navaja dva klju\u010dna popravka:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>V funkciji <code>decrypt_message()<\/code> so dodali preverjanje, ali je <code>$key<\/code> po RSA de\u0161ifriranju <code>false<\/code> ali prazen. \u010ce je, funkcija vrne <code>false<\/code> (in s tem ne nadaljuje s simetri\u010dnim de\u0161ifriranjem s predvidljivim klju\u010dem).<\/li>\n\n\n<li>V funkciji <code>send_to_site()<\/code> so dodali preverjanje kon\u010dnic datotek in sanitizacijo imena. Dovoljene so samo tipi\u010dne backup kon\u010dnice: <code>zip<\/code>, <code>gz<\/code>, <code>tar<\/code>, <code>sql<\/code>. \u010ce kon\u010dnica ni na seznamu, vti\u010dnik vrne napako \u00bbInvalid file type &#8211; only backup files allowed.\u00ab in prekine izvajanje.<\/li>\n\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Logika popravka po opisu Wordfence:\n$key = $rsa-&gt;decrypt($key);\n\nif ($key === false || empty($key)) {\n    return false;\n}\n\n$rij = new Crypt_Rijndael();\n$rij-&gt;setKey($key);\nreturn $rij-&gt;decrypt($data);\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6A737D\">\/\/ Logika popravka po opisu Wordfence:<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$key <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#E1E4E8\"> $rsa<\/span><span style=\"color:#F97583\">-><\/span><span style=\"color:#B392F0\">decrypt<\/span><span style=\"color:#E1E4E8\">($key);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">if<\/span><span style=\"color:#E1E4E8\"> ($key <\/span><span style=\"color:#F97583\">===<\/span><span style=\"color:#79B8FF\"> false<\/span><span style=\"color:#F97583\"> ||<\/span><span style=\"color:#79B8FF\"> empty<\/span><span style=\"color:#E1E4E8\">($key)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">    return<\/span><span style=\"color:#79B8FF\"> false<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$rij <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#F97583\"> new<\/span><span style=\"color:#79B8FF\"> Crypt_Rijndael<\/span><span style=\"color:#E1E4E8\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$rij<\/span><span style=\"color:#F97583\">-><\/span><span style=\"color:#B392F0\">setKey<\/span><span style=\"color:#E1E4E8\">($key);<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">return<\/span><span style=\"color:#E1E4E8\"> $rij<\/span><span style=\"color:#F97583\">-><\/span><span style=\"color:#B392F0\">decrypt<\/span><span style=\"color:#E1E4E8\">($data);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Logika popravka po opisu Wordfence:\n$safe_name = basename($params['name']);\n$safe_name = preg_replace('\/[^a-zA-Z0-9._-]\/', '', $safe_name);\n\n$allowed_extensions = array('zip', 'gz', 'tar', 'sql');\n$file_ext = strtolower(pathinfo($safe_name, PATHINFO_EXTENSION));\n\nif (!in_array($file_ext, $allowed_extensions, true)) {\n    $ret['result'] = WPVIVID_FAILED;\n    $ret['error']  = 'Invalid file type - only backup files allowed.';\n    echo wp_json_encode($ret);\n    die();\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#6A737D\">\/\/ Logika popravka po opisu Wordfence:<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$safe_name <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#79B8FF\"> basename<\/span><span style=\"color:#E1E4E8\">($params[<\/span><span style=\"color:#9ECBFF\">'name'<\/span><span style=\"color:#E1E4E8\">]);<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$safe_name <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#79B8FF\"> preg_replace<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#9ECBFF\">'\/<\/span><span style=\"color:#DBEDFF\">[^a-zA-Z0-9._-]<\/span><span style=\"color:#9ECBFF\">\/'<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">''<\/span><span style=\"color:#E1E4E8\">, $safe_name);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$allowed_extensions <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#79B8FF\"> array<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#9ECBFF\">'zip'<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">'gz'<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">'tar'<\/span><span style=\"color:#E1E4E8\">, <\/span><span style=\"color:#9ECBFF\">'sql'<\/span><span style=\"color:#E1E4E8\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$file_ext <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#79B8FF\"> strtolower<\/span><span style=\"color:#E1E4E8\">(<\/span><span style=\"color:#79B8FF\">pathinfo<\/span><span style=\"color:#E1E4E8\">($safe_name, <\/span><span style=\"color:#79B8FF\">PATHINFO_EXTENSION<\/span><span style=\"color:#E1E4E8\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">if<\/span><span style=\"color:#E1E4E8\"> (<\/span><span style=\"color:#F97583\">!<\/span><span style=\"color:#79B8FF\">in_array<\/span><span style=\"color:#E1E4E8\">($file_ext, $allowed_extensions, <\/span><span style=\"color:#79B8FF\">true<\/span><span style=\"color:#E1E4E8\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    $ret[<\/span><span style=\"color:#9ECBFF\">'result'<\/span><span style=\"color:#E1E4E8\">] <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#79B8FF\"> WPVIVID_FAILED<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    $ret[<\/span><span style=\"color:#9ECBFF\">'error'<\/span><span style=\"color:#E1E4E8\">]  <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#9ECBFF\"> 'Invalid file type - only backup files allowed.'<\/span><span style=\"color:#E1E4E8\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color:#79B8FF\">    echo<\/span><span style=\"color:#B392F0\"> wp_json_encode<\/span><span style=\"color:#E1E4E8\">($ret);<\/span><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">    die<\/span><span style=\"color:#E1E4E8\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Wordfence za\u0161\u010dita (firewall rule) in datumi<\/h2>\n\n\n\n<p>Wordfence je ranljivost obravnaval tudi na ravni svojega WAF (Web Application Firewall \u2013 aplikacijski po\u017earni zid na endpoint ravni). Po njihovih navedbah:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Uporabniki <strong>Wordfence Premium<\/strong>, <strong>Wordfence Care<\/strong> in <strong>Wordfence Response<\/strong> so dobili firewall pravilo <strong>22. januarja 2026<\/strong>.<\/li>\n\n\n<li>Uporabniki <strong>Wordfence Free<\/strong> dobijo enako za\u0161\u010dito <strong>30 dni kasneje<\/strong>, tj. <strong>21. februarja 2026<\/strong>.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Disclosure timeline (kot je objavil Wordfence)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>January 12, 2026<\/strong> &#8211; Prejeta prijava ranljivosti prek Wordfence Bug Bounty Program.<\/li>\n\n\n<li><strong>January 22, 2026<\/strong> &#8211; Wordfence validira poro\u010dilo in potrdi proof-of-concept exploit; razvijalcu po\u0161lje za\u010detno sporo\u010dilo in povabilo k uporabi <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; Wordfence Premium\/Care\/Response dobijo firewall pravilo za dodatno za\u0161\u010dito.<\/li>\n\n\n<li><strong>January 23, 2026<\/strong> &#8211; Razvijalec odgovori in izbere komunikacijo prek e-po\u0161te.<\/li>\n\n\n<li><strong>January 23, 2026<\/strong> &#8211; Wordfence po\u0161lje full disclosure podrobnosti; razvijalec potrdi prijavo in za\u010dne pripravljati popravek.<\/li>\n\n\n<li><strong>January 28, 2026<\/strong> &#8211; Izide popravljena razli\u010dica vti\u010dnika <strong>0.9.124<\/strong>.<\/li>\n\n\n<li><strong>February 21, 2026<\/strong> &#8211; Wordfence Free prejme enako za\u0161\u010dito.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Kaj naj naredi\u0161 na svojih straneh (prakti\u010dni checklist)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Preveri, ali uporablja\u0161 vti\u010dnik <strong>WPvivid Backup &#038; Migration<\/strong> (<code>wpvivid-backuprestore<\/code>).<\/li>\n\n\n<li>\u010ce ga uporablja\u0161, preveri razli\u010dico: ranljive so <strong><= 0.9.123<\/strong>.<\/li>\n\n\n<li>Posodobi na <strong>0.9.124<\/strong> (ali novej\u0161o, \u010de je \u017ee na voljo).<\/li>\n\n\n<li>\u010ce uporablja\u0161 funkcijo \u00bbreceive backup from another site\u00ab: preveri, ali ima\u0161 v nastavitvah generiran klju\u010d, in ga ob neuporabi odstrani\/rotiraj. Upo\u0161tevaj, da je funkcija privzeto izklopljena in da je veljavnost klju\u010da omejena na 24 ur, vendar to ne nadomesti posodobitve.<\/li>\n\n\n<li>\u010ce uporablja\u0161 Wordfence, upo\u0161tevaj razlike med Premium\/Care\/Response in Free glede datuma prejema WAF pravila (22. januar vs. 21. februar 2026).<\/li>\n\n<\/ol>\n\n\n\n<div class=\"wp-block-group callout callout-info is-style-info 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\">Posodobitev je \u0161e vedno primarni ukrep<\/h4>\n\n\n<p>WAF pravilo je koristna obrambna plast, vendar pri ranljivostih, ki vodijo v RCE, ostaja osnovno pravilo: popravi vzrok \u2013 posodobi vti\u010dnik na popravljeno razli\u010dico.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Zaklju\u010dek<\/h2>\n\n\n\n<p>CVE-2026-1357 v WPvivid Backup je \u0161olski primer, kako lahko kombinacija kriptografske napake (nepravilno obravnavanje <code>false<\/code> v procesu de\u0161ifriranja) in pomanjkljive validacije datotek\/prenosov hitro preraste v scenarij, kjer neavtenticiran napadalec nalo\u017ei PHP datoteko in izvede kodo na stre\u017eniku. Popravek je na voljo v <strong>0.9.124<\/strong>, zato je najbolj smiselno ukrepati takoj \u2013 \u0161e posebej, \u010de si kdaj vklopil funkcijo prejemanja backupov z druge strani prek generiranega klju\u010da.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Reference \/ Viri<\/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 &amp; Migration (WordPress.org plugin)<\/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><li><a href=\"https:\/\/www.wordfence.com\/products\/wordfence-premium\/\" target=\"_blank\" rel=\"noopener noreferrer\">Wordfence Premium<\/a><\/li><li><a href=\"https:\/\/www.wordfence.com\/products\/wordfence-care\/\" target=\"_blank\" rel=\"noopener noreferrer\">Wordfence Care<\/a><\/li><li><a href=\"https:\/\/www.wordfence.com\/products\/wordfence-response\/\" target=\"_blank\" rel=\"noopener noreferrer\">Wordfence Response<\/a><\/li><li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/researchers\/lucas-montes\" target=\"_blank\" rel=\"noopener noreferrer\">Lucas Montes (NiRoX)<\/a><\/li><li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/submit\/\" target=\"_blank\" rel=\"noopener noreferrer\">Submit Vulnerability (Wordfence)<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>V WPvivid Backup (ve\u010d kot 800.000 aktivnih namestitev) so odkrili kriti\u010dno ranljivost, ki lahko ob dolo\u010denih nastavitvah omogo\u010di oddaljeno izvajanje kode. \u010ce uporablja\u0161 funkcijo \u00bbreceive a backup from another site\u00ab, je posodobitev nujna.<\/p>\n","protected":false},"author":45,"featured_media":226,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[120,118,14,10,119],"class_list":["post-227","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-varnost","tag-cve-2026-1357","tag-ranljivosti","tag-wordfence","tag-wordpress","tag-wpvivid-backup"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/sl\/wp-json\/wp\/v2\/posts\/227","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/sl\/wp-json\/wp\/v2\/users\/45"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/sl\/wp-json\/wp\/v2\/comments?post=227"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/sl\/wp-json\/wp\/v2\/posts\/227\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/sl\/wp-json\/wp\/v2\/media\/226"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/sl\/wp-json\/wp\/v2\/media?parent=227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/sl\/wp-json\/wp\/v2\/categories?post=227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/sl\/wp-json\/wp\/v2\/tags?post=227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}