{"id":213,"date":"2026-02-11T16:38:45","date_gmt":"2026-02-11T15:38:45","guid":{"rendered":"https:\/\/helloblog.io\/lv\/kritiska-wpvivid-backup-ievainojamiba-arbitrary-file-upload\/"},"modified":"2026-02-11T16:38:45","modified_gmt":"2026-02-11T15:38:45","slug":"kritiska-wpvivid-backup-ievainojamiba-arbitrary-file-upload","status":"publish","type":"post","link":"https:\/\/helloblog.io\/lv\/kritiska-wpvivid-backup-ievainojamiba-arbitrary-file-upload\/","title":{"rendered":"Kritiska WPvivid Backup ievainojam\u012bba: l\u012bdz 800 000 WordPress instal\u0101ciju risk\u0101, ja aktiviz\u0113ta \u201csend backup to this site\u201d atsl\u0113ga"},"content":{"rendered":"\n<p>WordPress dro\u0161\u012bbas zi\u0146\u0101s ir \u013coti konkr\u0113ts gad\u012bjums, kur \u201cit k\u0101 ni\u0161as funkcija\u201d p\u0113k\u0161\u0146i k\u013c\u016bst par kritisku risku lielam instal\u0101ciju skaitam. Wordfence komanda zi\u0146oja par <strong>neautentific\u0113tu Arbitrary File Upload<\/strong> ievainojam\u012bbu WPvivid Backup &#038; Migration spraudn\u012b (WordPress.org slugs: <code>wpvivid-backuprestore<\/code>), kuram ir vair\u0101k nek\u0101 <strong>800 000<\/strong> akt\u012bvu instal\u0101ciju.<\/p>\n\n\n\n<p>Slikt\u0101 zi\u0146a: ievainojam\u012bba \u013cauj uzbruc\u0113jam <strong>aug\u0161upiel\u0101d\u0113t patva\u013c\u012bgus failus<\/strong> un praktiski non\u0101kt l\u012bdz <strong>Remote Code Execution (RCE)<\/strong> \u2013 t.i., palaist \u013caunpr\u0101t\u012bgu kodu uz servera, kas bie\u017ei beidzas ar pilnu vietnes p\u0101r\u0146em\u0161anu (webshell, backdoor u.c.). Lab\u0101 zi\u0146a: p\u0113c Wordfence inform\u0101cijas, kritiskais risks attiecas <strong>tikai<\/strong> uz t\u0101m vietn\u0113m, kur spraud\u0146a iestat\u012bjumos ir <strong>\u0123ener\u0113ta atsl\u0113ga<\/strong>, lai \u013cautu citai vietnei nos\u016bt\u012bt rezerves kopiju uz j\u016bsu vietni (\u0161\u012b iesp\u0113ja ir <strong>izsl\u0113gta p\u0113c noklus\u0113juma<\/strong>, un atsl\u0113gas der\u012bguma termi\u0146u var uzst\u0101d\u012bt maksimums uz <strong>24 stund\u0101m<\/strong>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kas tie\u0161i ir atkl\u0101ts (kopsavilkums)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Ievainojam\u012bba: <strong>Unauthenticated Arbitrary File Upload<\/strong> (neautentific\u0113ts patva\u013c\u012bgu failu aug\u0161upiel\u0101des caurums).<\/li>\n\n\n<li>Ietekm\u0113tais spraudnis: <strong>Migration, Backup, Staging &#8211; WPvivid Backup &#038; Migration<\/strong> (<code>wpvivid-backuprestore<\/code>).<\/li>\n\n\n<li>Ietekm\u0113t\u0101s versijas: <strong>\u2264 0.9.123<\/strong>.<\/li>\n\n\n<li>Salabot\u0101 versija: <strong>0.9.124<\/strong>.<\/li>\n\n\n<li>CVE: <strong>CVE-2026-1357<\/strong>.<\/li>\n\n\n<li>Smagums: <strong>CVSS 9.8 (Critical)<\/strong>.<\/li>\n\n\n<li>Ekspluat\u0101cijas rezult\u0101ts: iesp\u0113jams aug\u0161upiel\u0101d\u0113t \u013caunpr\u0101t\u012bgu PHP failu publiski pieejam\u0101 direktorij\u0101 un pan\u0101kt <strong>RCE<\/strong>.<\/li>\n\n\n<li>Kritisk\u0101 ietekme praks\u0113: galvenok\u0101rt vietn\u0113m, kur iestat\u012bjumos ir izveidota atsl\u0113ga \u201csa\u0146emt backup no citas vietnes\u201d (funkcija p\u0113c noklus\u0113juma atsl\u0113gta, atsl\u0113ga der max 24h).<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Aizsardz\u012bba un termi\u0146i: Wordfence ugunsm\u016bra noteikumi<\/h2>\n\n\n\n<p>Wordfence nor\u0101da, ka aizsardz\u012bba ar ugunsm\u016bra (WAF) noteikumu tika izplat\u012bta \u0161\u0101dos termi\u0146os:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Wordfence Premium<\/strong>, <strong>Wordfence Care<\/strong> un <strong>Wordfence Response<\/strong> lietot\u0101ji ugunsm\u016bra noteikumu sa\u0146\u0113ma <strong>2026. gada 22. janv\u0101r\u012b<\/strong>.<\/li>\n\n\n<li>Wordfence <strong>Free<\/strong> lietot\u0101ji to pa\u0161u aizsardz\u012bbu sa\u0146ems <strong>30 dienas v\u0113l\u0101k &#8211; 2026. gada 21. febru\u0101r\u012b<\/strong>.<\/li>\n\n<\/ul>\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\">Svar\u012bgi<\/h4>\n\n\n<p>Pat ja tev ir Wordfence, prim\u0101rais labojums ir <strong>atjaunin\u0101t WPvivid<\/strong> uz salaboto versiju. Ugunsm\u016bris ir papildu aizsardz\u012bbas sl\u0101nis, nevis iemesls atlikt atjaunin\u0101jumu.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Ko dar\u012bt t\u016bl\u012bt (\u012bpa\u0161i, ja izmanto \u201cSend backup to this site\u201d funkciju)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>P\u0101rbaudi WPvivid Backup &#038; Migration versiju: ja t\u0101 ir <strong>0.9.123 vai vec\u0101ka<\/strong>, pl\u0101no steidzamu atjaunin\u0101jumu.<\/li>\n\n\n<li>Atjaunini spraudni uz <strong>0.9.124<\/strong> (Wordfence publik\u0101cijas br\u012bd\u012b t\u0101 ir versija ar pilnu iel\u0101pu).<\/li>\n\n\n<li>WPvivid iestat\u012bjumos p\u0101rbaudi, vai ir \u0123ener\u0113ta atsl\u0113ga, kas \u013cauj citai vietnei s\u016bt\u012bt backup uz tavu vietni. Ja funkcija nav nepiecie\u0161ama, atst\u0101j to izsl\u0113gtu p\u0113c noklus\u0113juma pieej\u0101 un neveido atsl\u0113gas bez vajadz\u012bbas.<\/li>\n\n\n<li>Ja atsl\u0113gu izmanto, \u0146em v\u0113r\u0101, ka atsl\u0113gas der\u012bguma termi\u0146u var uzst\u0101d\u012bt maksimums uz <strong>24 stund\u0101m<\/strong> &#8211; tas jau p\u0113c dizaina ierobe\u017eo ekspoz\u012bcijas laiku, bet ievainojam\u012bbas gad\u012bjum\u0101 kritiska ir tie\u0161i akt\u012bvas atsl\u0113gas kl\u0101tb\u016btne.<\/li>\n\n\n<li>Ja ir aizdomas par kompromit\u0101ciju (nezin\u0101mi PHP faili uploads direktorij\u0101s, d\u012bvaini cron, jauni admin lietot\u0101ji), veic incidenta izmekl\u0113\u0161anu un t\u012br\u012b\u0161anu, jo \u0161\u0101da klase ievainojam\u012bbu bie\u017ei tiek izmantota webshell ievieto\u0161anai.<\/li>\n\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Tehnisk\u0101 anal\u012bze: k\u0101p\u0113c \u0161is caurums str\u0101d\u0101<\/h2>\n\n\n\n<p>WPvivid ir funkcija, kas \u013cauj <strong>sa\u0146emt rezerves kopiju no citas vietnes<\/strong>. Lai to izdar\u012btu, spraudnis izmanto \u012bstermi\u0146a \u0123ener\u0113tu atsl\u0113gu. Wordfence anal\u012bz\u0113 min\u0113ts, ka rezerves kopiju sa\u0146em\u0161anu apstr\u0101d\u0101 <code>send_to_site()<\/code> funkcija klas\u0113 <code>WPvivid_Send_to_site<\/code> (ieejas punkts ar parametru <code>wpvivid_action=send_to_site<\/code>).<\/p>\n\n\n\n<p>Pl\u016bsma ir aptuveni \u0161\u0101da: no <code>$_POST['wpvivid_content']<\/code> tiek sa\u0146emts base64 kod\u0113ts saturs, tas tiek atkod\u0113ts un nodots at\u0161ifr\u0113\u0161anai (<code>decrypt_message()<\/code>), izmantojot spraud\u0146a iestat\u012bjumos saglab\u0101to atsl\u0113gu materi\u0101lu. Probl\u0113ma rodas kriptogr\u0101fijas posm\u0101 un p\u0113c tam faila pierakst\u012b\u0161an\u0101 uz diska.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) Nepareiza k\u013c\u016bdu apstr\u0101de RSA at\u0161ifr\u0113\u0161an\u0101 \u2192 paredzama AES\/Rijndael atsl\u0113ga<\/h3>\n\n\n\n<p>Ievainojam\u012bbas aprakst\u0101 ir divas kombin\u0113tas probl\u0113mas. Pirm\u0101: ja sesijas atsl\u0113gas RSA at\u0161ifr\u0113\u0161ana neizdodas (Wordfence piemin <code>openssl_private_decrypt()<\/code> neveiksmi un to, ka izpilde netiek aptur\u0113ta), rezult\u0101ts var b\u016bt <code>false<\/code>. \u0160is <code>false<\/code> non\u0101k t\u0101l\u0101k l\u012bdz AES\/Rijndael \u0161ifra inicializ\u0101cijai (phpseclib), un bibliot\u0113ka <code>false<\/code> v\u0113rt\u012bbu interpret\u0113 k\u0101 virkni no null-baitiem (null bytes).<\/p>\n\n\n\n<p>No uzbruc\u0113ja skatpunkta tas ir kritiski: ja \u0161ifr\u0113\u0161anas atsl\u0113ga k\u013c\u016bst <strong>paredzama<\/strong> (praktiski \u201cnull-baitu atsl\u0113ga\u201d), uzbruc\u0113js var sagatavot \u0161ifr\u0113tu payload, kas tiks korekti \u201cat\u0161ifr\u0113ts\u201d ar \u0161o paredzamo atsl\u0113gu. Rezult\u0101t\u0101 iesp\u0113jams kontrol\u0113t t\u0101l\u0101k apstr\u0101d\u0101jamo saturu, neesot autentific\u0113tam.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2) Faila ce\u013ca sanitiz\u0101cijas tr\u016bkums + failu tipu\/ekstenziju kontroles tr\u016bkums<\/h3>\n\n\n\n<p>Otr\u0101 probl\u0113ma: spraudnis pie\u0146em faila nosaukumu no at\u0161ifr\u0113t\u0101 payload bez pietiekamas sanitiz\u0101cijas, kas \u013cauj <strong>directory traversal<\/strong> (izk\u013c\u016bt \u0101rpus aizsarg\u0101t\u0101 backup direktorija). Kombin\u0101cij\u0101 ar to, ka aug\u0161upiel\u0101des funkcij\u0101 s\u0101kotn\u0113ji nebija faila tipa vai ekstenzijas ierobe\u017eojumu, uzbruc\u0113js var m\u0113\u0123in\u0101t aug\u0161upiel\u0101d\u0113t, piem\u0113ram, <strong>PHP<\/strong> failu k\u0101d\u0101 publiski sasniedzam\u0101 direktorij\u0101 un p\u0113c tam to izsaukt caur p\u0101rl\u016bku, lai pan\u0101ktu <strong>Remote Code Execution<\/strong>.<\/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\">K\u0101p\u0113c Arbitrary File Upload gandr\u012bz vienm\u0113r ir \u201cgame over\u201d<\/h4>\n\n\n<p>Ja uzbruc\u0113js var aug\u0161upiel\u0101d\u0113t PHP failu webroot zon\u0101 un to izsaukt, t\u0101l\u0101k parasti seko webshell, jaunu admin kontu izveide, spraud\u0146u\/t\u0113mu aizvieto\u0161ana, datu eksfiltr\u0101cija un persistences meh\u0101nismi.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Iel\u0101ps 0.9.124: kas tika main\u012bts<\/h2>\n\n\n\n<p>Wordfence apraksta divus b\u016btiskus labojumus, ko ieviesa WPvivid izstr\u0101d\u0101t\u0101ji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) <code>decrypt_message()<\/code> p\u0101rtrauc darbu, ja RSA atsl\u0113ga ir neder\u012bga<\/h3>\n\n\n\n<p>Iel\u0101p\u0101 pievienota p\u0101rbaude uz <code>$key<\/code> v\u0113rt\u012bbu: ja p\u0113c RSA at\u0161ifr\u0113\u0161anas atsl\u0113ga ir <code>false<\/code> vai tuk\u0161a, funkcija atgrie\u017e <code>false<\/code> un t\u0101l\u0101k netiek inicializ\u0113ts Rijndael \u0161ifrs ar \u201cnull-baitu\u201d atsl\u0113gu.<\/p>\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>$key = $rsa-&gt;decrypt($key);\n\n\/\/ Patch: terminate decryption path when key is invalid\nif ($key === false || empty($key))\n{\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:#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:#6A737D\">\/\/ Patch: terminate decryption path when key is invalid<\/span><\/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:#E1E4E8\">{<\/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<h3 class=\"wp-block-heading\">2) <code>send_to_site()<\/code> pievieno dro\u0161u faila nosaukumu apstr\u0101di un at\u013cauto ekstenziju sarakstu<\/h3>\n\n\n\n<p>Papildus kriptogr\u0101fijas labojumam, spraudnis pievienoja failu ekstenziju p\u0101rbaudi, lai aug\u0161upiel\u0101dei caur \u0161o ce\u013cu tiktu pie\u013cauti tikai rezerves kopij\u0101m rakstur\u012bgi form\u0101ti. Wordfence piem\u0113r\u0101 redzams, ka tiek normaliz\u0113ts faila nosaukums ar <code>basename()<\/code> un <code>preg_replace()<\/code>, un at\u013cauto ekstenziju sarakst\u0101 ir <code>zip<\/code>, <code>gz<\/code>, <code>tar<\/code>, <code>sql<\/code>. Ja ekstenzija neatbilst, atgrie\u017eas k\u013c\u016bda un izpilde tiek aptur\u0113ta.<\/p>\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>$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{\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:#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\">{<\/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\">Atkl\u0101\u0161anas laika skala (Disclosure Timeline)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>2026. gada 12. janv\u0101ris<\/strong> &#8211; Wordfence sa\u0146\u0113ma zi\u0146ojumu par Arbitrary File Upload ievainojam\u012bbu WPvivid Backup, izmantojot Wordfence Bug Bounty Program.<\/li>\n\n\n<li><strong>2026. gada 22. janv\u0101ris<\/strong> &#8211; zi\u0146ojums tika valid\u0113ts, apstiprin\u0101ts proof-of-concept ekspluat\u0101cijas scen\u0101rijs; vendoram nos\u016bt\u012bts pirmais kontakts ar aicin\u0101jumu izmantot <a href=\"https:\/\/www.wordfence.com\/threat-intel\/vendor\/vulnerability-management-portal\/\">Wordfence Vulnerability Management Portal<\/a> ievainojam\u012bbas atkl\u0101\u0161anas procesa vad\u012bbai.<\/li>\n\n\n<li><strong>2026. gada 22. janv\u0101ris<\/strong> &#8211; Wordfence Premium\/Care\/Response lietot\u0101ji sa\u0146\u0113ma ugunsm\u016bra noteikumu papildu aizsardz\u012bbai.<\/li>\n\n\n<li><strong>2026. gada 23. janv\u0101ris<\/strong> &#8211; vendors atbild\u0113ja un izv\u0113l\u0113j\u0101s komunik\u0101ciju pa e-pastu.<\/li>\n\n\n<li><strong>2026. gada 23. janv\u0101ris<\/strong> &#8211; Wordfence nos\u016bt\u012bja vendoram pilnas atkl\u0101\u0161anas deta\u013cas; vendors apstiprin\u0101ja un s\u0101ka labojuma izstr\u0101di.<\/li>\n\n\n<li><strong>2026. gada 28. janv\u0101ris<\/strong> &#8211; public\u0113ta piln\u012bb\u0101 salabot\u0101 spraud\u0146a versija <strong>0.9.124<\/strong>.<\/li>\n\n\n<li><strong>2026. gada 21. febru\u0101ris<\/strong> &#8211; Wordfence Free lietot\u0101ji sa\u0146ems identisku ugunsm\u016bra aizsardz\u012bbu.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">P\u0113tnieks un Wordfence Bug Bounty programmas konteksts<\/h2>\n\n\n\n<p>Ievainojam\u012bbu atkl\u0101ja un atbild\u012bgi zi\u0146oja <strong>Lucas Montes (NiRoX)<\/strong> caur Wordfence <a href=\"https:\/\/www.wordfence.com\/threat-intel\/bug-bounty-program\/\">Bug Bounty Program<\/a>. Wordfence nor\u0101da, ka zi\u0146ojums programm\u0101 non\u0101ca tikai <strong>piecas dienas p\u0113c ievainojam\u012bbas ievie\u0161anas<\/strong>, un par atkl\u0101jumu p\u0113tnieks sa\u0146\u0113ma <strong>$2,145.00<\/strong> atl\u012bdz\u012bbu.<\/p>\n\n\n\n<p>Wordfence ar\u012b uzsver, ka vi\u0146u Bug Bounty programma ir pieejama WordPress spraud\u0146iem un t\u0113m\u0101m bez maksas no vendoru puses, un p\u0113tnieki var nopeln\u012bt l\u012bdz <strong>$31,200 par ievainojam\u012bbu<\/strong> (atkar\u012bb\u0101 no apjoma un kritiskuma), iesniedzot atbilsto\u0161us zi\u0146ojumus.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nosl\u0113gums<\/h2>\n\n\n\n<p>\u0160is ir klasisks piem\u0113rs, kur vair\u0101kas \u0161\u0137ietami \u201cmazas\u201d lietas (k\u013c\u016bdu apstr\u0101de kriptogr\u0101fij\u0101, failu ce\u013cu sanitiz\u0101cija, ekstenziju kontrole) kop\u0101 noved pie kritiskas klases ievainojam\u012bbas. WPvivid Backup &#038; Migration gad\u012bjum\u0101 (CVE-2026-1357) uzbrukums ir neautentific\u0113ts un var beigties ar RCE, kas ir viens no slikt\u0101kajiem scen\u0101rijiem WordPress servera pus\u0113.<\/p>\n\n\n\n<p>Ja tav\u0101 infrastrukt\u016br\u0101 ir WPvivid, \u012bpa\u0161i, ja tiek izmantota rezerves kopiju sa\u0146em\u0161ana no citas vietnes ar \u0123ener\u0113tu atsl\u0113gu, dro\u0161\u0101kais solis ir vienk\u0101r\u0161s: <strong>atjaunini uz 0.9.124<\/strong> un p\u0101rliecinies, ka \u0161\u012b funkcija ir iesl\u0113gta tikai tad, ja t\u0101 tie\u0161\u0101m ir nepiecie\u0161ama.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Atsauces \/ Avoti<\/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 page)<\/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 spraudnim atkl\u0101ta kritiska (CVSS 9.8) neautentific\u0113ta failu aug\u0161upiel\u0101des ievainojam\u012bba, kas noteiktos iestat\u012bjumos \u013cauj pan\u0101kt Remote Code Execution. Ja izmanto atsl\u0113gu rezerves kopiju sa\u0146em\u0161anai no cita WordPress, atjaunini uz 0.9.124 nekav\u0113joties.<\/p>\n","protected":false},"author":51,"featured_media":212,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[122,36,15,10,121],"class_list":["post-213","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-drosiba","tag-cve-2026-1357","tag-drosiba","tag-wordfence","tag-wordpress","tag-wpvivid"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/lv\/wp-json\/wp\/v2\/posts\/213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/lv\/wp-json\/wp\/v2\/users\/51"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/lv\/wp-json\/wp\/v2\/comments?post=213"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/lv\/wp-json\/wp\/v2\/posts\/213\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/lv\/wp-json\/wp\/v2\/media\/212"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/lv\/wp-json\/wp\/v2\/media?parent=213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/lv\/wp-json\/wp\/v2\/categories?post=213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/lv\/wp-json\/wp\/v2\/tags?post=213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}