I would like to clarify one important point regarding the discussion about Joomla 3 and the responsibility of website owners to keep their extensions updated.
SP Page Builder is marketed and sold as a paid drag-and-drop, no-code tool primarily aimed at designers and users who are not developers. A developer who prefers writing custom code may use Joomla core, a custom template, Bootstrap, or another framework without relying on a page builder at all.
Because this is a commercial product, customers reasonably expect security-sensitive functionality such as file uploads and archive extraction to have been properly reviewed and protected, regardless of whether they understand PHP or server administration.
The affected website is running SP Page Builder 4.0.1 on Joomla 3. The website owner is currently unable to perform an immediate component update because a complete redesign and migration to a newer Joomla version, including a transition to the YOOtheme Pro framework, is scheduled for next week.
The decision to replace the current framework and rebuild the website was made directly as a result of these repeated security incidents.
Also, as a non-technical customer, I would like to ask a very simple question:
Are you suggesting that customers are expected to read your support forum every day in order to remain informed about security issues and keep their websites safe?
Following that logic, which website owner realistically monitors the support forums of every installed component, plugin, module, template, and framework on a regular basis just to find out whether a new security issue has been disclosed?
Most customers use multiple third-party extensions. It is not realistic to expect them to manually monitor every vendor forum every day in order to remain secure, especially since your email warning arrived very late.
When a serious security issue affects a paid product, customers would reasonably expect a clear and timely security advisory, direct notification, release notice, dashboard warning, or another visible communication channel—not that they must regularly search through forum discussions to discover whether their installation may be vulnerable.
However, the forensic findings in this case are quite specific.
An unauthenticated request was sent to:
/index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
using a multipart upload field named:
custom_icon
The request was accepted and returned HTTP 200.
The uploaded archive was then written to the Joomla temporary directory and extracted into automatically generated folders such as:
/tmp/builderCustomIcon_*
The original SP Page Builder 4.0.1 controller loads the current Joomla user:
$user = Factory::getUser();
However, the uploadCustomIcon() method does not appear to verify whether the visitor is authenticated or authorised before accepting and processing the uploaded archive.
After extraction, the contents of the font directory are recursively copied toward:
/media/com_sppagebuilder/assets/iconfont/<fontFamily>/
using the structure supplied inside the uploaded archive.
The affected code does not appear to filter PHP files or other executable file types before recursively copying the extracted font directory.
The access log recorded repeated unauthenticated POST requests to the same endpoint, followed immediately by attempts from the same source to access newly uploaded PHP payloads inside generated:
iconfont/ico.../
paths.
Filesystem scans found numerous PHP payloads inside newly created:
/tmp/builderCustomIcon_*/fonts/
directories, including mixed-case PHP extensions such as:
.PHP
.pHp
.Php
Several of these files also matched direct request-execution and command-execution detection rules.
The behaviour was reproduced using a harmless ZIP archive containing only a text marker. No PHP code, shell, or executable payload was used.
The harmless archive was accepted through the same unauthenticated endpoint and processed by SP Page Builder.
As a temporary local mitigation for this legacy website, the uploadCustomIcon() method was modified to return HTTP 403 before accepting, writing, extracting, or copying any uploaded file.
Repeating the same harmless upload test then produced:
HTTP 403
{"status":false,"output":"Sorry, honey, I'm not into intimate relationships with you."}
The request was therefore rejected before the upload-processing code was reached:
No uploaded ZIP was written
No archive was extracted
No new builderCustomIcon_* directory was created by the request
No file was copied into iconfont
This modification is not presented as an official production patch. It is only a temporary local mitigation for a website that will be rebuilt and migrated next week.
I am not a professional PHP developer or security researcher, so perhaps I am misunderstanding the intended behaviour.
However, could someone explain why an unauthenticated visitor is able to reach an archive upload function in SP Page Builder 4.0.1, while the method appears to load the Joomla user object without enforcing authentication or authorisation before processing the uploaded archive?
The Joomla 3 end-of-life status explains why users should migrate and update.
It does not explain why an unauthenticated upload endpoint in a paid extension can accept and extract an archive containing executable files.