What is Joomla Content Editor (JCE)?
Joomla Content Editor (JCE) is the most widely installed third-party extension for the Joomla CMS, with millions of active installations across news portals, government websites, educational institutions, and e-commerce storefronts. It replaces Joomla's default TinyMCE editor with a richer WYSIWYG experience that includes a file manager, image editor, and media upload capabilities. Because JCE runs with Joomla's full filesystem and database access, and because compromising a Joomla site provides a server foothold as the web server user, it is a perennial target for automated exploitation campaigns.
Overview
CVE-2026-48907 is an improper access control vulnerability (CWE-284) in JCE's editor profile import handler. A handler that should be restricted to administrators can be reached by any unauthenticated visitor — including anonymous guests. The handler accepts a file upload but fails to enforce file extension restrictions, allowing a PHP webshell disguised with a double extension (.xml.php) to be written to the web-accessible filesystem. Exploitation requires only three HTTP requests and yields remote code execution as the web server user.
CISA added CVE-2026-48907 to the KEV catalog on June 16, 2026, the same week the PoC was published. The JCE vendor confirmed automated botnet exploitation: "attacks are automated and widespread." The flaw echoes CVE-2012-2902, a nearly identical JCE vulnerability from 2012 that compromised tens of thousands of Joomla sites.
Affected Versions
| Product | Vulnerable range | Fixed version |
|---|---|---|
| Joomla Content Editor (JCE) | 1.0.0 – 2.9.99.4 | 2.9.99.5+ (use 2.9.99.7 — skip 2.9.99.6) |
JCE 2.9.99.5 introduced the security fix. JCE 2.9.99.6 shipped a regression; Widget Factory recommends upgrading directly to 2.9.99.7. Older JCE branches (1.x, 2.x pre-2.9.99) are patched separately via the free security patch available at joomlacontenteditor.net.
Technical Details
The vulnerability chains three weaknesses in the profile import handler, reachable at:
POST /index.php?option=com_jce&task=profiles.import
Weakness 1 — Missing authorization: The handler validates the presence of a CSRF token but never checks whether the requesting user is an administrator or even logged in. Any visitor can obtain a valid CSRF token from any Joomla page (it is embedded in public-facing forms), satisfying the only access check.
Weakness 2 — File extension not validated: JCE uses File::makeSafe() to sanitize uploaded filenames, which strips special characters and null bytes but does not filter file extensions. A double-extension filename such as payload.xml.php passes the sanitizer intact — JCE treats the name as safe because .xml appears valid, while the server will execute it as PHP due to the trailing .php extension.
Weakness 3 — Upload safety explicitly disabled: The upload call passes $allow_unsafe = true:
File::upload($source, $destination, false, true);
This disables Joomla's built-in file type safety checks at the framework level, ensuring the PHP file is written unconditionally.
Three-request exploit chain (documented by YesWeHack/ywh-jfellus):
GET /— retrieve any Joomla page to extract a valid CSRF token from the HTMLPOST /index.php?option=com_jce&task=profiles.import— submit a multipart form with the CSRF token and the.xml.phpwebshell file; JCE writes it to a temporary or upload directory under the webrootGET /tmp/<uploaded-file>.xml.php?cmd=id— execute arbitrary OS commands as the web server user
The attack surface is any internet-facing Joomla site with JCE installed — no account, no brute force, no prior access required.
Discovery
The vulnerability was discovered and reported by YesWeHack researcher ywh-jfellus, who published a full technical write-up and proof-of-concept on June 10, 2026. Phil Taylor of mySites.guru independently contributed forensic analysis of compromised sites, identifying attacker IOCs and behavior patterns seen in the wild.
Widget Factory silently patched the issue in JCE 2.9.99.5 on June 3, 2026, before public disclosure. The advisory and free patch for older branches were published June 9.
Exploitation Context
Exploitation was underway before the public advisory was issued and accelerated after PoC release. The JCE vendor's advisory explicitly states: "attacks are automated" — botnets were scanning for and exploiting vulnerable JCE installs within days of the silent patch.
Phil Taylor's forensic analysis of compromised sites identified the following indicators of compromise:
- Rogue editor profiles named with the pattern
J[0-9]{6}(e.g.,J482931) in the#__wf_profilesdatabase table - Uploaded webshells with
.xml.phpextensions in/tmp/,/images/, and/media/directories - Marker file named
Nxploitedwritten to the webroot on successfully backdoored sites - Attacker IPs observed at time of disclosure:
107.149.130.5,92.38.150.143,45.153.129.241
Historical precedent underscores the scale of risk: CVE-2012-2902, a nearly identical JCE file upload flaw from 2012 with the same root cause (missing auth on the profiles endpoint), compromised tens of thousands of Joomla sites before being patched.
Remediation
- Upgrade JCE immediately: Update to Joomla Content Editor 2.9.99.7 (skip 2.9.99.6, which introduced a regression). In the Joomla Extensions Manager, JCE should appear with an available update.
- Apply the free security patch for older branches: If running a JCE version before 2.9.99, download the security patch from joomlacontenteditor.net/downloads/editor/security-patch/ and install it via the Joomla installer.
- Scan for rogue profiles: Query the Joomla database for editor profiles matching the pattern
J[0-9]{6}:
Delete any entries found and treat the site as compromised.SELECT * FROM #__wf_profiles WHERE title REGEXP '^J[0-9]{6}$'; - Search for uploaded webshells: Scan the site's
/tmp/,/images/,/media/, and upload directories for files with.xml.php,.php5,.phtml, or other PHP-executable extensions. Remove any found and rotate all credentials. - Hunt for the Nxploited marker: Check the webroot for a file named
Nxploited. Its presence confirms successful exploitation. - Review web server logs: Search for
POSTrequests toindex.php?option=com_jce&task=profiles.importfrom unexpected IP addresses and for subsequentGETrequests to uploaded.xml.phpfiles. - Restrict JCE profile management: If the attack surface cannot be patched immediately, consider disabling the JCE component via Joomla's Extensions Manager (Extensions → Manage → Disable) until patching is complete.
Key Details
| Property | Value |
|---|---|
| CVE ID | CVE-2026-48907 |
| Vendor / Product | Widget Factory — Joomla Content Editor |
| NVD Published | 2026-06-05 |
| NVD Last Modified | 2026-06-17 |
| CVSS 3.1 Score | 9.8 |
| CVSS 3.1 Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Severity | CRITICAL |
| CWE | CWE-284 find similar ↗ |
| CISA KEV Added | 2026-06-16 |
| CISA KEV Deadline | 2026-06-19 |
| Known Ransomware Use | No |
CVSS 3.1 Breakdown
Required Action
Timeline
| Date | Event |
|---|---|
| 2026-06-03 | Widget Factory releases JCE 2.9.99.5 with silent security fix |
| 2026-06-05 | CVE-2026-48907 published; active exploitation already underway |
| 2026-06-09 | Widget Factory publishes security advisory and free patch for older branches |
| 2026-06-10 | YesWeHack (ywh-jfellus) publishes full technical write-up and PoC |
| 2026-06-15 | Widget Factory releases JCE 2.9.99.7 (2.9.99.6 contained a regression) |
| 2026-06-16 | Added to CISA Known Exploited Vulnerabilities catalog |
| 2026-06-19 | CISA BOD 26-04 remediation deadline |
References
| Resource | Type |
|---|---|
| JCE Security Update and Free Patch for Older Sites | Vendor Advisory |
| Joomla Content Editor Changelog | Vendor Advisory |
| YesWeHack — RCE in Joomla Content Editor Extension | Security Research |
| mySites.guru — JCE Hack Forensic Analysis | Security Research |
| GitHub — CVE-2026-48907 PoC (ywh-jfellus) | Security Research |
| NVD — CVE-2026-48907 | Vulnerability Database |
| CISA KEV Catalog Entry | US Government |