← Back to Feed CACHED · 2026-11-03 07:48:24 · CACHE_KEY CVE-2026-120534
CVE-2026-120534 · CWE-434 · Disclosed 2026-11-03

Advanced Custom Fields Extended PRO render_field limited code injection

ASSESSED — NOISGATE
Vendor
—
—
—
Reassessed
—
—
—
Verdict: —
Do you agree?
01 · The Real Story

A backstage pass that only works if the venue left a side door unlocked or the security guard went home

All versions through 0.9.2.6 of the paid Advanced Custom Fields: Extended PRO plugin for WordPress contain a dynamic call vulnerability in render_field: form configuration parameters are merged into field settings and passed to call_user_func_array. An unauthenticated attacker who reaches that function can choose a WordPress function name and its arguments. It is not a classic unrestricted upload despite CWE-434; it is a validation failure that leads to arbitrary function invocation.

The vendor's CVSS 9.8 assumes an unconditional unauthenticated remote path, which overstates real-world reach. The two documented entry conditions—admin-enabled shortcode_preview or a PHP environment missing OpenSSL—are not default in most WordPress fleets. The impact, however, is severe: calling functions like wp_insert_user can mint an administrator account, then plugin upload gives code execution. Scope is unchanged because the code runs in the web server process; confidentiality, integrity, and availability of the site are all at risk under the condition set.

"ACF PRO plugin lets unauth attackers call arbitrary WP functions when shortcode_preview is on or OpenSSL missing — one request = admin"
02 · The Attack Path

5 steps from start to impact.

STEP 01

Enumerate active ACF Extended PRO instances

Use WordPress plugin fingerprints such as WPScan, HTML comments, or exposed REST endpoints to find sites running ACF Extended PRO ≤0.9.2.6. The plugin is premium, so free ACF installs do not count; confirm exact version and that the plugin is active.
Conditions required:
  • Target site is publicly reachable
  • ACF Extended PRO installed and active
  • Version ≤0.9.2.6
Where this breaks in practice:
  • Commercial PRO plugin; lower installed base than free ACF
  • Version may be hidden from public pages; attacker may need exposed /wp-json/wp/v2/plugins
Detection/coverage: WPScan can fingerprint plugin/version; Wordfence CLI or site inventory should track plugin versions.
STEP 02

Reach render_field execution with either fallback

Two trigger states: (A) an admin enabled the form's shortcode_preview setting, or (B) the PHP environment lacks openssl, so ACF Pro's acf_decrypt falls back to unverified base64_decode. In state B, no admin action is required.
Conditions required:
  • Method 1: shortcode_preview enabled on target form
  • Method 2: openssl PHP extension missing
Where this breaks in practice:
  • shortcode_preview is non-default
  • Most PHP/WordPress builds include OpenSSL; absence is uncommon
Detection/coverage: No network scanner covers these states; server admins can check php -m | grep openssl and plugin settings.
STEP 03

Submit crafted form configuration to merge into field settings

Send a POST request to the vulnerable form handling endpoint with malicious configuration parameters. The plugin merges them into $field settings before calling call_user_func_array. The attacker controls function name and arguments.
Conditions required:
  • Reachable WordPress frontend/admin-ajax path or form endpoint
  • Payload matches expected parameter structure
  • No Web Application Firewall block on the request
Where this breaks in practice:
  • Parameter names may require plugin knowledge
  • WAF with custom rules for ACF Extended could block; generic rules likely miss it
Detection/coverage: Request logs may show unusual parameters; a focused WAF rule could inspect serialized/base64 fields.
STEP 04

Invoke arbitrary WordPress function

call_user_func_array($field['render_field'], $args) executes the selected function. A reliable escalation is wp_insert_user with ['user_login', 'user_pass', 'role' => 'administrator']. The function runs in the WordPress context, bypassing normal REST/registration capability checks.
Conditions required:
  • The function name exists in WordPress core or active plugins
  • The function does not perform capability checks on role (many core functions do not when called PHP-direct)
Where this breaks in practice:
  • Some functions may reject roles or sanitize user data; attacker chooses from many callable functions
  • If wp_insert_user doesn't grant admin due to hardening, other functions (update_option, wp_mail) still cause impact
Detection/coverage: Audit logs for new admin users; plugin code scanners can find direct call_user_func_array.
STEP 05

Escalate to full code execution and data access

Log in as the newly minted administrator, upload a malicious plugin or edit theme files to execute PHP code. From there, read wp-config.php database credentials, export the database, and pivot into the hosting network if not segmented.
Conditions required:
  • New admin login works (2FA for admins may be enabled but is bypassed because attacker controls admin account)
  • Web server allows plugin/theme file writes
Where this breaks in practice:
  • 2FA could delay login but attacker can disable it as admin via database or file edit
  • Container/PHP-FPM limits may restrict writes; but typical WordPress admins can install plugins
Detection/coverage: WordPress activity logs and file integrity monitoring can catch plugin/theme installation and new administrator accounts.
03 · Compensating Control

1
HIGH 8.0→MEDIUM 5.0
SEVERITY REDUCED
Ensure PHP openssl extension is loaded on all WordPress hosts — This breaks Method 2, leaving only the non-default shortcode_preview path. Roll out within 30 days under the noisgate mitigation SLA for HIGH severity. Verify with php -m | grep openssl.
2
HIGH 8.0→MEDIUM 5.5
SEVERITY REDUCED
Disable shortcode_preview on all ACF Extended PRO forms — This breaks Method 1, leaving only the rare no-OpenSSL path. Roll out within 30 days under the noisgate mitigation SLA for HIGH severity. Audit all forms and remove the setting.
3
HIGH 8.0→IGNORE 0.0
SEVERITY REDUCED
Update Advanced Custom Fields: Extended PRO beyond 0.9.2.6 — Apply the vendor update or patched release if available; this closes the call_user_func_array injection path. Schedule within 180 days under the noisgate remediation SLA for HIGH severity, or immediately if a patch is released and active exploitation surfaces.
What doesn't work
  • Disabling user registration or admin approval settings: wp_insert_user is called directly via the vulnerable function, bypassing WordPress options.
  • Generic WAF rules keyed on common code injection patterns: the payload travels in form configuration parameters and may look like ordinary serialized/form data; plugin-specific rules are needed.
  • WordPress two-factor authentication for admins: the exploitation path is unauthenticated, so it does not intercept the initial function call.
04 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo known exploitation in CISA KEV or public intel as of 2026-11-03; not currently observed in active campaigns.
Proof-of-concept availabilityNo explicit public PoC link in provided sources; Wordfence advisory by Tin Pham, Trong Pham, Hao Ngo describes mechanics but did not publish a weaponized exploit.
EPSS scoreNot available in the provided search context; CVSS-only scoring overstates real-world reachability.
CISA KEVNot listed; no known exploited-in-wild flag as of 2026-11-03.
CVSS vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — scores 9.8, assuming unconditional unauthenticated RCE.
Affected versionsAll Advanced Custom Fields: Extended PRO versions up to and including 0.9.2.6.
Fixed versionNot clearly stated in advisory snippets; update to vendor patched release when listed (expected greater than 0.9.2.6).
Scanning/exposure dataNo GreyNoise/Shodan/Censys data in provided results; WordPress is high-volume but this is a paid PRO plugin, so Internet-exposed installation count is lower than core ACF.
Disclosure dateWordfence published 2026-09-14; NVD/CIRCL lists 2026-11-03.
Reporting researcher/orgTin Pham (TF1T), Trong Pham (dtro), Hao Ngo via Wordfence.

Sources.

  1. NVD
  2. CIRCL Vulnerability-Lookup
  3. VulDB
  4. Rapid7
  5. Wordfence Threat Intelligence
  6. Halo Security Threat Advisories
05 · The Call

Final Verdict
↓ DOWNGRADED to HIGH (8.0/10)

Why this verdict

  • Baseline: vendor severity is CRITICAL 9.8; the underlying call_user_func_array injection is real and unauthenticated.
  • Friction audit: Method 1 needs the non-default shortcode_preview setting enabled by an admin; Method 2 needs PHP openssl absent—both conditions shrink the exposed subset well below the full WordPress population; I apply one downgrade step from 9.8 to 8.0.
  • Impact when reached: the attacker can call wp_insert_user with controlled arguments to create an administrator account, then install a plugin to gain full PHP code execution; that is HIGH impact but conditional reach.
  • Role multiplier: typical deployment is a public-facing WordPress/LAMP host; worst plausible high-value role is a large WooCommerce/membership/intranet CMS where post-exploitation enables mass data egress but not domain/fleet/supply-chain takeover; not a canonical high-value-role component, so no CRITICAL floor.

Why not higher?

CRITICAL would require near-unconditional unauthenticated reach and/or canonical high-value role. Here both exploitation methods are conditional: shortcode_preview is not default and OpenSSL absence is uncommon; paid PRO plugin further narrows the installed base; no KEV/in-wild evidence.

Why not lower?

MEDIUM or LOW would treat random function-call code injection as a minor issue, but when conditions are met it yields instant unauthenticated admin creation and full site takeover. Public-facing WordPress sites are attractive and the default admin capability makes escalation reliable; so HIGH is the floor.

06 · Verification

Crowdsourced verification payload.

Run on the WordPress host (or any host with read access to the wp-content directory), as a user that can read plugin files. Invoke e.g. bash check_acfe_pro.sh /var/www/html for a typical Linux WordPress document root; no special privileges needed. The script outputs VULNERABLE, PATCHED, or UNKNOWN.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# Check if ACF Extended PRO plugin version is <= 0.9.2.6
set -euo pipefail
WP_ROOT="${1:-/var/www/html}"
PLUGIN_DIR="$WP_ROOT/wp-content/plugins/acf-extended-pro"
if [ ! -d "$PLUGIN_DIR" ]; then
  echo "UNKNOWN: plugin directory not found"
  exit 0
fi
VERSION=$(grep -Rhoi 'Version:[[:space:]]*[0-9][0-9.]*' "$PLUGIN_DIR" 2>/dev/null | head -1 | sed -E 's/[Vv]ersion:[[:space:]]*//')
if [ -z "$VERSION" ]; then
  echo "UNKNOWN: could not extract version"
  exit 0
fi
LATEST_BAD="0.9.2.6"
MAX=$(printf '%s\n' "$VERSION" "$LATEST_BAD" | sort -V | tail -1)
if [ "$MAX" = "$LATEST_BAD" ]; then
  echo "VULNERABLE: $VERSION"
  exit 1
else
  echo "PATCHED: $VERSION"
  exit 0
fi