{"id":168,"date":"2026-01-19T00:00:00","date_gmt":"2026-01-18T23:00:00","guid":{"rendered":"https:\/\/helloblog.io\/pt\/falha-critica-acf-extended-escalada-de-privilegios-como-mitigar\/"},"modified":"2026-01-19T00:00:00","modified_gmt":"2026-01-18T23:00:00","slug":"falha-critica-acf-extended-escalada-de-privilegios-como-mitigar","status":"publish","type":"post","link":"https:\/\/helloblog.io\/pt\/falha-critica-acf-extended-escalada-de-privilegios-como-mitigar\/","title":{"rendered":"Falha cr\u00edtica no ACF Extended permite escalada de privil\u00e9gios: o que verificar e como mitigar j\u00e1"},"content":{"rendered":"\n<p>Quem usa o <strong>Advanced Custom Fields: Extended<\/strong> (ACF Extended), um addon para o ACF que inclui <em>form manager<\/em> (gestor de formul\u00e1rios) e outras funcionalidades, precisa de olhar para isto com prioridade. Foi reportada uma vulnerabilidade cr\u00edtica de <strong>escalada de privil\u00e9gios<\/strong> que, em determinadas configura\u00e7\u00f5es, permite a um atacante <strong>n\u00e3o autenticado<\/strong> criar\/atualizar um utilizador com o papel (<em>role<\/em>) de <strong>administrator<\/strong>.<\/p>\n\n\n\n<p>A boa not\u00edcia \u00e9 que existe corre\u00e7\u00e3o e o cen\u00e1rio de explora\u00e7\u00e3o depende de uma configura\u00e7\u00e3o relativamente espec\u00edfica. A m\u00e1 not\u00edcia \u00e9 que, quando a condi\u00e7\u00e3o est\u00e1 presente, o impacto \u00e9 total: com uma conta admin, o atacante passa a conseguir instalar plugins\/temas, carregar ficheiros maliciosos e alterar conte\u00fado do site.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resumo t\u00e9cnico (para decidir r\u00e1pido se est\u00e1s em risco)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Plugin afetado:<\/strong> Advanced Custom Fields: Extended (slug <code>acf-extended<\/code>)<\/li>\n\n\n<li><strong>Vers\u00f5es vulner\u00e1veis:<\/strong> at\u00e9 <strong>0.9.2.1<\/strong> (inclusive)<\/li>\n\n\n<li><strong>Vers\u00e3o corrigida:<\/strong> <strong>0.9.2.2<\/strong><\/li>\n\n\n<li><strong>CVE:<\/strong> <strong>CVE-2025-14533<\/strong><\/li>\n\n\n<li><strong>Severidade:<\/strong> <strong>CVSS 9.8 (Critical)<\/strong><\/li>\n\n\n<li><strong>Tipo de falha:<\/strong> escalada de privil\u00e9gios sem autentica\u00e7\u00e3o via a\u00e7\u00e3o de formul\u00e1rio de utilizador (<em>Insert User Form Action<\/em>)<\/li>\n\n<\/ul>\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\">Condi\u00e7\u00e3o importante para explora\u00e7\u00e3o<\/h4>\n\n\n<p>Segundo a an\u00e1lise publicada, a explora\u00e7\u00e3o s\u00f3 \u00e9 vi\u00e1vel quando o campo <code>role<\/code> (papel do utilizador) est\u00e1 <strong>mapeado<\/strong> num formul\u00e1rio de cria\u00e7\u00e3o\/atualiza\u00e7\u00e3o de utilizador do ACF Extended. Se n\u00e3o tens formul\u00e1rios desses, o risco pr\u00e1tico reduz bastante \u2014 mas atualizar continua a ser o caminho certo.<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">O que est\u00e1 a acontecer, na pr\u00e1tica<\/h2>\n\n\n\n<p>A funcionalidade de formul\u00e1rios do ACF Extended permite criar formul\u00e1rios no front-end para a\u00e7\u00f5es como \u201ccriar utilizador\u201d ou \u201catualizar utilizador\u201d. Para isso, o site pode ter um <em>field group<\/em> com campos t\u00edpicos de registo (email, username, password) e, opcionalmente, um campo para o <strong>papel (role)<\/strong>.<\/p>\n\n\n\n<p>O problema identificado \u00e9 que, nas vers\u00f5es vulner\u00e1veis, a a\u00e7\u00e3o de cria\u00e7\u00e3o de utilizador n\u00e3o restringe de forma eficaz quais os roles permitidos quando o <code>role<\/code> \u00e9 enviado pelo formul\u00e1rio. Na pr\u00e1tica, um atacante pode submeter <code>administrator<\/code> como role e ganhar acesso administrativo \u2014 mesmo que, no <em>field group<\/em>, exista uma op\u00e7\u00e3o tipo \u201cAllow User Role\u201d que sugeriria haver limita\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Porque \u00e9 que isto \u00e9 t\u00e3o grave num site WordPress<\/h2>\n\n\n\n<p>Escalada de privil\u00e9gios para administrador \u00e9 uma das classes de vulnerabilidade mais destrutivas em WordPress. A partir do momento em que existe uma conta admin controlada por terceiros, o atacante pode:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Instalar plugins\/temas (incluindo ZIPs maliciosos com <em>backdoors<\/em>)<\/li>\n\n\n<li>Editar ficheiros e configura\u00e7\u00f5es do site<\/li>\n\n\n<li>Modificar p\u00e1ginas\/posts para injetar spam, links ou redirecionamentos<\/li>\n\n\n<li>Criar utilizadores adicionais e manter persist\u00eancia<\/li>\n\n\n<li>Alterar integra\u00e7\u00f5es e chaves (dependendo do que est\u00e1 exposto no admin)<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Como confirmar se o teu site tem a configura\u00e7\u00e3o de risco<\/h2>\n\n\n\n<p>O ponto cr\u00edtico aqui n\u00e3o \u00e9 \u201cusar ACF Extended\u201d em abstrato \u2014 \u00e9 <strong>usar ACF Extended com formul\u00e1rios de utilizador<\/strong> e <strong>mapear um campo de role<\/strong>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>No WordPress, confirma se o plugin <strong>Advanced Custom Fields: Extended<\/strong> est\u00e1 instalado e qual a vers\u00e3o (idealmente, atualiza j\u00e1 para <strong>0.9.2.2<\/strong> ou superior).<\/li>\n\n\n<li>Revisa os formul\u00e1rios criados via o m\u00f3dulo de formul\u00e1rios do ACF Extended e procura a\u00e7\u00f5es do tipo <strong>Create user<\/strong> (<em>insert_user<\/em>) ou <strong>Update user<\/strong>.<\/li>\n\n\n<li>Dentro desses formul\u00e1rios, verifica se existe um campo mapeado para <strong>role<\/strong> (papel). Se existir, considera o site <strong>potencialmente explor\u00e1vel<\/strong> nas vers\u00f5es vulner\u00e1veis.<\/li>\n\n\n<li>Mesmo que o teu <em>field group<\/em> tenha restri\u00e7\u00f5es como \u201cAllow User Role\u201d, n\u00e3o assumes que isso te protege nas vers\u00f5es afetadas \u2014 esse \u00e9 precisamente o desfasamento descrito na an\u00e1lise.<\/li>\n\n<\/ol>\n\n\n\n<div class=\"wp-block-group callout callout-danger is-style-danger 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\">Sinal cl\u00e1ssico de comprometimento<\/h4>\n\n\n<p>Se encontras um utilizador administrador criado recentemente sem explica\u00e7\u00e3o (ou altera\u00e7\u00f5es inesperadas em roles), trata como incidente de seguran\u00e7a: muda credenciais, revoga sess\u00f5es, valida integridade do site e procura persist\u00eancia (novos admins, plugins\/temas desconhecidos, ficheiros alterados).<\/p>\n\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Mitiga\u00e7\u00e3o: o que fazer agora (ordem recomendada)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>Atualiza o ACF Extended para 0.9.2.2<\/strong> (ou vers\u00e3o mais recente dispon\u00edvel). Esta \u00e9 a corre\u00e7\u00e3o direta indicada no advisory.<\/li>\n\n\n<li>Se tens formul\u00e1rios de cria\u00e7\u00e3o\/atualiza\u00e7\u00e3o de utilizador: <strong>remove temporariamente o mapeamento do campo <code>role<\/code><\/strong> ou desativa o formul\u00e1rio at\u00e9 confirmar o patch e o comportamento esperado.<\/li>\n\n\n<li>Audita utilizadores administradores: valida lista de admins, datas de cria\u00e7\u00e3o e atividade recente.<\/li>\n\n\n<li>Garante que tens uma camada de firewall\/aplica\u00e7\u00e3o. Segundo a Wordfence, utilizadores <strong>Premium\/Care\/Response<\/strong> receberam regra de firewall a 11\/12\/2025 e a vers\u00e3o <strong>Free<\/strong> recebeu a mesma prote\u00e7\u00e3o a 10\/01\/2026 (o que n\u00e3o substitui a atualiza\u00e7\u00e3o do plugin).<\/li>\n\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Um detalhe que interessa a quem desenvolve: onde a falha acontece<\/h2>\n\n\n\n<p>Na an\u00e1lise t\u00e9cnica publicada, o fluxo descrito passa por uma fun\u00e7\u00e3o <code>insert_user()<\/code> (num m\u00f3dulo de a\u00e7\u00e3o de formul\u00e1rio para utilizadores) que constr\u00f3i um array <code>$args<\/code> a partir de campos submetidos e chama <code>wp_insert_user($args)<\/code>. O ponto cr\u00edtico \u00e9 a aus\u00eancia de uma valida\u00e7\u00e3o\/restri\u00e7\u00e3o robusta do role permitido quando o formul\u00e1rio aceita esse campo.<\/p>\n\n\n\n<p>Isto \u00e9 um lembrete \u00fatil para qualquer implementa\u00e7\u00e3o de registo via front-end: <strong>nunca<\/strong> confiar em valores enviados pelo cliente para controlo de privil\u00e9gios, mesmo quando a UI \u201cparece\u201d restringir op\u00e7\u00f5es. A restri\u00e7\u00e3o tem de existir no servidor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cronologia (para contexto de resposta)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>10\/12\/2025: submiss\u00e3o da falha via Bug Bounty Program da Wordfence<\/li>\n\n\n<li>11\/12\/2025: valida\u00e7\u00e3o e confirma\u00e7\u00e3o do <em>proof of concept<\/em>; envio de detalhes ao vendor via portal; regra de firewall para Wordfence Premium\/Care\/Response<\/li>\n\n\n<li>14\/12\/2025: patch lan\u00e7ado (vers\u00e3o <strong>0.9.2.2<\/strong>)<\/li>\n\n\n<li>10\/01\/2026: regra de firewall disponibilizada para Wordfence Free<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Checklist final (o m\u00ednimo a fazer hoje)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Atualizar <strong>Advanced Custom Fields: Extended<\/strong> para <strong>0.9.2.2<\/strong> ou superior<\/li>\n\n\n<li>Confirmar se existe formul\u00e1rio de <strong>Create user\/Update user<\/strong> com <code>role<\/code> mapeado<\/li>\n\n\n<li>Se existir: desativar\/remover <code>role<\/code> do formul\u00e1rio at\u00e9 validar comportamento p\u00f3s-update<\/li>\n\n\n<li>Auditar utilizadores admin e atividade recente<\/li>\n\n<\/ul>\n\n\n<div class=\"references-section\">\n                <h2>Refer\u00eancias \/ Fontes<\/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<\/a><\/li><\/ul>\n            <\/div>","protected":false},"excerpt":{"rendered":"<p>Uma vulnerabilidade cr\u00edtica no Advanced Custom Fields: Extended pode permitir que um atacante sem login se torne administrador \u2014 mas s\u00f3 em sites com formul\u00e1rios espec\u00edficos configurados. Eis como identificar o risco e agir r\u00e1pido.<\/p>\n","protected":false},"author":29,"featured_media":167,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[68,69,12,11,10],"class_list":["post-168","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seguranca","tag-acf-extended","tag-cve","tag-plugins","tag-seguranca","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/posts\/168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/comments?post=168"}],"version-history":[{"count":0,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/posts\/168\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/media\/167"}],"wp:attachment":[{"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/media?parent=168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/categories?post=168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloblog.io\/pt\/wp-json\/wp\/v2\/tags?post=168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}