{"id":166,"date":"2026-01-19T00:00:00","date_gmt":"2026-01-18T23:00:00","guid":{"rendered":"https:\/\/helloblog.io\/nl\/kritieke-privilege-escalation-acf-extended-registratieformulier-admin\/"},"modified":"2026-01-19T00:00:00","modified_gmt":"2026-01-18T23:00:00","slug":"kritieke-privilege-escalation-acf-extended-registratieformulier-admin","status":"publish","type":"post","link":"https:\/\/helloblog.io\/nl\/kritieke-privilege-escalation-acf-extended-registratieformulier-admin\/","title":{"rendered":"Kritieke privilege escalation in ACF Extended: wanneer een registratieformulier ineens admin wordt"},"content":{"rendered":"\n<p>WordPress-sites die <strong>Advanced Custom Fields: Extended<\/strong> (ACF Extended) gebruiken, kregen half december een serieuze security-wake-up call. Wordfence publiceerde een advisory over een <strong>unauthenticated privilege escalation<\/strong>: een aanval waarbij iemand zonder account t\u00f3ch hogere rechten kan krijgen. In dit geval kan een bezoeker zichzelf in sommige configuraties rechtstreeks een <strong>administrator<\/strong>-rol toekennen.<\/p>\n\n\n\n<p>De kwetsbaarheid is geregistreerd als <strong>CVE-2025-14533<\/strong> en krijgt een <strong>CVSS-score van 9.8 (Critical)<\/strong>. ACF Extended heeft >100.000 actieve installs, al geldt de echte impact vooral voor sites die ACF Extended Forms gebruiken om users aan te maken of te wijzigen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wat is er precies aan de hand?<\/h2>\n\n\n\n<p>ACF Extended is een addon op de bekende Advanced Custom Fields-plugin. E\u00e9n van de features is een form builder (Form Manager) waarmee je front-end forms kunt maken, inclusief acties zoals <strong>\u201cCreate user\u201d<\/strong> (user aanmaken) en <strong>\u201cUpdate user\u201d<\/strong> (user bijwerken). Handig voor lidmaatschapssites, portals, interne tools of onboarding flows zonder wp-admin.<\/p>\n\n\n\n<p>De kern van het probleem: bij de action die een user aanmaakt, wordt user-data uit de form gemapt naar arguments voor <code>wp_insert_user()<\/code>. Als je in je form \u00f3\u00f3k een veld hebt gemapt naar <strong><code>role<\/code><\/strong>, dan kan een aanvaller zelf een waarde meesturen zoals <code>administrator<\/code>.<\/p>\n\n\n\n<p>Het pijnpunt volgens Wordfence: de code die de user invoegt beperkt niet welke rollen toegestaan zijn. Daardoor kan de rol \u201cvrij\u201d worden gekozen, ook als je in de field group een restrictie verwacht (bijvoorbeeld een instelling zoals \u201cAllow User Role\u201d). In kwetsbare versies werd die beperking niet (voldoende) afgedwongen op het moment dat de form action draait.<\/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\">Belangrijke nuance<\/h4>\n\n\n<p>Dit is vooral kritiek als je daadwerkelijk een ACF Extended form hebt met een \u201cCreate user\u201d of \u201cUpdate user\u201d action \u00e9n je hebt een veld gemapt naar <code>role<\/code>. Zonder die role mapping is dit specifieke aanvalspad volgens de advisory niet exploiteerbaar.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Waarom dit meteen full compromise kan zijn<\/h2>\n\n\n\n<p>Privilege escalation is in WordPress bijna altijd game over als het om administrator gaat. Met adminrechten kan een aanvaller onder andere:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>plugins of thema\u2019s uploaden (bijv. een \u201clegitiem ogende\u201d zip met backdoor)<\/li>\n\n\n<li>PHP-code uitvoeren via plugin\/theme editors of custom code oplossingen<\/li>\n\n\n<li>redirects en SEO-spam injecteren door pagina\u2019s te wijzigen<\/li>\n\n\n<li>extra accounts aanmaken om persistent toegang te houden<\/li>\n\n\n<li>security tooling uitschakelen en logs opruimen<\/li>\n\n<\/ul>\n\n\n\n<p>Omdat de aanval <strong>unauthenticated<\/strong> is, hoef je niet eens een bestaand account te compromitteren. Een publiek bereikbaar registratieformulier kan voldoende zijn.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Welke versies zijn kwetsbaar en wat is de fix?<\/h2>\n\n\n\n<p>Volgens Wordfence zijn <strong>alle versies t\/m 0.9.2.1<\/strong> kwetsbaar. De vendor heeft dit gepatcht in <strong>0.9.2.2<\/strong>. Praktisch betekent dit: update ACF Extended zo snel mogelijk naar minimaal die versie (of hoger).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Kwetsbaar: ACF Extended <= 0.9.2.1<\/li>\n\n\n<li>Gepatcht: 0.9.2.2<\/li>\n\n\n<li>CVE: CVE-2025-14533<\/li>\n\n\n<li>Severity: 9.8 (Critical)<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Wanneer loop je risico? Een snelle checklist voor developers<\/h2>\n\n\n\n<p>In veel sites staat ACF Extended ge\u00efnstalleerd voor extra field types en quality-of-life features, zonder dat Forms actief wordt gebruikt. In dat scenario is de kans kleiner dat je exact de kwetsbare configuratie hebt. Check specifiek dit:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Gebruik je ACF Extended Forms (Form Manager) op de front-end?<\/li>\n\n\n<li>Heb je een form action staan op \u201cCreate user\u201d (insert_user) of \u201cUpdate user\u201d?<\/li>\n\n\n<li>Is er een veld (select, hidden, etc.) dat gemapt is naar <code>role<\/code>?<\/li>\n\n\n<li>Is dat formulier publiek bereikbaar (geen login nodig) of kan een laag-privilege user erbij?<\/li>\n\n\n<li>Wordt het veld aan client-side kant beperkt, maar niet server-side (typisch: alleen HTML select options)?<\/li>\n\n<\/ol>\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\">Let op met \u201chidden role\u201d velden<\/h4>\n\n\n<p>Een veelgemaakte fout is een hidden field met value <code>subscriber<\/code> voor UX-redenen. Als de server-side validatie ontbreekt, kan een aanvaller die waarde simpel aanpassen in de request.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Technische context: waar gaat het mis?<\/h2>\n\n\n\n<p>Wordfence beschrijft dat ACF Extended bij de user-action een <code>insert_user()<\/code>-functie gebruikt die arguments opbouwt uit de gemapte formvelden en vervolgens <code>wp_insert_user($args)<\/code> aanroept. In kwetsbare versies werd daarbij niet afgedwongen dat <code>role<\/code> alleen uit een veilige allowlist komt.<\/p>\n\n\n\n<p>Concreet: zodra <code>role<\/code> in de mapping zit, kan die via form input worden be\u00efnvloed. En omdat WordPress <code>wp_insert_user()<\/code> de rol accepteert als die bestaat, kan <code>administrator<\/code>\u2014als string\u2014voldoende zijn om met adminrechten te eindigen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mitigaties naast updaten (voor wanneer je snel moet handelen)<\/h2>\n\n\n\n<p>Updaten is de juiste fix. Maar als je in een incident-situatie zit of je releaseproces traag is, kun je tijdelijk risico verlagen met operationele maatregelen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Zet forms met \u201cCreate user\u201d \/ \u201cUpdate user\u201d tijdelijk offline of achter login\/extra toegang<\/li>\n\n\n<li>Verwijder de mapping naar <code>role<\/code> (ook hidden\/select) totdat je ge\u00fcpdatet hebt<\/li>\n\n\n<li>Controleer recent aangemaakte admin-accounts en wijzig admin-wachtwoorden waar nodig<\/li>\n\n\n<li>Beperk registratieflows tot een strikt minimum en voeg server-side validatie toe waar mogelijk<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Wordfence bescherming en disclosure-tijdlijn (zoals gemeld)<\/h2>\n\n\n\n<p>Wordfence meldt dat zij de melding op <strong>10 december 2025<\/strong> ontvingen via hun Bug Bounty Program en deze op <strong>11 december 2025<\/strong> valideerden. Volgens hun publicatie kregen Wordfence Premium\/Care\/Response-klanten op <strong>11 december 2025<\/strong> een firewall rule. Sites met de gratis variant kregen dezelfde rule <strong>30 dagen later<\/strong>, op <strong>10 januari 2026<\/strong>. De ACF Extended-ontwikkelaars brachten de gepatchte versie <strong>0.9.2.2<\/strong> uit op <strong>14 december 2025<\/strong>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>2025-12-10: melding ontvangen via Wordfence Bug Bounty Program<\/li>\n\n\n<li>2025-12-11: validatie + firewall rule voor Premium\/Care\/Response<\/li>\n\n\n<li>2025-12-11: disclosure naar vendor via Vulnerability Management Portal<\/li>\n\n\n<li>2025-12-14: vendor acknowledgement + release patch 0.9.2.2<\/li>\n\n\n<li>2026-01-10: firewall rule beschikbaar voor Wordfence Free<\/li>\n\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Praktisch advies voor teams met veel WordPress-sites<\/h2>\n\n\n\n<p>Beheer je meerdere sites (agency\/hosting\/enterprise)? Dan is dit typisch zo\u2019n issue waarbij je winst pakt met een korte, herhaalbare routine:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Inventariseer installaties op plugin slug <code>acf-extended<\/code><\/li>\n\n\n<li>Forceer update naar >= 0.9.2.2 waar mogelijk<\/li>\n\n\n<li>Zoek in de configuratie naar ACF Extended forms met user actions<\/li>\n\n\n<li>Controleer of <code>role<\/code> gemapt is in \u00e9\u00e9n van die acties<\/li>\n\n\n<li>Audit users: filter op recent aangemaakte admins en onbekende e-maildomeinen<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Samenvatting<\/h2>\n\n\n\n<p>ACF Extended (Advanced Custom Fields: Extended) had een kritieke privilege escalation (CVE-2025-14533) waardoor een anonieme bezoeker zichzelf adminrechten kan geven als je een user-form hebt met <code>role<\/code> mapping. De fix staat in <strong>0.9.2.2<\/strong>. Update zo snel mogelijk en controleer specifiek je front-end registratie-\/user-update flows.<\/p>\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\/7\/2026\/01\/acfe-1-scaled-1.png\" alt=\"ACF Extended interface met veldinstellingen voor user role (Allow User Role)\" class=\"wp-image-164\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-1-scaled-1.png 2560w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-1-scaled-1-300x188.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-1-scaled-1-1024x640.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-1-scaled-1-768x480.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-1-scaled-1-1536x960.png 1536w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-1-scaled-1-2048x1280.png 2048w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-1-scaled-1-400x250.png 400w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><figcaption class=\"wp-element-caption\">. \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\/7\/2026\/01\/acfe-2-scaled-1.png\" alt=\"ACF Extended Form Manager met Create user action en field mapping\" class=\"wp-image-165\" srcset=\"https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-2-scaled-1.png 2560w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-2-scaled-1-300x187.png 300w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-2-scaled-1-1024x640.png 1024w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-2-scaled-1-768x480.png 768w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-2-scaled-1-1536x959.png 1536w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-2-scaled-1-2048x1279.png 2048w, https:\/\/helloblog.io\/app\/uploads\/sites\/7\/2026\/01\/acfe-2-scaled-1-400x250.png 400w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><figcaption class=\"wp-element-caption\">Velden kunnen gemapt worden naar user properties; role mapping is hier de risicofactor. \u2014 <em>Forr\u00e1s: Wordfence.com<\/em><\/figcaption><\/figure>\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\/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 (acf-extended) on WordPress.org<\/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><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Gebruik je Advanced Custom Fields: Extended (ACF Extended) voor front-end forms die users aanmaken of updaten? Dan is er een kritieke kwetsbaarheid (CVE-2025-14533) waarbij een anonieme aanvaller zichzelf admin kan maken\u2014mits je role mapping net verkeerd staat.<\/p>\n","protected":false},"author":22,"featured_media":163,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[75,76,18,11,10],"class_list":["post-166","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-beveiliging","tag-acf-extended","tag-cve","tag-privilege-escalation","tag-security","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts\/166","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\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/comments?post=166"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/posts\/166\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/media\/163"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/media?parent=166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/categories?post=166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/nl\/wp-json\/wp\/v2\/tags?post=166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}