{"id":222,"date":"2026-02-11T16:39:30","date_gmt":"2026-02-11T15:39:30","guid":{"rendered":"https:\/\/helloblog.io\/de\/kritische-file-upload-luecke-wpvivid-backup-cve-2026-1357\/"},"modified":"2026-02-11T16:39:30","modified_gmt":"2026-02-11T15:39:30","slug":"kritische-file-upload-luecke-wpvivid-backup-cve-2026-1357","status":"publish","type":"post","link":"https:\/\/helloblog.io\/de\/kritische-file-upload-luecke-wpvivid-backup-cve-2026-1357\/","title":{"rendered":"Kritische File-Upload-L\u00fccke in WPvivid Backup: Bis zu 800.000 WordPress-Installationen potenziell betroffen"},"content":{"rendered":"\n<p>Im WordPress-\u00d6kosystem sind Backup-Plugins oft der letzte Rettungsanker \u2013 und gleichzeitig ein attraktives Ziel. F\u00fcr das Plugin <strong>WPvivid Backup &#038; Migration<\/strong> (WordPress.org-Slug: <code>wpvivid-backuprestore<\/code>) wurde eine <strong>kritische Arbitrary-File-Upload-Schwachstelle<\/strong> gemeldet, die bei erfolgreicher Ausnutzung in <strong>Remote Code Execution (RCE)<\/strong> und damit typischerweise in einer vollst\u00e4ndigen Website-\u00dcbernahme endet.<\/p>\n\n\n\n<p>Wichtig f\u00fcr die Einsch\u00e4tzung: Laut Analyse betrifft das Problem <strong>vor allem Installationen, bei denen in den Plugin-Einstellungen ein Schl\u00fcssel (\u201egenerated key\u201c) erzeugt wurde<\/strong>, um von einer anderen Website ein Backup auf diese Website zu \u00fcbertragen. Diese Funktion ist <strong>standardm\u00e4\u00dfig deaktiviert<\/strong>, und die <strong>Ablaufzeit des Keys<\/strong> l\u00e4sst sich nur <strong>bis maximal 24 Stunden<\/strong> konfigurieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kurz\u00fcberblick: CVE, betroffene Versionen, Fix<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Schwachstelle: <strong>Unauthenticated Arbitrary File Upload<\/strong><\/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>Betroffene Versionen: <strong>\u2264 0.9.123<\/strong><\/li>\n\n\n<li>Gefixte Version: <strong>0.9.124<\/strong><\/li>\n\n\n<li>Angriffsvektor laut Advisory: \u00fcber den Parameter <strong><code>wpvivid_action=send_to_site<\/code><\/strong><\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Warum das kritisch ist: Unauthentifizierter Upload bis hin zu RCE<\/h2>\n\n\n\n<p>Ein \u201eArbitrary File Upload\u201c ist in WordPress-Kontexten fast immer eine der unangenehmsten Klassen von Bugs: Wenn Angreifer beliebige Dateien hochladen k\u00f6nnen \u2013 insbesondere <strong>PHP-Dateien<\/strong> \u2013 ist der Schritt zum Ausf\u00fchren von Code auf dem Server meist klein. In der Praxis sieht man danach h\u00e4ufig Webshells, Persistenz-Mechanismen und weitere Nachlade-Stufen.<\/p>\n\n\n\n<p>Bei dieser L\u00fccke geht es explizit um <strong>nicht angemeldete Angreifer<\/strong> (unauthenticated). Das erh\u00f6ht den Druck, weil kein bestehendes Konto (z. B. Subscriber) ben\u00f6tigt wird \u2013 sofern die betroffene Funktionalit\u00e4t auf der Site aktiv und erreichbar ist.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was genau passiert technisch? (Analyse der Ursache)<\/h2>\n\n\n\n<p>WPvivid bringt u. a. eine Funktion mit, um <strong>Backups von einer anderen Site zu empfangen<\/strong>. Daf\u00fcr wird ein <strong>kurzlebiger Key<\/strong> generiert. In der untersuchten Implementierung \u00fcbernimmt die Methode <code>send_to_site()<\/code> (Klasse <code>WPvivid_Send_to_site<\/code>) das Entgegennehmen der Daten, wenn im Request <code>wpvivid_content<\/code> \u00fcbergeben wird und eine passende Konfiguration (<code>wpvivid_api_token<\/code>) existiert.<\/p>\n\n\n\n<p>Im Kern wird der Payload entschl\u00fcsselt. Der Knackpunkt: Bei der RSA-Entschl\u00fcsselung des Session-Keys kann etwas schiefgehen \u2013 und genau dort greift eine Kombination aus <strong>fehlerhafter Fehlerbehandlung<\/strong> und <strong>fehlender Pfad-\/Dateiname-Sanitization<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) Fehlerbehandlung bei RSA-Decrypt f\u00fchrt zu \u201eNull-Byte-Key\u201c<\/h3>\n\n\n\n<p>Laut Advisory kann der RSA-Decryption-Step (u. a. via <code>openssl_private_decrypt()<\/code> bzw. im gezeigten Codepfad via phpseclib <code>Crypt_RSA()-&gt;decrypt()<\/code>) fehlschlagen. Statt die Verarbeitung sauber abzubrechen, wird ein <strong>Boolean <code>false<\/code><\/strong> weitergereicht. In der nachfolgenden AES-\/Rijndael-Initialisierung (phpseclib <code>Crypt_Rijndael<\/code>) wird dieses <code>false<\/code> von der Library als <strong>String aus Null-Bytes<\/strong> interpretiert \u2013 faktisch ein vorhersehbarer Schl\u00fcssel.<\/p>\n\n\n\n<p>Dadurch entsteht ein ung\u00fcnstiger Effekt: Ein Angreifer kann den weiteren Payload so konstruieren bzw. verschl\u00fcsseln, dass er mit diesem vorhersagbaren Null-Byte-Key entschl\u00fcsselt wird. Das macht die Schutzannahme \u201eOhne korrekten Key kein g\u00fcltiger Inhalt\u201c angreifbar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2) Dateiname aus entschl\u00fcsseltem Payload + fehlende Sanitisierung = Directory Traversal<\/h3>\n\n\n\n<p>Zus\u00e4tzlich akzeptiert die betroffene Logik Dateinamen aus dem entschl\u00fcsselten Payload, ohne sie ausreichend zu bereinigen. Das erm\u00f6glicht <strong>Directory Traversal<\/strong> (z. B. \u00fcber <code>..\/<\/code>), wodurch Angreifer aus dem eigentlich vorgesehenen Backup-Verzeichnis \u201eausbrechen\u201c k\u00f6nnen. Ergebnis: Dateien lassen sich in <strong>\u00f6ffentlich erreichbare Verzeichnisse<\/strong> schreiben \u2013 und wenn das eine PHP-Datei ist, ist der Weg zur RCE offen.<\/p>\n\n\n\n<p>Das Advisory beschreibt au\u00dferdem, dass in der anf\u00e4lligen Implementierung <strong>keine Checks auf Dateityp oder Dateiendung<\/strong> vorhanden waren. Genau das macht Arbitrary-Upload-Bugs meist so fatal: Es gibt keinen zus\u00e4tzlichen Filter, der das Hochladen ausf\u00fchrbarer Dateien verhindert.<\/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\">Einschr\u00e4nkung, die du ernst nehmen solltest<\/h4>\n\n\n<p>Die Schwachstelle wird laut Bericht nur dann <strong>kritisch<\/strong>, wenn in WPvivid ein <strong>generated key<\/strong> f\u00fcr das Empfangen von Backups von anderen Sites erzeugt wurde (Feature standardm\u00e4\u00dfig aus) \u2013 und die Key-Ablaufzeit ist auf <strong>maximal 24 Stunden<\/strong> begrenzt. Dennoch: Wenn diese Funktion aktiv genutzt wird, ist das Risiko hoch.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">So wurde es gefixt: Abbruch bei ung\u00fcltigem Key + Whitelist f\u00fcr Dateiendungen<\/h2>\n\n\n\n<p>Der Hersteller hat den Fix in zwei zentralen Punkten umgesetzt:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>In <code>decrypt_message()<\/code> wird der entschl\u00fcsselte Key jetzt gepr\u00fcft. Wenn <code>decrypt()<\/code> <strong><code>false<\/code><\/strong> liefert oder der Key <strong>leer<\/strong> ist, wird sauber abgebrochen und <code>false<\/code> zur\u00fcckgegeben \u2013 statt mit einem impliziten Null-Byte-Key weiterzumachen.<\/li>\n\n\n<li>In <code>send_to_site()<\/code> wurde eine <strong>Dateiendungspr\u00fcfung<\/strong> erg\u00e4nzt. Der Dateiname wird u. a. \u00fcber <code>basename()<\/code> reduziert und per <code>preg_replace('\/[^a-zA-Z0-9._-]\/', '', ...)<\/code> bereinigt. Zus\u00e4tzlich gibt es eine Whitelist erlaubter Endungen: <code>zip<\/code>, <code>gz<\/code>, <code>tar<\/code>, <code>sql<\/code>. Alles andere wird mit einer Fehlermeldung abgelehnt.<\/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>$key = $rsa-&gt;decrypt($key);\nif ($key === false || empty($key))\n{\n    return false;\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 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 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>$safe_name = basename($params['name']);\n$safe_name = preg_replace('\/[^a-zA-Z0-9._-]\/', '', $safe_name);\n$allowed_extensions = array('zip', 'gz', 'tar', 'sql');\n$file_ext = strtolower(pathinfo($safe_name, PATHINFO_EXTENSION));\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 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 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\">Was du jetzt konkret tun solltest (Checkliste)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Pr\u00fcfe, ob das Plugin <strong>WPvivid Backup &#038; Migration<\/strong> auf der Site aktiv ist (Slug: <code>wpvivid-backuprestore<\/code>).<\/li>\n\n\n<li>Pr\u00fcfe die installierte Version: Wenn <strong>\u2264 0.9.123<\/strong>, besteht Handlungsbedarf.<\/li>\n\n\n<li>Update auf <strong>0.9.124<\/strong> (gepatchte Version laut Advisory).<\/li>\n\n\n<li>Wenn du die Funktion zum Empfangen von Backups von anderen Sites nutzt: Pr\u00fcfe, ob in den Einstellungen ein <strong>generated key<\/strong> aktiv\/zuletzt aktiv war, und bewerte das Risiko entsprechend (Feature ist standardm\u00e4\u00dfig aus, Key-Lifetime max. 24 Stunden).<\/li>\n\n\n<li>Wenn du Wordfence einsetzt: Beachte, dass laut Bericht <strong>Premium\/Care\/Response<\/strong> am <strong>22. Januar 2026<\/strong> eine Firewall-Regel erhalten haben; <strong>Wordfence Free<\/strong> soll die Regel <strong>30 Tage sp\u00e4ter, am 21. Februar 2026<\/strong>, bekommen.<\/li>\n\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Disclosure Timeline (laut Bericht)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>January 12, 2026<\/strong> \u2013 Einreichung der Arbitrary-File-Upload-Schwachstelle \u00fcber das Wordfence Bug Bounty Program.<\/li>\n\n\n<li><strong>January 22, 2026<\/strong> \u2013 Validierung und Best\u00e4tigung des Proof-of-Concept; Erstkontakt an den Hersteller inkl. Hinweis auf das Wordfence Vulnerability Management Portal.<\/li>\n\n\n<li><strong>January 22, 2026<\/strong> \u2013 Firewall-Regel f\u00fcr Wordfence Premium\/Care\/Response wird ausgerollt.<\/li>\n\n\n<li><strong>January 23, 2026<\/strong> \u2013 Hersteller antwortet und w\u00e4hlt E-Mail als Kanal f\u00fcr die weitere Kommunikation.<\/li>\n\n\n<li><strong>January 23, 2026<\/strong> \u2013 Vollst\u00e4ndige Disclosure-Details werden an den Hersteller gesendet; Fix wird begonnen.<\/li>\n\n\n<li><strong>January 28, 2026<\/strong> \u2013 Release der vollst\u00e4ndig gepatchten Version <strong>0.9.124<\/strong>.<\/li>\n\n\n<li><strong>February 21, 2026<\/strong> \u2013 Wordfence Free soll die gleiche Schutzregel erhalten.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Einordnung: Gute Zusammenarbeit, aber du musst trotzdem schnell reagieren<\/h2>\n\n\n\n<p>Positiv ist hier vor allem der schnelle Ablauf: Die Meldung ging laut Bericht nur wenige Tage nach Einf\u00fchrung der Schwachstelle ein, der Fix wurde zeitnah ver\u00f6ffentlicht. Entdeckt und verantwortungsvoll gemeldet wurde das Problem durch <strong>Lucas Montes (NiRoX)<\/strong> im Rahmen des Wordfence Bug Bounty Programms; die gemeldete Pr\u00e4mie lag bei <strong>$2,145.00<\/strong>.<\/p>\n\n\n\n<p>F\u00fcr Betreiber:innen bleibt die Kernbotschaft aber simpel: Wenn WPvivid im Einsatz ist und insbesondere die \u201eBackup von anderer Site empfangen\u201c-Funktion genutzt wurde, sollte das Update auf <strong>0.9.124<\/strong> ganz oben auf die To-do-Liste.<\/p>\n\n\n<div class=\"references-section\">\n                <h2>Referenzen \/ Quellen<\/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<\/a><\/li><li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/bug-bounty-program\/\" target=\"_blank\" rel=\"noopener noreferrer\">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><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Im WPvivid-Backup-Plugin wurde eine kritische Schwachstelle gefunden, die unter bestimmten Konfigurationen unautorisierte Datei-Uploads und Remote Code Execution erm\u00f6glicht. Wer die \u201eSend to site\u201c-Funktion aktiv nutzt, sollte jetzt pr\u00fcfen und sofort aktualisieren.<\/p>\n","protected":false},"author":10,"featured_media":221,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[74,12,11,15,10],"class_list":["post-222","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sicherheit","tag-cve","tag-plugins","tag-security","tag-wordfence","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/posts\/222","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/comments?post=222"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/posts\/222\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/media\/221"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/media?parent=222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/categories?post=222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/tags?post=222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}