Kritinė WPvivid Backup spraga: iki 0.9.123 galima neautentifikuotai įkelti failus ir vykdyti kodą (CVE-2026-1357)
WordPress saugumo praktikoje „arbitrary file upload“ (savavališkas failų įkėlimas) beveik visada reiškia vieną: jei atakuotojas gali įkelti vykdomą failą (pvz., PHP), jis dažniausiai gali pasiekti ir remote code execution (RCE) – nuotolinį kodo vykdymą serveryje. 2026 m. vasarį Wordfence paskelbė apie būtent tokio tipo kritinę spragą WPvivid Backup & Migration įskiepyje, kuris turi daugiau nei 800 000 aktyvių diegimų.
Svarbi detalė: kritinis poveikis pasireiškia ne visiems pagal nutylėjimą. Pagal Wordfence analizę, spraga kritiškai paveikia tuos, kas įskiepio nustatymuose yra sugeneravę raktą, leidžiantį kitai svetainei atsiųsti atsarginę kopiją į tavo svetainę. Ši funkcija yra išjungta pagal nutylėjimą, o rakto galiojimo laikas gali būti nustatytas daugiausia iki 24 val.

Kas tiksliai pažeidžiama: CVE-2026-1357 santrauka
Wordfence Intelligence duomenimis, pažeidžiamumas įvardintas taip: „Migration, Backup, Staging <= 0.9.123 - Unauthenticated Arbitrary File Upload“. CVSS įvertis – 9.8 (Critical), CVE – CVE-2026-1357. Paveiktos versijos: <= 0.9.123, pataisyta versija: 0.9.124.
- Įskiepis: Migration, Backup, Staging – WPvivid Backup & Migration
- Slug: wpvivid-backuprestore
- Pažeidžiamumo tipas: Unauthenticated Arbitrary File Upload (be prisijungimo)
- Kas gali nutikti: PHP failų įkėlimas į viešai pasiekiamus katalogus ir RCE
- Išnaudojimo vektorius: per parametrą
wpvivid_action=send_to_site - Pataisyta: 0.9.124
Kodėl spraga įmanoma: klaidos kriptografijoje + kelio (path) validacijos trūkumas
WPvivid turi funkciją priimti atsarginę kopiją iš kitos svetainės. Tai realizuota per trumpalaikį sugeneruotą raktą, o priėmimo logika, anot Wordfence, sukasi apie send_to_site() metodą klasėje WPvivid_Send_to_site. Kai gaunamas POST laukas wpvivid_content, turinys base64 iškoduojamas ir perduodamas į decrypt_message() (klasėje WPvivid_crypt).
Problema prasideda dešifravimo grandinėje: įskiepis bando RSA būdu iššifruoti sesijos raktą. Jei RSA dešifravimas nepavyksta (Wordfence mini scenarijų su openssl_private_decrypt()), vykdymas nenutraukiamas, o „neteisingo rakto“ būsena kažkurioje grandies vietoje tampa boolean false. Tuomet šis false perduodamas toliau į AES/Rijndael inicializaciją per phpseclib mechaniką.
Esminis niuansas: phpseclib pusėje false gali būti interpretuojamas kaip „null bytes“ eilutė (nuliniai baitai), todėl raktas tampa nuspėjamas. Tai suteikia galimybę atakuotojui sukonstruoti šifruotą payload’ą su žinomu „null-byte“ raktu ir priversti įskiepį sėkmingai jį apdoroti.
Antra dalis – failo rašymas į diską. Wordfence nurodo, kad įskiepis priima failų vardus iš dešifruoto payload’o be kelio sanitizacijos, todėl atsiranda directory traversal galimybė (pabėgimas iš „apsaugoto“ backup katalogo). Rezultatas: neautentifikuotas atakuotojas gali įkelti pasirinktą failą (pvz., PHP) į viešai pasiekiamą katalogą ir jį atidaryti, taip inicijuodamas RCE.
Kodėl tai pavojinga praktiškai
Tokio tipo spragos dažnai baigiasi pilnu svetainės perėmimu: webshell įkėlimu, administratoriaus paskyrų kūrimu, papildomų backdoor’ų įrašymu, duomenų eksfiltracija. Wordfence tiesiai įvardina, kad tai gali vesti į „complete site compromise“.
Kada tai „tikrai kritiška“: priklausomybė nuo sugeneruoto rakto
Ši istorija turi vieną saugumo požiūriu svarbų filtrą: Wordfence akcentuoja, kad spraga kritiškai paveikia tuos WPvivid naudotojus, kurie įskiepio nustatymuose yra aktyvavę funkciją, leidžiančią kitai svetainei siųsti backup’ą į tavo svetainę, t. y. yra sugeneravę atitinkamą raktą. Pagal nutylėjimą ši funkcija išjungta, o rakto galiojimas negali būti ilgesnis nei 24 valandos.
Pataisymas 0.9.124: aiškus false/empty patikrinimas ir failo tipo kontrolė
Kūrėjai sprendė problemą dviem kryptimis. Pirma – decrypt_message() funkcijoje pridėjo patikrą, kuri grąžina false, jei RSA dešifravimas grąžina false arba raktas yra tuščias. Taip nebelieka situacijos, kai į Rijndael/AES inicializaciją patenka nuspėjamas „null bytes“ raktas.
<?php
// ...
$key = $rsa->decrypt($key);
// Pataisymas: nebetęsti, jei raktas negautas
if ($key === false || empty($key)) {
return false;
}
$rij = new Crypt_Rijndael();
$rij->setKey($key);
return $rij->decrypt($data);
Antra – send_to_site() pusėje pridėtas failo plėtinio tikrinimas. Įskiepis pradėjo normalizuoti failo pavadinimą (basename + preg_replace), o tada leisti tik konkrečius backup’ams būdingus plėtinius: zip, gz, tar, sql. Jei plėtinys nepatenka į leidžiamų sąrašą, grąžinama klaida ir vykdymas nutraukiamas.
<?php
$safe_name = basename($params['name']);
$safe_name = preg_replace('/[^a-zA-Z0-9._-]/', '', $safe_name);
$allowed_extensions = array('zip', 'gz', 'tar', 'sql');
$file_ext = strtolower(pathinfo($safe_name, PATHINFO_EXTENSION));
if (!in_array($file_ext, $allowed_extensions, true)) {
$ret['result'] = WPVIVID_FAILED;
$ret['error'] = 'Invalid file type - only backup files allowed.';
echo wp_json_encode($ret);
die();
}
Ką daryti dabar: konkretūs veiksmai WordPress adminui ir dev komandai
- Patikrink, ar svetainėje įdiegtas įskiepis WPvivid Backup & Migration (slug
wpvivid-backuprestore). - Jei versija 0.9.123 arba senesnė – atnaujink iki 0.9.124 (ar naujesnės) kuo greičiau.
- Įvertink, ar buvai įjungęs funkciją, kuri leidžia kitai svetainei siųsti backup’ą į tavo svetainę (tai tas scenarijus su sugeneruotu raktu). Jei taip – laikyk situaciją prioritetine.
- Jei naudoji Wordfence: Premium/Care/Response naudotojai, pagal Wordfence, gavo ugniasienės taisyklę 2026-01-22; Wordfence Free tą pačią apsaugą gaus 2026-02-21 (30 dienų vėliau).
- Net jei planuoji remtis ugniasiene, pataisyto įskiepio atnaujinimas vis tiek būtinas – ugniasienė nėra pakaitalas pataisymui.
Atskleidimo laiko juosta (Disclosure Timeline)
- 2026-01-12 – Wordfence Bug Bounty Program gautas pranešimas apie Arbitrary File Upload spragą WPvivid Backup įskiepyje.
- 2026-01-22 – Wordfence patvirtino ataskaitą ir proof-of-concept exploit’ą; tiekėjas pakviestas naudotis Wordfence Vulnerability Management Portal.
- 2026-01-22 – Wordfence Premium/Care/Response naudotojams pristatyta ugniasienės taisyklė nuo bandymų išnaudoti spragą.
- 2026-01-23 – tiekėjas atsakė ir pasirinko komunikaciją el. paštu.
- 2026-01-23 – Wordfence perdavė pilnas atskleidimo detales; tiekėjas patvirtino ir pradėjo taisymą.
- 2026-01-28 – išleista pilnai pataisyta įskiepio versija 0.9.124.
- 2026-02-21 – Wordfence Free naudotojai gaus analogišką ugniasienės apsaugą.
Kas atrado spragą ir kaip ji buvo pranešta
Pažeidžiamumą aptiko ir atsakingai pranešė tyrėjas Lucas Montes (NiRoX) per Wordfence Bug Bounty Program. Wordfence nurodo, kad pranešimas programą pasiekė praėjus vos penkioms dienoms po to, kai spraga buvo įvesta, o už atradimą išmokėta $2,145.00 premija.
Pastaba apie Wordfence Bug Bounty
Wordfence savo Bug Bounty Program apraše akcentuoja, kad tyrėjai gali uždirbti iki $31,200 per pažeidžiamumą (programos taisyklių ir scope ribose), o detales galima pateikti per submission formą.
Esmė trumpai
CVE-2026-1357 yra kritinė spraga WPvivid Backup & Migration įskiepyje (<= 0.9.123), leidžianti neautentifikuotai įkelti pasirinktus failus ir pasiekti RCE - ypač jei buvo naudojamas sugeneruotas raktas „backup priėmimui iš kitos svetainės“. Pataisymas yra 0.9.124 versijoje: pridėta false/empty patikra dešifravime ir failo plėtinio validacija send_to_site() dalyje.
Nuorodos / Šaltiniai
- 800,000 WordPress Sites Affected by Arbitrary File Upload Vulnerability in WPvivid Backup WordPress Plugin
- Migration, Backup, Staging <= 0.9.123 — Unauthenticated Arbitrary File Upload
- CVE-2026-1357
- WPvivid Backup & Migration
- Wordfence Bug Bounty Program
- Wordfence Vulnerability Management Portal
- Lucas Montes (NiRoX)
- Wordfence Premium
- Wordfence Care
- Wordfence Response
Mantas Jonaitis
Vyresnysis programinės įrangos architektas su 25+ metų patirtimi. Pasenusių sistemų modernizavimas ir įmonių architektūra yra mano specializacija. Patirtis išmokė kantrybės.
Visi įrašai