“I have checked Page Builder 4 authentication about custom icon and no problem found.”
To remove any possible ambiguity regarding the version, installation state, source file, or local modifications, I am now providing the exact original SP Page Builder Pro 4.0.1 installation package, together with the controller extracted directly from that package.
Original vendor files
Complete original SP Page Builder Pro 4.0.1 package:
[cloud.8core.eu/index.php/s/9HXiBeB9Qgr7Rsx](http://)
SHA-256:
3d853960a93a763c270e191c512f5383d8bfab877e9d0384df8807e582b36160
Original controller extracted from the package:
https://cloud.8core.eu/index.php/s/7NQPGsKeZZ57Hnn
SHA-256:
ad82fdc4bb03fc8e40d1e5cac1d8e34067bf16142a1e6d08cd02b0637326450f
The SHA-256 hash of the separately provided controller is identical to the hash of:
site/controllers/asset.php
inside the original 4.0.1 installation ZIP.
The package manifest identifies the version as:
<version>4.0.1</version>
Therefore, this is not a controller reconstructed from an infected website, modified by a customer, or taken from an unknown source. It is the controller distributed inside the original JoomShaper SP Page Builder Pro 4.0.1 package.
After installation, its Joomla path is:
/components/com_sppagebuilder/controllers/asset.php
Customer download availability
At the time of writing, this exact SP Page Builder 4.0.1 package remains available in my JoomShaper customer download area without a visible security warning beside the download.
Screenshot of the customer download area:

If this package is considered secure, please identify the authentication protection in the original controller.
If it is not considered secure, please explain why it remains downloadable without a prominent warning, a replacement patch, or clear information about the affected endpoint.
Relevant original code
The original uploadCustomIcon() method begins as follows:
public function uploadCustomIcon()
{
$model = $this->getModel();
// Get file form input
$input = Factory::getApplication()->input;
$user = Factory::getUser();
$customIcon = $input->files->get('custom_icon', null);
// Tmp path
$tmp_path = Factory::getConfig()->get('tmp_path');
// Root path
$rootPath = JPATH_ROOT . '/media/com_sppagebuilder/assets/iconfont/';
$rootUrl = 'media/com_sppagebuilder/assets/iconfont/';
$report = array();
The current Joomla user is loaded:
$user = Factory::getUser();
However, the $user variable is not subsequently used to reject a guest, verify an authenticated session, or check whether the user is authorised to upload custom icons.
Before the uploaded archive is accepted, I cannot find checks equivalent to:
$user->guest
$user->authorise(...)
Factory::getApplication()->getIdentity()->authorise(...)
Session::checkToken(...)
The method instead obtains the uploaded file directly:
$customIcon = $input->files->get('custom_icon', null);
It then writes the uploaded archive into the Joomla temporary directory:
$zip_file = $tmp_path . '/builderCustomIcon.zip';
if (File::upload($tmp_src, $zip_file, false, true))
{
$extract = $this->unpack($zip_file);
The unpack() function creates an automatically generated extraction directory:
$tmpdir = uniqid('builderCustomIcon_');
$extractdir = Path::clean(
dirname($packageFilename) . '/' . $tmpdir
);
$archive = new Archive([
'tmp_path' => Factory::getConfig()->get('tmp_path')
]);
$extract = $archive->extract(
$archivename,
$extractdir
);
This produces directories in the form:
builderCustomIcon_*
For a custom font package, the code then recursively copies the extracted font directory into a publicly accessible location:
Folder::copy(
$extract_path . '/' . $font_path,
$rootPath . '/' . $fontFamily . '/' . $font_path
);
The resulting destination is:
/media/com_sppagebuilder/assets/iconfont/<fontFamily>/<font_path>/
I cannot find any filtering in this method that rejects PHP files, mixed-case PHP extensions, .phtml, .pht, .htaccess, or other potentially executable files before the complete extracted font directory is recursively copied.
The specific question
Please identify the exact line in the original SP Page Builder Pro 4.0.1 controller that prevents an unauthenticated visitor from reaching this archive-upload and extraction process.
Loading the user object is not an authentication check:
$user = Factory::getUser();
The code must actually evaluate the user, session, permission, or authorised action and reject the request before processing the uploaded file.
Please quote the exact code responsible for that rejection.
Reproduced behaviour
On the affected installation, an unauthenticated multipart request to:
/index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
using the field:
custom_icon
was accepted.
The archive was written and extracted into:
/tmp/builderCustomIcon_*
The behaviour was separately reproduced with a harmless ZIP package containing only valid custom-icon metadata and a plain text marker.
No PHP code, shell, command-execution payload, or destructive content was used in the verification archive.
The harmless archive was accepted and processed through the same endpoint.
Temporary local mitigation
Because this legacy website is scheduled for migration, we temporarily hard-disabled the endpoint before any uploaded file could be accepted, written, extracted, or copied.
Locally modified controller:
SHA-256:
f0d3aefea2de379148be1f437a618e9f99cd56082ecbc73994cbafc1f98c61bf
The only functional addition is at the beginning of uploadCustomIcon():
public function uploadCustomIcon()
{
/*
- 8Core controlled lab response:
- reject every custom icon upload before any file is accepted,
- written to tmp, unpacked or copied to iconfont.
*/
http_response_code(403);
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'status' => false,
'output' => "Sorry, honey, I'm not into intimate relationships with you."
], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
die();
$model = $this->getModel();
After applying this local hard block, the same harmless request returned:
HTTP 403 Forbidden
and no new archive, extraction directory, or copied iconfont file was created.
This is not presented as an official patch or complete production solution. It is simply a temporary endpoint disablement demonstrating that the request reaches uploadCustomIcon() and that rejecting it before the upload-processing code prevents the observed filesystem activity.
Conflicting version information
Your support thread states that the issue was fixed in SP Page Builder 6.6.2.
The same discussion later states that the shared replacement file applies only to:
SP Page Builder 5.x – 6.6.1
and explicitly says it is not intended for:
SP Page Builder 4.x or 3.x
This leaves a very direct question:
SP Page Builder 4.0.1 → 4.x → 5.x → 6.0.x → 6.5.x → 6.6.1 → FIXED IN 6.6.2?!
Which exact versions were vulnerable, and what specifically protects the original unmodified SP Page Builder 4.0.1 controller?
Requested clarification
Please provide precise answers to the following:
Which exact SP Page Builder 4 version and build did you test?
Was your test performed on a pristine original package or on an installation containing a later security modification?
Which exact line in the original 4.0.1 uploadCustomIcon() method rejects an unauthenticated visitor?
Which SP Page Builder versions are affected by this upload issue?
In which exact version was the authentication or authorisation check first introduced?
Is SP Page Builder Pro 4.0.1 considered affected or unaffected?
If it is affected, why is the package still available in the customer download archive without a visible security warning?
Will JoomShaper add an explicit warning or remove the unsafe package from customer downloads?
Is there an official patch specifically tested and supported for SP Page Builder 4.0.1?
I am not requesting another general link to a blog post.
I am requesting a code-level explanation concerning the exact original vendor package, exact version, exact controller file, and exact method being discussed.
The complete package and both controller versions are available above so that your development or security team can reproduce the comparison directly.
Best regards,
Tomislav Galić