{"id":160,"date":"2026-01-19T00:00:00","date_gmt":"2026-01-18T23:00:00","guid":{"rendered":"https:\/\/helloblog.io\/de\/kritische-privilege-escalation-luecke-acf-extended\/"},"modified":"2026-01-19T00:00:00","modified_gmt":"2026-01-18T23:00:00","slug":"kritische-privilege-escalation-luecke-acf-extended","status":"publish","type":"post","link":"https:\/\/helloblog.io\/de\/kritische-privilege-escalation-luecke-acf-extended\/","title":{"rendered":"Kritische Privilege-Escalation-L\u00fccke in ACF Extended: Wann deine WordPress-Site wirklich betroffen ist"},"content":{"rendered":"\n<p>Wer auf WordPress stark mit Advanced Custom Fields arbeitet, landet fr\u00fcher oder sp\u00e4ter bei Add-ons wie <strong>Advanced Custom Fields: Extended (ACF Extended)<\/strong>. Genau in diesem Plugin wurde eine <strong>kritische Privilege-Escalation-Schwachstelle<\/strong> gemeldet, die es Angreifern unter bestimmten Bedingungen erlaubt, sich <strong>ohne Login<\/strong> Administratorrechte zu verschaffen.<\/p>\n\n\n\n<p>In diesem Beitrag geht es nicht um Panikmache, sondern um eine klare Einordnung: <strong>Welche Versionen sind verwundbar, welches Setup ist tats\u00e4chlich kritisch \u2013 und was solltest du jetzt konkret pr\u00fcfen und updaten?<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Worum geht\u2019s? Privilege Escalation ohne Authentifizierung<\/h2>\n\n\n\n<p>Bei einer <em>Privilege Escalation<\/em> verschafft sich ein Angreifer h\u00f6here Rechte als vorgesehen \u2013 im schlimmsten Fall <strong>Admin-Rechte<\/strong>. Das ist in WordPress besonders heikel, weil ein Admin praktisch alles kann: Plugins\/Themes hochladen, Code ausf\u00fchren (z.\u202fB. \u00fcber b\u00f6sartige ZIPs), Inhalte manipulieren oder Besucher umleiten.<\/p>\n\n\n\n<p>Laut Wordfence betrifft die L\u00fccke <strong>Advanced Custom Fields: Extended bis einschlie\u00dflich Version 0.9.2.1<\/strong> und wurde in <strong>0.9.2.2<\/strong> behoben. Die Schwachstelle tr\u00e4gt die Kennung <strong>CVE-2025-14533<\/strong> und ist mit <strong>CVSS 9.8 (kritisch)<\/strong> bewertet.<\/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\">Kurzfazit f\u00fcr die Praxis<\/h4>\n\n\n<p>Wenn bei dir <strong>ACF Extended \u2264 0.9.2.1<\/strong> installiert ist, solltest du <strong>sofort auf 0.9.2.2<\/strong> aktualisieren \u2013 auch wenn du glaubst, das betroffene Feature nicht zu nutzen.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Welche Setups sind besonders gef\u00e4hrdet?<\/h2>\n\n\n\n<p>Spannend (und f\u00fcr viele erst mal beruhigend): Die L\u00fccke ist zwar kritisch bewertet, aber sie l\u00e4sst sich laut Beschreibung nur dann ausnutzen, wenn ein sehr konkretes Setup vorhanden ist.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Du nutzt in ACF Extended ein Formular mit einer <strong>\u201eCreate user\u201c (insert_user)<\/strong>&#8211; oder <strong>\u201eUpdate user\u201c<\/strong>-Action.<\/li>\n\n\n<li>In diesem Formular ist ein Feld auf die User-Rolle gemappt (also ein Custom Field, das am Ende in das <code>role<\/code>-Argument \u00fcbernommen wird).<\/li>\n\n\n<li>Das Formular ist so erreichbar, dass ein <strong>nicht eingeloggter<\/strong> Nutzer es absenden kann (typischerweise Registrierungs-\/Onboarding-Formulare).<\/li>\n\n<\/ul>\n\n\n\n<p>Hintergrund: ACF Extended bietet bei Rollenfeldern eine Art UI-Restriction (\u201eAllow User Role\u201c). Erwartbar w\u00e4re, dass diese Einschr\u00e4nkung auch bei der Formularverarbeitung greift. In den verwundbaren Versionen wurden die Rollen aber offenbar <strong>nicht serverseitig ausreichend begrenzt<\/strong> \u2013 sodass ein Angreifer bei der Registrierung schlicht <code>administrator<\/code> als Rolle mitschicken kann, sofern das Rollenfeld im Formular-Mapping h\u00e4ngt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Technischer Kern: <code>insert_user<\/code> und fehlende Rollen-Restriktion<\/h2>\n\n\n\n<p>Wordfence beschreibt das Problem in der Form-Action-Logik rund um eine <code>insert_user()<\/code>-Routine, die am Ende in <code>wp_insert_user($args)<\/code> m\u00fcndet. Kritisch ist dabei weniger <code>wp_insert_user()<\/code> selbst, sondern <strong>welche Werte in <code>$args<\/code> landen<\/strong> \u2013 und ob das Plugin vorher serverseitig sicherstellt, dass z.\u202fB. <code>role<\/code> nur aus einer Whitelist stammt.<\/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>&lt;?php\n\/\/ Stark vereinfachte Darstellung des Problems:\n$args = [];\n\nforeach ($save as $user_field =&gt; $value) {\n    \/\/ Mapping: Formularfelder -&gt; wp_insert_user()-Argumente\n    $args[$user_field] = $value;\n}\n\n\/\/ Problem: Wenn 'role' gemappt ist und ungefiltert \u00fcbernommen wird,\n\/\/ kann ein Angreifer z.B. 'administrator' senden.\n$user_id = wp_insert_user($args);\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:#F97583\">&#x3C;?<\/span><span style=\"color:#79B8FF\">php<\/span><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\">\/\/ Stark vereinfachte Darstellung des Problems:<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$args <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#E1E4E8\"> [];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#F97583\">foreach<\/span><span style=\"color:#E1E4E8\"> ($save <\/span><span style=\"color:#F97583\">as<\/span><span style=\"color:#E1E4E8\"> $user_field <\/span><span style=\"color:#F97583\">=><\/span><span style=\"color:#E1E4E8\"> $value) {<\/span><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\">    \/\/ Mapping: Formularfelder -> wp_insert_user()-Argumente<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">    $args[$user_field] <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#E1E4E8\"> $value;<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\">\/\/ Problem: Wenn 'role' gemappt ist und ungefiltert \u00fcbernommen wird,<\/span><\/span>\n<span class=\"line\"><span style=\"color:#6A737D\">\/\/ kann ein Angreifer z.B. 'administrator' senden.<\/span><\/span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">$user_id <\/span><span style=\"color:#F97583\">=<\/span><span style=\"color:#B392F0\"> wp_insert_user<\/span><span style=\"color:#E1E4E8\">($args);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\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\">Warum UI-Restriktionen nicht reichen<\/h4>\n\n\n<p>Selbst wenn ein Rollenfeld im Backend \u201eeingeschr\u00e4nkt\u201c aussieht: Entscheidend ist immer, ob die Einschr\u00e4nkung <strong>serverseitig<\/strong> erzwungen wird. Client-seitige oder UI-basierte Grenzen lassen sich oft umgehen.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Betroffene Versionen, Patch und CVE<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Produkt: <strong>Advanced Custom Fields: Extended<\/strong> (Plugin-Slug: <code>acf-extended<\/code>)<\/li>\n\n\n<li>Betroffen: <strong>\u2264 0.9.2.1<\/strong><\/li>\n\n\n<li>Gefixt in: <strong>0.9.2.2<\/strong><\/li>\n\n\n<li>CVE: <strong>CVE-2025-14533<\/strong><\/li>\n\n\n<li>Schweregrad: <strong>CVSS 9.8 (Critical)<\/strong><\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Was du jetzt pr\u00fcfen solltest (Checkliste)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Plugin-Version pr\u00fcfen:<\/strong> L\u00e4uft ACF Extended noch in <strong>0.9.2.1 oder \u00e4lter<\/strong>? Dann updaten.<\/li>\n\n\n<li><strong>Formulare identifizieren:<\/strong> Gibt es ACF Extended Forms mit den Actions <strong>Create user<\/strong> \/ <strong>Update user<\/strong>?<\/li>\n\n\n<li><strong>Mapping checken:<\/strong> Ist ein Feld auf <strong>role<\/strong> gemappt oder wird eine Rolle aus einem Custom Field \u00fcbernommen?<\/li>\n\n\n<li><strong>\u00d6ffentliche Erreichbarkeit:<\/strong> Kann das Formular von nicht eingeloggten Besuchern abgeschickt werden?<\/li>\n\n\n<li><strong>Logs\/Monitoring:<\/strong> Wenn du Zugriff hast: pr\u00fcfe verd\u00e4chtige neu angelegte Admin-Accounts oder Rollen\u00e4nderungen in dem Zeitraum.<\/li>\n\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Wordfence-Schutz und Disclosure-Timeline (kurz eingeordnet)<\/h2>\n\n\n\n<p>Wordfence berichtet, dass f\u00fcr zahlende Nutzer (Premium\/Care\/Response) bereits am <strong>11. Dezember 2025<\/strong> eine Firewall-Regel ausgerollt wurde, die Exploits gegen diese Schwachstelle blocken soll. Nutzer der kostenlosen Wordfence-Version bekamen denselben Schutz laut Meldung <strong>30 Tage sp\u00e4ter (10. Januar 2026)<\/strong>.<\/p>\n\n\n\n<p>Der Vendor wurde nach Angaben von Wordfence am 11. Dezember 2025 informiert; der Fix wurde am <strong>14. Dezember 2025<\/strong> mit Version <strong>0.9.2.2<\/strong> ver\u00f6ffentlicht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Warum diese Art Bug so gef\u00e4hrlich ist \u2013 trotz \u201eseltenem Setup\u201c<\/h2>\n\n\n\n<p>Auch wenn das konkrete Setup (Form-Action + Rollenfeld-Mapping) nicht auf jeder Site vorkommt: Sobald es existiert, ist die Auswirkung maximal. Ein einziger erfolgreicher Request kann reichen, um sich als Admin einzutragen \u2013 und ab da ist eine vollst\u00e4ndige \u00dcbernahme der Instanz realistisch.<\/p>\n\n\n\n<p>Gerade in Projekten, in denen ACF Extended als Baukasten f\u00fcr Registrierungs- oder Mitgliederbereiche genutzt wird, lohnt sich ein zus\u00e4tzlicher Blick auf das gesamte Onboarding: <strong>Welche Felder d\u00fcrfen Besucher wirklich setzen \u2013 und was wird serverseitig validiert?<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zusammenfassung<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>ACF Extended hatte eine <strong>kritische Privilege-Escalation-L\u00fccke<\/strong> (CVE-2025-14533) bis Version <strong>0.9.2.1<\/strong>.<\/li>\n\n\n<li>Ein Exploit ist <strong>unauthenticated<\/strong> m\u00f6glich, wenn ein Formular die User-Rolle aus einem Feld \u00fcbernimmt.<\/li>\n\n\n<li>Update auf <strong>0.9.2.2<\/strong> ist die zentrale Ma\u00dfnahme.<\/li>\n\n\n<li>Pr\u00fcfe zus\u00e4tzlich, ob bei dir <strong>Create\/Update user<\/strong>-Form-Actions mit <strong>role-Mapping<\/strong> existieren.<\/li>\n\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1600\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-1-scaled-1.png\" alt=\"ACF Extended: Rollenfeld mit Restriktionsoption (Allow User Role)\" class=\"wp-image-158\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-1-scaled-1.png 2560w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-1-scaled-1-300x188.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-1-scaled-1-1024x640.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-1-scaled-1-768x480.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-1-scaled-1-1536x960.png 1536w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-1-scaled-1-2048x1280.png 2048w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-1-scaled-1-400x250.png 400w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><figcaption class=\"wp-element-caption\">Rollenfeld in einer Field Group \u2013 die UI bietet eine Restriktion, die serverseitig jedoch entscheidend ist. \u2014 <em>Forr\u00e1s: Wordfence.com<\/em><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1599\" src=\"https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-2-scaled-1.png\" alt=\"ACF Extended: Formular mit Create-user-Action und Feld-Mapping\" class=\"wp-image-159\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-2-scaled-1.png 2560w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-2-scaled-1-300x187.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-2-scaled-1-1024x640.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-2-scaled-1-768x480.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-2-scaled-1-1536x959.png 1536w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-2-scaled-1-2048x1279.png 2048w, https:\/\/helloblog.io\/app\/uploads\/sites\/3\/2026\/01\/acfe-2-scaled-1-400x250.png 400w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><figcaption class=\"wp-element-caption\">Formular-Setup: Felder werden auf die Action gemappt \u2013 inklusive potenziell kritischer Felder wie role. \u2014 <em>Forr\u00e1s: Wordfence.com<\/em><\/figcaption><\/figure>\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\/01\/100000-wordpress-sites-affected-by-privilege-escalation-vulnerability-in-advanced-custom-fields-extended-wordpress-plugin\/\" target=\"_blank\" rel=\"noopener noreferrer\">100,000 WordPress Sites Affected by Privilege Escalation Vulnerability in Advanced Custom Fields: Extended WordPress Plugin<\/a><\/li><li><a href=\"https:\/\/www.wordfence.com\/threat-intel\/vulnerabilities\/wordpress-plugins\/acf-extended\/advanced-custom-fields-extended-0921-unauthenticated-privilege-escalation-via-insert-user-form-action\" target=\"_blank\" rel=\"noopener noreferrer\">Advanced Custom Fields: Extended &lt;= 0.9.2.1 &#8212; Unauthenticated Privilege Escalation via Insert User Form Action<\/a><\/li><li><a href=\"https:\/\/www.cve.org\/CVERecord?id=CVE-2025-14533\" target=\"_blank\" rel=\"noopener noreferrer\">CVE-2025-14533<\/a><\/li><li><a href=\"https:\/\/wordpress.org\/plugins\/acf-extended\/\" target=\"_blank\" rel=\"noopener noreferrer\">Advanced Custom Fields: Extended (WordPress.org Plugin Directory)<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Im Add-on \u201eAdvanced Custom Fields: Extended\u201c wurde eine kritische Privilege-Escalation-Schwachstelle gefunden. Entscheidend ist dabei nicht nur die Plugin-Version, sondern auch, ob du bestimmte Form-Actions mit einem Rollenfeld nutzt.<\/p>\n","protected":false},"author":10,"featured_media":157,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[73,74,16,11,10],"class_list":["post-160","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sicherheit","tag-acf-extended","tag-cve","tag-privilege-escalation","tag-security","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/posts\/160","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=160"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/posts\/160\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/media\/157"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/media?parent=160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/categories?post=160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/de\/wp-json\/wp\/v2\/tags?post=160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}