{"id":232,"date":"2026-02-11T16:39:20","date_gmt":"2026-02-11T15:39:20","guid":{"rendered":"https:\/\/helloblog.io\/nl\/kritieke-file-upload-kwetsbaarheid-wpvivid-backup-cve-2026-1357\/"},"modified":"2026-02-11T16:39:20","modified_gmt":"2026-02-11T15:39:20","slug":"kritieke-file-upload-kwetsbaarheid-wpvivid-backup-cve-2026-1357","status":"publish","type":"post","link":"https:\/\/helloblog.io\/nl\/kritieke-file-upload-kwetsbaarheid-wpvivid-backup-cve-2026-1357\/","title":{"rendered":"Kritieke file upload-kwetsbaarheid in WPvivid Backup treft tot 800.000 sites (CVE-2026-1357)"},"content":{"rendered":"\n<p>Er is een <strong>kritieke Arbitrary File Upload<\/strong>-kwetsbaarheid gevonden in de WordPress-plugin <strong>WPvivid Backup &#038; Migration<\/strong> (slug: <code>wpvivid-backuprestore<\/code>), een plugin met meer dan <strong>800.000 actieve installaties<\/strong>. De impact is fors: een niet-authenticeerde aanvaller kan onder de verkeerde omstandigheden <strong>willekeurige bestanden uploaden<\/strong> en daarmee <strong>Remote Code Execution (RCE)<\/strong> bereiken-oftewel: code draaien op je server, wat in de praktijk vaak eindigt in een complete site-overname.<\/p>\n\n\n\n<p>Belangrijk nuancepunt: volgens de advisory is dit vooral <strong>kritiek<\/strong> voor sites waar je in de plugin-instellingen een <strong>gegenereerde key<\/strong> hebt aangemaakt om een backup van een andere site te laten ontvangen. Die functie staat <strong>standaard uit<\/strong>, en de <strong>key-expiratie<\/strong> kan maximaal op <strong>24 uur<\/strong> worden gezet. Maar als die feature aan stond (of recent aan heeft gestaan), dan wil je hier niet mee wachten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wat is er precies aan de hand?<\/h2>\n\n\n\n<p>De kwetsbaarheid is geregistreerd als <strong>CVE-2026-1357<\/strong> met een <strong>CVSS-score van 9.8 (Critical)<\/strong>. Wordfence beschrijft het als: <strong>Unauthenticated Arbitrary File Upload<\/strong> in versies <strong>t\/m 0.9.123<\/strong>, opgelost in <strong>0.9.124<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Kwetsbaarheid: Unauthenticated Arbitrary File Upload<\/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>Getroffen versies: <strong><= 0.9.123<\/strong><\/li>\n\n\n<li>Gepatcht in: <strong>0.9.124<\/strong><\/li>\n\n\n<li>Plugin: Migration, Backup, Staging &#8211; WPvivid Backup &#038; Migration (slug <code>wpvivid-backuprestore<\/code>)<\/li>\n\n<\/ul>\n\n\n\n<p>In de aanvalsketen combineert de plugin (in de getroffen versies) een cryptografische foutafhandeling met onvoldoende sanitization van paden\/bestandsnamen. Dat maakt het mogelijk om een payload z\u00f3 te construeren dat er uiteindelijk een upload op schijf belandt op een plek waar je \u2018m publiek kunt benaderen-en als dat bestand PHP is, heb je al snel RCE.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wanneer is je site vooral kwetsbaar?<\/h2>\n\n\n\n<p>De kern zit in een WPvivid-feature waarmee je <strong>een backup kunt ontvangen van een andere site<\/strong>. Daarvoor genereert WPvivid een <strong>kortlevende key<\/strong> in de instellingen. In de advisory wordt expliciet benadrukt:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>De feature om een backup te ontvangen via een gegenereerde key is <strong>disabled by default<\/strong>.<\/li>\n\n\n<li>De <strong>key expiration<\/strong> kan maximaal op <strong>24 uur<\/strong> worden ingesteld.<\/li>\n\n\n<li>Het risico is vooral kritisch wanneer zo\u2019n key aanwezig\/actief is in de plugininstellingen (om \u2018send to site\u2019 te gebruiken).<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Technische analyse (wat ging er fout?)<\/h2>\n\n\n\n<p>Wordfence beschrijft dat WPvivid de ontvangen backup-afhandeling doet via <code>send_to_site()<\/code> in de class <code>WPvivid_Send_to_site<\/code>. De request bevat onder andere <code>$_POST['wpvivid_content']<\/code> (base64) en wordt gedecrypteerd met een sleutel uit de pluginoptie <code>wpvivid_api_token<\/code> (met o.a. een <code>private_key<\/code>). De decryptieroute loopt via <code>WPvivid_crypt::decrypt_message()<\/code>.<\/p>\n\n\n\n<p>Het probleem begint bij het RSA-decrypten van een sessiesleutel. Als het decrypten faalt (Wordfence noemt specifiek een falende <code>openssl_private_decrypt()<\/code>-stap; in de getoonde code gebeurt decryptie via <code>Crypt_RSA()-&gt;decrypt()<\/code>), levert dat een <strong>boolean <code>false<\/code><\/strong> op. En daar gaat het mis: de plugin stopt de uitvoering niet, maar gebruikt die <code>false<\/code> als input voor de AES\/Rijndael-initialisatie (via phpseclib). In die library wordt <code>false<\/code> vervolgens ge\u00efnterpreteerd als een string van <strong>null bytes<\/strong>. Daardoor wordt de gebruikte sleutel voorspelbaar.<\/p>\n\n\n\n<p>Gevolg: een aanvaller kan de payload z\u00f3 encrypten dat die correct \u2018decrypteert\u2019 onder die voorspelbare null-byte key. Daar bovenop komt dat de plugin bestandsnamen uit de gedecrypteerde payload accepteert zonder voldoende pad-sanitization, waardoor <strong>directory traversal<\/strong> mogelijk is om buiten de bedoelde backup-directory te schrijven. Uiteindelijk kun je dan een <strong>willekeurige PHP-file<\/strong> in een publiek toegankelijke directory plaatsen en die aanroepen voor <strong>Remote Code Execution<\/strong>, volgens Wordfence via de parameter <code>wpvivid_action=send_to_site<\/code>.<\/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\">Waarom Arbitrary File Upload bijna altijd \u2018game over\u2019 is<\/h4>\n\n\n<p>Zodra een aanvaller (zonder login) een PHP-bestand kan uploaden naar een uitvoerbare locatie, is het typische vervolg: webshell plaatsen, persistente backdoors, admin accounts aanmaken, of server-side pivots. Daarom worden dit soort issues vaak als \u2018complete compromise\u2019 gezien.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">De patch: wat is er aangepast in 0.9.124?<\/h2>\n\n\n\n<p>De vendor heeft de kwetsbaarheid op twee plekken aangescherpt:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>In <code>decrypt_message()<\/code> is een <strong>extra check<\/strong> toegevoegd: als <code>$key === false<\/code> of <code>empty($key)<\/code>, dan stopt de functie en returnt <code>false<\/code>. Daarmee voorkom je dat een mislukte decryptie alsnog leidt tot een voorspelbare null-byte sleutel in de cipher-initialisatie.<\/li>\n\n\n<li>In <code>send_to_site()<\/code> is een <strong>file extension allowlist<\/strong> toegevoegd zodat alleen backup-bestandstypes geaccepteerd worden. In de patch worden o.a. <code>zip<\/code>, <code>gz<\/code>, <code>tar<\/code> en <code>sql<\/code> toegestaan, en wordt de naam genormaliseerd met <code>basename()<\/code> en een <code>preg_replace('\/[^a-zA-Z0-9._-]\/', '', ...)<\/code> voordat de extensie gecheckt wordt. Bij een ongeldige extensie wordt de upload geweigerd met de foutmelding: <code>Invalid file type - only backup files allowed.<\/code><\/li>\n\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Wordfence mitigatie: firewall rules en timing<\/h2>\n\n\n\n<p>Naast de pluginfix heeft Wordfence een firewallregel uitgerold om exploitpogingen tegen te houden:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>January 22, 2026<\/strong>: firewall rule beschikbaar voor <strong>Wordfence Premium<\/strong>, <strong>Wordfence Care<\/strong> en <strong>Wordfence Response<\/strong>.<\/li>\n\n\n<li><strong>February 21, 2026<\/strong>: dezelfde bescherming komt (30 dagen later) beschikbaar voor <strong>Wordfence Free<\/strong>.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Disclosure timeline (zoals gerapporteerd)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>January 12, 2026<\/strong> &#8211; Wordfence ontvangt de melding van de Arbitrary File Upload-kwetsbaarheid via het Wordfence Bug Bounty Program.<\/li>\n\n\n<li><strong>January 22, 2026<\/strong> &#8211; Wordfence valideert de report en bevestigt een proof-of-concept exploit. De vendor wordt benaderd met een uitnodiging voor het Wordfence Vulnerability Management Portal: https:\/\/www.wordfence.com\/threat-intel\/vendor\/vulnerability-management-portal\/<\/li>\n\n\n<li><strong>January 22, 2026<\/strong> &#8211; Wordfence Premium\/Care\/Response-klanten krijgen een firewall rule ter extra bescherming.<\/li>\n\n\n<li><strong>January 23, 2026<\/strong> &#8211; Vendor reageert en kiest voor disclosure via e-mail.<\/li>\n\n\n<li><strong>January 23, 2026<\/strong> &#8211; Wordfence stuurt de volledige disclosure details; vendor bevestigt en start met een fix.<\/li>\n\n\n<li><strong>January 28, 2026<\/strong> &#8211; Release van de volledig gepatchte pluginversie <strong>0.9.124<\/strong>.<\/li>\n\n\n<li><strong>February 21, 2026<\/strong> &#8211; Wordfence Free krijgt dezelfde firewallbescherming.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Wat moet je nu doen? (praktische checklist)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Update WPvivid Backup &#038; Migration naar 0.9.124<\/strong> (of nieuwer) zo snel mogelijk. Alles <strong><= 0.9.123<\/strong> is kwetsbaar volgens de advisory.<\/li>\n\n\n<li>Controleer in WPvivid of je ooit een <strong>gegenereerde key<\/strong> hebt gebruikt om backups van een andere site te ontvangen. Deze feature is de kritieke \u2018trigger\u2019 volgens de advisory.<\/li>\n\n\n<li>Als je \u2018send to site\u2019 niet nodig hebt: zorg dat het uit staat en verwijder\/laat keys verlopen (de expiratie kan max. <strong>24 uur<\/strong> zijn, maar ga niet alleen daarop vertrouwen).<\/li>\n\n\n<li>Als je Wordfence gebruikt: weet dat Premium\/Care\/Response sinds <strong>22 januari 2026<\/strong> een firewall rule hebben; Free volgt op <strong>21 februari 2026<\/strong>. Zie dit als extra mitigatie, niet als vervanging van patchen.<\/li>\n\n\n<li>Behandel dit als een mogelijk incident als je tekenen ziet van onverwachte bestanden of vreemde PHP in upload-\/public directories: Arbitrary File Upload wordt vaak misbruikt voor webshells en persistente toegang.<\/li>\n\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Bug bounty en credits<\/h2>\n\n\n\n<p>De kwetsbaarheid is ontdekt en verantwoordelijk gemeld door <strong>Lucas Montes (NiRoX)<\/strong> via het Wordfence <strong>Bug Bounty Program<\/strong>. Volgens Wordfence werd de issue <strong>vijf dagen nadat die was ge\u00efntroduceerd<\/strong> al gerapporteerd. De bijbehorende bounty was <strong>$2,145.00<\/strong>.<\/p>\n\n\n\n<p>Meer context over het programma (zoals Wordfence het zelf vermeldt): vendors kunnen zonder kosten deelnemen, en researchers kunnen tot <strong>$31,200 per vulnerability<\/strong> verdienen voor in-scope meldingen. Links: <a href=\"https:\/\/www.wordfence.com\/threat-intel\/bug-bounty-program\/\">Bug Bounty Program<\/a> en <a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/submit\/\">submit<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Samenvatting<\/h2>\n\n\n\n<p>WPvivid Backup &#038; Migration had in versies <strong>t\/m 0.9.123<\/strong> een <strong>kritieke unauthenticated arbitrary file upload<\/strong> (CVE-2026-1357) die kan leiden tot <strong>Remote Code Execution<\/strong> en volledige site-compromittering, met name wanneer je de feature gebruikt waarbij een andere site een backup naar jouw site kan sturen via een gegenereerde key. De issue is opgelost in <strong>0.9.124<\/strong> door betere key-validatie tijdens decryptie en een allowlist op upload-extensies. Update dus direct.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Referenties \/ Bronnen<\/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 plugin directory)<\/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><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Gebruik je WPvivid Backup &#038; Migration en heb je ooit een \u2018send to site\u2019-key gegenereerd? Dan kon een niet-ingelogde aanvaller in oude versies willekeurige bestanden uploaden en code uitvoeren.<\/p>\n","protected":false},"author":23,"featured_media":231,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[113,111,14,10,112],"class_list":["post-232","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-beveiliging","tag-cve-2026-1357","tag-plugin-security","tag-wordfence","tag-wordpress","tag-wpvivid"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts\/232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/users\/23"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/comments?post=232"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts\/232\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/media\/231"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/media?parent=232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/categories?post=232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/tags?post=232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}