This is a lock-pick hidden behind the receptionist desk, not a brick through the front window
CVE-2026-34885 is an authenticated SQL injection in the WordPress media-library-assistant plugin by David Lingren. Authoritative records say versions through 3.34 are affected and 3.35 is the fix. WordPress' own changelog ties the fix to the [mla_custom_list] shortcode, which matters because exploitation is not generic internet spray-and-pray against any WordPress site; it depends on this plugin, this vulnerable version range, and a user who can already act as at least a Contributor.
The vendor HIGH 8.5 score overstates enterprise urgency because CVSS treats PR:L as a small tax, while in the real world Contributor means a valid authenticated foothold, stolen session, or open registration path. That is downward pressure. It stays *meaningful* because SQLi against a live WordPress database can still expose user data and content metadata, and the plugin has a non-trivial install base, but this is not the same operational problem as unauthenticated WordPress RCE.
4 steps from start to impact.
Find a site actually running the plugin
media-library-assistant, typically with WPScan or passive fingerprinting of plugin assets and metadata. The challenge is that exact vulnerable-version fingerprinting is weak from the internet unless the site leaks plugin paths, readmes, or other version clues.- Target is a WordPress site
- The
media-library-assistantplugin is installed - The site exposes enough artifacts to fingerprint the plugin or version
- Many sites block readme and plugin asset enumeration
- Internet-wide search engines are poor at exact WordPress plugin version detection
- Only versions
<= 3.34are affected
Get a Contributor foothold
- Attacker has valid WordPress credentials or a hijacked session
- Account has
Contributorprivileges or higher
- Many enterprise WordPress sites do not allow public contributor registration
- SSO, MFA, and admin approval workflows suppress opportunistic abuse
- This prerequisite already implies a prior identity compromise stage
Plant a malicious shortcode payload
3.35 fixed SQLi in [mla_custom_list], and third-party research points to unsafely concatenated shortcode parameters driving the SQL query.- Contributor can create or edit content that accepts the shortcode
- The shortcode path is enabled and rendered by the site
- Not every site uses the vulnerable shortcode at all
- Block editor, sanitization plugins, or editorial review may prevent publication/rendering
- Some attacks may only execute when the page or draft preview is rendered
wp_posts, revisions, and editorial audit logs; WAFs may miss this because the payload can live inside authenticated CMS content rather than a noisy public request.Exploit the database and pull data
- Injected SQL reaches the backend query intact
- The database account has access to the targeted tables
- Least-privilege DB users and hardened SQL logging reduce blast radius
- Response-based exfiltration can be noisy and slower than straight RCE
- This is still scoped to one site/database, not an automatic host takeover
Contributor and higher roles, stale accounts, open registration, and non-SSO local users. For a MEDIUM verdict there is no mitigation SLA, so use this as immediate exposure reduction while you patch within the 365-day remediation window.- A perimeter network scanner alone does not solve this; plugin presence and exact vulnerable version are application-level facts, not reliable port-scan findings.
- Host EDR is not the main stop here because the exploit path is normal PHP/MySQL application behavior, not obvious malware execution.
- Relying on
Contributorbeing 'low privilege' is false comfort; for this CVE, that role is *the* exploit prerequisite.
The supporting signals.
| In-the-wild status | No confirmed exploitation evidence in the sources reviewed. OpenCVE shows CISA ADP Exploitation: none, Automatable: no, Technical Impact: partial. |
|---|---|
| Proof-of-concept availability | I found no public PoC repo for this CVE. Feedly's aggregation explicitly says there is no evidence of a public proof-of-concept or proof of exploitation. |
| EPSS | EPSS is time-variant. Your prompt supplied 0.08063 (8.063%); the GitHub Advisory currently shows 6.103% (91st percentile), and Feedly recorded 5.71% (90.4th percentile) on 2026-04-12. |
| KEV status | Not listed in CISA KEV as checked against the KEV catalog. No KEV add date exists. |
| CVSS vector reality check | AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:L sounds scary until you unpack PR:L: this is not unauthenticated internet RCE; it starts with an authenticated WordPress Contributor foothold. |
| Affected versions | Patchstack/OpenCVE/GitHub all align on Media Library Assistant <= 3.34. |
| Fixed version | 3.35 or later. WordPress.org changelog for 3.35 says the [mla_custom_list] shortcode SQL injection risk was mitigated. I found no distro/backport packaging context; this is a straight plugin upgrade story. |
| Exposure / population | WordPress.org and WPScan show roughly 70,000 active installs. That is real population, but exact internet-exposed vulnerable counts are hard to measure because Shodan/Censys-style fingerprinting is weak for plugin versioning. |
| Disclosure timeline | Reserved 2026-03-31; published 2026-04-06. Patchstack lists report date 2026-02-27 and publication 2026-04-06. |
| Reporting researcher | Sajjad Haqi via the Patchstack Bug Bounty Program. |
Sources.
Why this verdict
- Down from vendor HIGH because attacker position is post-auth:
PR:Lhere means a *real WordPress Contributor foothold*, not a trivial network touch. That implies prior credential theft, session hijack, open registration, or insider access. - Down again because reachable population is narrower than CVSS implies: the target must run this specific plugin at
<= 3.34, and the vulnerable shortcode path must be usable in that deployment. Even with ~70k installs, that is a much smaller exposed set than generic WordPress internet surface. - Not low because SQLi against a CMS database still matters: successful exploitation can expose user records, password hashes, media metadata, and business content. On multi-author public sites, a single compromised editor-tier account can still turn into meaningful data theft.
Why not higher?
This is not unauthenticated, and there is no verified in-the-wild exploitation or public weaponized PoC in the sources reviewed. The attack chain also depends on a content-authoring workflow and a vulnerable plugin-specific shortcode path, which is materially less universal than the vendor CVSS suggests.
Why not lower?
You should not shrug off authenticated SQLi in a public-facing CMS plugin with a ~70k-install footprint. Once the Contributor prerequisite is met, exploitation is technically straightforward and the confidentiality impact against the WordPress database is real.
Crowdsourced verification payload.
Run this on the target WordPress host or against a mounted copy of the web root. Invoke it as bash check_mla_cve_2026_34885.sh /var/www/html; it needs read access to the WordPress files, and if wp-cli is available it may need the same OS user that normally manages the site.
#!/usr/bin/env bash
# check_mla_cve_2026_34885.sh
# Detect Media Library Assistant vulnerable to CVE-2026-34885
# Outputs one of: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 1=VULNERABLE, 0=PATCHED, 2=UNKNOWN
set -u
WP_ROOT="${1:-/var/www/html}"
PLUGIN_SLUG="media-library-assistant"
FIXED_VERSION="3.35"
PLUGIN_DIR="$WP_ROOT/wp-content/plugins/$PLUGIN_SLUG"
PLUGIN_MAIN="$PLUGIN_DIR/media-library-assistant.php"
README_TXT="$PLUGIN_DIR/readme.txt"
version_lt() {
# returns 0 if $1 < $2
[ "$1" != "$2" ] && [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n1)" = "$1" ]
}
get_version_wpcli() {
if command -v wp >/dev/null 2>&1 && [ -f "$WP_ROOT/wp-config.php" ]; then
wp --path="$WP_ROOT" plugin get "$PLUGIN_SLUG" --field=version 2>/dev/null || true
fi
}
get_version_file() {
if [ -f "$PLUGIN_MAIN" ]; then
awk -F': ' '/^[Vv]ersion:/ {print $2; exit}' "$PLUGIN_MAIN" 2>/dev/null | tr -d '\r'
return 0
fi
if [ -f "$README_TXT" ]; then
awk -F': ' '/^[Ss]table tag:/ {print $2; exit}' "$README_TXT" 2>/dev/null | tr -d '\r'
return 0
fi
return 1
}
if [ ! -d "$PLUGIN_DIR" ]; then
echo "UNKNOWN - plugin directory not found: $PLUGIN_DIR"
echo "UNKNOWN"
exit 2
fi
VERSION="$(get_version_wpcli)"
if [ -z "$VERSION" ]; then
VERSION="$(get_version_file)"
fi
if [ -z "$VERSION" ]; then
echo "UNKNOWN - could not determine installed version for $PLUGIN_SLUG"
echo "UNKNOWN"
exit 2
fi
if version_lt "$VERSION" "$FIXED_VERSION"; then
echo "Detected $PLUGIN_SLUG version: $VERSION (fixed in $FIXED_VERSION)"
echo "VULNERABLE"
exit 1
fi
echo "Detected $PLUGIN_SLUG version: $VERSION (fixed in $FIXED_VERSION)"
echo "PATCHED"
exit 0